PDA

Ver la Versión Completa : Problema usando el objeto TStrings


metalfox6383
15-10-2010, 20:08:18
Hola:

Tengo este código:

procedure Tfr_principal.lb_buscarClick(Sender: TObject);
var vr_tags: TStrings;
begin

vr_tags.Append('texto');

end;

Quiero utilizar el objeto TStrings para crear una lista de textos, pero al intentar crear el primer elemento de la lista, me aparece este error:

http://mpo9qg.bay.livefilestore.com/y1pdGrBUjOeDBe_zqohKiSfF2m1QqedPyLRvj2HGpoTOe449wBpPab8HtC_vSuN6cYY_9xSB_lTq52PwmLCM1DQslIn4fVrgRfJ/asd.jpg?psid=1

¿qué es lo que anda mal?

Gracias.

ecfisa
15-10-2010, 20:37:17
Hola.

Antes de utilizar vr_tags tenés que crear una instancia de la clase.
Como TStrings es abstracta debés usar un descendiente en la creación, por ejemplo TStringList.


procedure Tfr_principal.lb_buscarClick(Sender: TObject);
var vr_tags: TStrings;
begin
vr_tags:= TStringList.Create; // línea que faltaba
vr_tags.Append('texto');
end;


En algún punto, luego que termines de usar vr_tags, deberias liberar el recurso con:

vr_tags.Free;


Saludos. :)

duilioisola
15-10-2010, 20:38:50
Primero tienes que crear el objeto, para despues utilizarlo:


var vr_tags: TStrings;
begin
vr_tags := TStringsList.Create;
try
vr_tags.Add('Texto');
{hacer lo que sea}
finally
vr_tags.Free;
end;
end;


No debes olvidar liberar el objeto después de finalizar con su uso.

metalfox6383
15-10-2010, 21:58:03
Muchas gracias. Ha funcionado. Una interrogante más: ¿Qué sucedería si no la libero?

Caral
15-10-2010, 22:05:56
Hola
Si no la liberas y vuelves a llamar al evento dirá que el TStrings ya esta creado y no lo puede volver a crear dando error.
Si no me equivoco.
Saludos

ecfisa
15-10-2010, 22:07:07
Muchas gracias. Ha funcionado. Una interrogante más: ¿Qué sucedería si no la libero?

Además de lo dicho por el amigo Caral, en el mejor de los casos la consecuencia es memoria ocupada inútilmente,
degradación de la perfomance y hasta fallos por falta de memoria.

En un ejemplo como ese, realmente no es apreciable la memoria ocupada. Pero es importante tomár como práctica
la liberación de los recursos utilizados; por que la memoria, aunque hoy es abundante, sigue siendo finita... ;)


Saludos. :)

ecfisa
15-10-2010, 22:21:46
Hola de nuevo metalfox.

Mirá este link (http://www.clubdelphi.com/foros/showthread.php?t=65287) del foro en que se explica el tema que te ocupa.


Saludos. :)

ecfisa
15-10-2010, 22:39:35
Hola.

Por si quedara alguna duda te pongo un ejemplo con el que podés comprobar el efecto de no liberar recursos:

procedure TForm1.Button1Click(Sender: TObject);
var
vr_tags: TStrings;
i: Integer;
Mem: TMemoryStatus;
begin
Mem.dwLength := SizeOf(Mem);
GlobalMemoryStatus(Mem);
Caption:= Format('Memoria virtual disponible: %d', [Mem.dwAvailVirtual]);
for i:= 1 to 1000000 do
begin
vr_tags:= TStringList.Create; // línea que faltaba
vr_tags.Append('texto');
end;
end;


Dale unos cuantos clicks al botón y me contas... ;)

Saludos. :)

Caral
15-10-2010, 22:58:01
Hola
Bien:
Entonces suponemos que free libera la memoria, no?.
Siguiendo tu ejemplo, que pasa aqui amigo?:

var
Form1: TForm1;
vr_tags: TStrings;
i: Integer;
Mem: TMemoryStatus;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Mem.dwLength := SizeOf(Mem);
GlobalMemoryStatus(Mem);
Caption:= Format('Memoria virtual disponible: %d', [Mem.dwAvailVirtual]);
for i:= 1 to 1000000 do
begin
vr_tags:= TStringList.Create; // línea que faltaba
vr_tags.Append('texto');
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
vr_tags.Free;
Mem.dwLength := SizeOf(Mem);
GlobalMemoryStatus(Mem);
Caption:= Format('Memoria virtual disponible: %d', [Mem.dwAvailVirtual]);

end;

Que hago mal?
Saludos

ecfisa
16-10-2010, 02:30:27
Hola mi amigo.

No estás haciendo nada mál, lo que sucede que la intención del código que puse de ejemplo es precisamente
forzar un error por falta de liberación de recursos. Es decir que nada correcto saldrá si nos basamos en ese código.

Ahora si me limito al código que adjuntaste, el problema es que en Button1Click se crean un millon de instancias de
TStrings y en Button2Click sólo se puede liberar una.

Saludos. :)