Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Buenas prácticas 3 (array de TStrings) (https://www.clubdelphi.com/foros/showthread.php?t=62050)

elcigarra 02-12-2008 16:57:28

Buenas prácticas 3 (array de TStrings)
 
Hola amigos

Siguiendo con la zaga sobre la liberación de memoria y las buenas prácticas de programación me encuentro con el siguiente entuerto.

El usuario en una de mis aplicaciones entra strings en un TMemo
yo tengo que desglosar por Strings y a cada una de ellas disgregarlas en parámetros internos del String.

O sea que al final debo trabajar con una lista INDETERMINADA (tantas como lineas en el TMEMO) de listas indeterminadas (tantos como parámetros en cada string del TMemo) de Strings (parámetro).

Para que se hagan una idea simplificada, el usuario entraría algo así en el memo1:

'Par1 Par2 par3'
'Par4 Par5 par6 par7 par8'
'par1 par9'

Yo lo que necesito es tener un array con estos textos por lo que me hice (aunque funciona perfecto no sé si está bien hacerlo) un "array de TStrings"

El código obviamente muy simplificado (y en su última linea mi pregunta) quedaría así:
Código Delphi [-]
procedure Lio_de_listas;
var
  miArray: array of TStrings;
  miLista: TStrings;
begin
  miLista := TStringList.Create;
  SetLength(miArray,2);
  
  miLista.Clear;
  miLista.Add('primer_texto de uno');
  miLista.Add('segundo_texto de uno');
  miarray[0] := miLista;
  miLista.Clear;
  miLista.Add('primer_texto de dos');
  miLista.Add('segundo_texto de dos');
  miLista.Add('segundo_texto de dos');
  miarray[1] := miLista;
  
  MiLista.Free;
// pero ahora como libero el array ?????
end;
eso... como libero el array? ... si es que debo hacerlo

maeyanes 02-12-2008 17:17:28

Hola...

Yo te aconsejaría una lista de TStrings:

Código Delphi [-]
// Puede ser un campo de la forma o clase
var
  StringLists: TList;

var
  I: Integer;
  Strings: TStringList;

begin
  // Si no hemos creado la lista lo hacemos:
  if not Assigned(StringLists) then
    StringLists := TList.Create;
  for I := 0 to Pred(Memo1.Lines.Count) do
  begin
    Strings := TStringList.Create;
    // Aquí se hace el desglose de parámetros de la línea actual de Memo1
    StringLists.Add(Strings)
  end
end;

Ya con esto cuando quieras acceder a uno de los StringLists solo tienes que hacer algo como:

Código Delphi [-]
ShowMessage(TStringList(StringLists[0])[0])

Y al destruir la forma o clase que contiene a StringLists haces:

Código Delphi [-]
// Si se creo la lista la destruimos, pero antes liberamos los TStringList
if Assigned(StringLists) then
begin
  for I := 0 to Pred(StringLists.Count) do
    TStringList(StringLists[i]).Free;
  StringLists.Clear;
  StringLists.Free
end;


Saludos...

elcigarra 02-12-2008 17:34:40

Gracias, probaré así

Caro 02-12-2008 17:45:08

Hola, también puedes utilizar un TObjectList.

Código Delphi [-]
 Lista : TObjectList;
 
 
var
  I: Integer;
  Strings: TStringList;

begin
  // Si no hemos creado la lista lo hacemos:
  if not Assigned(Lista) then
    Lista := TObjectList.Create;

  for I := 0 to Pred(Memo1.Lines.Count) do
  begin
    Strings := TStringList.Create;
    // Aquí se hace el desglose de parámetros de la línea actual de Memo1
    Lista.Add(Strings)
  end

 //y para liberar es suficiente que hagas:
 Lista.Free;

Saluditos

Caro 02-12-2008 17:50:43

Se me ha ido, para acceder haces:

Código Delphi [-]
 ShowMessage(TStringList(Lista.Items[0])[0]);

y debes añadir la unit Contnrs

Saluditos

Northern 02-12-2008 18:25:10

Para liberar un array dinámico puedes hacer:
1. miArray := nil
2. SetLength(miArray, 0);


Saludos

maeyanes 02-12-2008 18:25:18

Hola...

Caro, para que tu solución funcione como debe ser, es necesario que luego de crear la lista de objetos hagas:

Código Delphi [-]
StringLists.OwnsObjects := True

De esta forma al hacer StringLists.Free la lista libera automáticamente los objetos que contiene...


Saludos...

roman 02-12-2008 18:36:25

Cita:

Empezado por maeyanes (Mensaje 329176)
Caro, para que tu solución funcione como debe ser, es necesario que luego de crear la lista de objetos hagas:

Código Delphi [-]
StringLists.OwnsObjects := True

De hecho, no es necesario, al menos así lo dice la ayuda de Delphi:

Cita:

If no parameter is specified, or if the constructor is called with AOwnsObjects set to true, the new TObjectList is initialized with OwnsObjects set to true
// Saludos

maeyanes 02-12-2008 18:41:13

Hola...

Vaya, es algo que no me había fijado. Siempre pensé que el constructor de TObjectList era sin parámetros.



Saludos...

rastafarey 03-12-2008 14:12:46

Resp
 
Para liberlo usa este

FreeAndNil(Variable);

Kipow 03-12-2008 14:36:40

Si tenes delphi 2009 podes hecharle un ojo a los Generics.


La franja horaria es GMT +2. Ahora son las 02:37:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi