Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema usando el objeto TStrings (https://www.clubdelphi.com/foros/showthread.php?t=70347)

metalfox6383 15-10-2010 20:08:18

Problema usando el objeto TStrings
 
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/...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.

Código Delphi [-]
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:
Código Delphi [-]
  vr_tags.Free;

Saludos. :)

duilioisola 15-10-2010 20:38:50

Primero tienes que crear el objeto, para despues utilizarlo:

Código Delphi [-]
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

Cita:

Empezado por metalfox6383 (Mensaje 379436)
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 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:
Código Delphi [-]
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?:
Código Delphi [-]
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. :)


La franja horaria es GMT +2. Ahora son las 04:23:58.

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