Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-10-2010
metalfox6383 metalfox6383 is offline
Miembro
 
Registrado: jul 2005
Posts: 97
Poder: 19
metalfox6383 Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 15-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 15-10-2010 a las 20:43:21.
Responder Con Cita
  #3  
Antiguo 15-10-2010
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
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.
Responder Con Cita
  #4  
Antiguo 15-10-2010
metalfox6383 metalfox6383 is offline
Miembro
 
Registrado: jul 2005
Posts: 97
Poder: 19
metalfox6383 Va por buen camino
Muchas gracias. Ha funcionado. Una interrogante más: ¿Qué sucedería si no la libero?
Responder Con Cita
  #5  
Antiguo 15-10-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #6  
Antiguo 15-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por metalfox6383 Ver Mensaje
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.

Última edición por ecfisa fecha: 15-10-2010 a las 22:25:39.
Responder Con Cita
  #7  
Antiguo 15-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo metalfox.

Mirá este link del foro en que se explica el tema que te ocupa.


Saludos.
Responder Con Cita
  #8  
Antiguo 15-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
Responder Con Cita
  #9  
Antiguo 15-10-2010
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
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
__________________
Siempre Novato
Responder Con Cita
  #10  
Antiguo 16-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 16-10-2010 a las 02:39:08.
Responder Con Cita
Respuesta



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
Problema de objeto que hereda de Timage astwin OOP 3 29-08-2010 19:21:22
Problema con aplicacion usando BDE yorgelis Conexión con bases de datos 14 09-04-2009 17:01:34
Problema con consultas usando ADO Garry Tablas planas 5 23-01-2008 10:07:08
Problema con Asignacion a un Objeto. BEPAI Varios 12 10-04-2007 13:28:35
Problema con Filter y EOF usando TTable El_Raso Conexión con bases de datos 0 20-03-2007 19:35:35


La franja horaria es GMT +2. Ahora son las 00:32: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
Copyright 1996-2007 Club Delphi