Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-12-2008
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 02-12-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
Responder Con Cita
  #3  
Antiguo 02-12-2008
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 19
elcigarra Va por buen camino
Gracias, probaré así
Responder Con Cita
  #4  
Antiguo 02-12-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 02-12-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Se me ha ido, para acceder haces:

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

y debes añadir la unit Contnrs

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #6  
Antiguo 02-12-2008
Northern Northern is offline
Miembro
 
Registrado: ene 2006
Posts: 211
Poder: 19
Northern Va por buen camino
Para liberar un array dinámico puedes hacer:
1. miArray := nil
2. SetLength(miArray, 0);


Saludos
Responder Con Cita
  #7  
Antiguo 02-12-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
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...
Responder Con Cita
  #8  
Antiguo 02-12-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por maeyanes Ver Mensaje
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
Responder Con Cita
  #9  
Antiguo 02-12-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 23
maeyanes Va por buen camino
Hola...

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



Saludos...
Responder Con Cita
  #10  
Antiguo 03-12-2008
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Para liberlo usa este

FreeAndNil(Variable);
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #11  
Antiguo 03-12-2008
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 18
Kipow Va por buen camino
Si tenes delphi 2009 podes hecharle un ojo a los Generics.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
más buenas prácticas de programación elcigarra OOP 52 14-11-2008 15:16:41
Buenas prácticas de programación elcigarra OOP 18 07-11-2008 18:05:27
Siete prácticas para un óptimo y rápido desarrollo de software poliburro Noticias 5 30-07-2008 17:48:55
TStrings dvlt Varios 7 15-04-2008 16:36:37
Ayuda Practicas En Delphi MARIAM23 Varios 1 22-07-2006 02:19:34


La franja horaria es GMT +2. Ahora son las 11:05:03.


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
Copyright 1996-2007 Club Delphi