Pregunta

Tengo problemas para agregar cadenas a una lista de tstring. Busqué otras publicaciones pero no pude encontrar una respuesta a esto.

Lo que estoy tratando de hacer es agregar una gran cantidad de cadenas a una lista de tstring (más de 14000), pero en algún lugar del proceso obtengo una variñal. Aquí está el código que estoy usando:

procedure TForm1.FormCreate(Sender: TObject);
begin
    List := TStringList.Create;
    List.Duplicates := dupAccept;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
    List.Clear;
    List.Add('125-AMPLE');
    List.Add('TCUMSON');
    List.Add('ATLV 4300');
    List.Add('150T-15');
    List.Add('TDL-08ZE');
    List.Add('RT20L');
    List.Add('SIN LINEA');
    List.Add('TIARA');
    List.Add('FL200ZK1');
    List.Add('FL250ZK1');
    List.Add('SIN LINEA');
    List.Add('CENTAURO-70 S.P.');
    List.Add('CORSADO');

{ This list continues to about 14000 strings...}

    List.Add('VOSJOD 2');
    List.Add('Z 125');
    List.Add('ZUMY');
    List.Add('NEW AGE 125');
    List.Add('SIN LINEA');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    FreeAndNil(List);
end;

¿Qué pasa con este código? La lista contiene cadenas duplicadas, así que configuré el Duplicates propiedad de dupAccept. Pude cargar la lista usando LoadFromFile, pero no quiero tener un archivo de texto fuera de mi aplicación.

¡¡¡Espero que puedas ayudarme!!! Por favor, dígame si necesita más información.

Muchísimas gracias. Realmente aprecio tu ayuda.

¿Fue útil?

Solución

Las sugerencias para usar un archivo externo están en la marca aquí. Sin embargo, su publicación indica su deseo de no tener un archivo externo. Luego sugeriría que vincule el archivo al ejecutable como recurso. Puede hacerlo fácilmente siguiendo estos pasos:

Coloque todas las cadenas en un archivo de texto llamado StringData.txt (o cualquier nombre que elija). Luego cree un archivo .rc de cualquier nombre que elija y coloque lo siguiente (String_Data puede ser cualquier identificador que elija):

STRING_DATA RCDATA "stringdata.txt"

Cree un archivo .RES desde el .rc:

BRCC32 <name of rc>.rc

Ahora haga referencia a este archivo del código fuente. Coloque el siguiente lugar en la unidad:

{$R <name of res>.res}

En lugar de cargar desde una secuencia de archivo, cargue desde una secuencia de recursos:

StringData := TResourceStream.Create(HInstance, 'STRING_DATA', RT_RCDATA);
try
  List.LoadFromStream(StringData);
finally
  StringData.Free;
end;

Si realiza compilaciones automatizadas de línea de comandos, le sugiero que mantenga el archivo .rc bajo el control de origen y cree los .res durante el proceso de compilación. De esta manera, también puede mantener el archivo stringdata.txt bajo el control de origen y cualquier edición se captura automáticamente en la siguiente compilación sin tener que construir explícitamente el archivo .res cada vez que cambia el archivo .txt.

Otros consejos

¿Qué versión de Delphi estás usando? Algunas versiones anteriores tenían un error en el administrador de memoria que puede causar una violación de acceso al tratar de reasignar una matriz a un tamaño demasiado grande.

Intenta agregar Fast MMM4 a su proyecto para reemplazar al antiguo administrador de memoria y ver si eso ayuda.

Además, probablemente sea mejor que mantenga la lista en un archivo externo. Sí, es otro archivo, pero también significa que puede cambiar la lista sin tener que recompilar todo el programa. Esto también facilita la creación (¡y distribución!)

Mason probablemente sea adecuado para la causa del AV; Esta es una matriz bastante grande para crecer.
En una nota al margen, al realizar un procesamiento tan largo en una lista de cadenas, se recomienda rodearlo por BeginUpdate/Endupdate para evitar disparar cualquier evento de actualización.
Incluso si no tiene ninguno ahora, podrían agregarse más tarde y obtendrá problemas.

Establezca lista. Capacidad a la cantidad de elementos que planea agregar, inmediatamente después de crear la lista. Alternativamente, coloque la lista en un archivo RC (nombrado que no sea con el nombre de su proyecto) y agréguela a su proyecto. Esto se compila en su aplicación, pero no implica código ejecutable para crear la lista.

También me preocuparía por la integridad del compilador con un procedimiento de 14,000 líneas. La gente ha encontrado otros casos en los que ir más allá de cualquier cosa razonable rompe el compilador de varias maneras.

También es posible que desee probar ThashedStringList, podría ver un impulso de velocidad (aunque no en esta función), aunque no estoy seguro de si el método ADD es muy diferente.

Intente usar lo siguiente en lugar de su código para agregar las cadenas a StringList

varilla
Str: cadena;
empezar
Str: = '125-muestra' + #13 #10;
Str: = str + 'tcumson' + #13 #10;
Str: = str + 'atlv 4300' + #13 #10;
Str: = str + '150t-15' + #13 #10;
................

List.text: = str;

final;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top