Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
Destruir Qrlabels creados en tiempo de ejecucion

Mi problema es q creo los label en tiempo de ejecucion, algo asi:
Código Delphi [-]
for i := 1 to NumCampos  do begin
      With TQRLabel.Create( Self ) do
      begin
          campo:=ObtienePalabra(QRLabelnew.caption, ',', i);
          longitud:= length(campo);
          Name       := 'QRLabel' + IntToStr(i);//'txPorc' + IntToStr(aListas[i]);
          AutoSize   := true;
          Font.Name  := 'Courier New';
          Font.Style := [fsBold];
          Height     := 17;
          Left       := nCol;
          Top        := 32;
          Width      := longitud;
          Caption    := campo;
          Parent     := ColumnHeaderBand1;
          nCol:= nCol+(longitud*7);
      end;
y cuando cierro el informe y vuelvo a realizar otro claro pues se duplica label1,label2, segun el nº d campos, y ahi me da error, me dice:
Cita:
A component named Qrlabel1 already exists
como puedo una vez cerrado el informe eliminar los qrlabel creados en tiempo de ejecucion??
he probado en el onclose del fom q alberga el quicrep, hay alguna manera de saber cuando se cerró?
Tambien he probado, en el boton donde llamo a QuickRep2.Preview, tras esto hacer:

Código Delphi [-]
     InformeProveedores2.QuickRep2.Preview;
     total:=InformeProveedores2.ComponentCount;
     totalbucle:= total-1;
          for i:=0 to  totalbucle do
         begin
             if InformeProveedores2.Components[i] is TQRLabel then
                begin
                showmessage(InformeProveedores2.Components[i].name);
               {TQRLabel(InformeProveedores2.Components[i]).Destroy; aqui es cuando falla, hay solo un Tqrlabel funciona, lo destruye, pero si hay mas me da error}
                end;
         end;
end;

el error:
raised exception class EListError whit message 'list index of boun(7)'
deciros q el 7 creo q es el valor de i en ese momento, es decir el elemento q deberia destruirse ( sino e suna coincidencia )

Saludos y espero me puedan ayudar



Saludos
Responder Con Cita
  #2  
Antiguo 08-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Podrías utilizar un objeto "TList" o "TObjectList" que instanciaras en una variable "global", o que estuviera dentro del "formulario de reportes" (nunca usé uno), es decir, suponiendo que su declaración fuera similar a un formulario normal y corriente, algo así:

Código Delphi [-]
type
  TForm1 = class(TForm)
    private
      FQrLabels: TList;
  end;

Eso te permitiría ir creando instancias de "TQrLabel" e ir añadiendo sus referencias al objeto "TList" o "TObjectList". Al cerrarse el formulario o cuando estimaras más conveniente sería cuestión de liberar el objeto de marras. Ahora mismo no recuerdo si con "TList" basta con liberar dicho objeto o hay que "recorrer" la lista y liberar cada una de los objetos que contiene. Lo mismo te digo para "TObjectList". Tendrás que investigar o algún compañero nos sacará de dudas.

Por otro lado, el error que refieres más arriba es bastante común, y es que, en estos casos en que recorremos los componentes de un formulario, por ejemplo, y vamos liberando algunos de ellos (dependiendo de X condición), hemos de iterar por dichos elementos con un bucle al revés que como suele hacerse, es decir, algo así:

Código Delphi [-]
for i := ComponentCount downto 0 do
begin
  // lo que tengamos que realizar
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 08-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
ok Dec, muchas gracias por tu ayuda , asi ya sale lo que queria:
Código Delphi [-]
for i:=(InformeProveedores2.ComponentCount-1) downto 0 do
         begin
              if InformeProveedores2.Components[i] is TQRLabel then
                begin
                if InformeProveedores2.Components[i].name <>'QRLabelnew' then
                TQRLabel(InformeProveedores2.Components[i]).Destroy;
                end;
         end;
Pero aun asi, he de aprender a utilizar un objeto "TList", ya q nunca lo he hecho
Saludos
Responder Con Cita
  #4  
Antiguo 08-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Ade
Pero aun asi, he de aprender a utilizar un objeto "TList", ya q nunca lo he hecho
Bueno, oyes, tampoco, si te va bien con la solución que encontraste... por otro lado dicen que el saber no ocupa lugar (es mentira). Depende de lo que traigas entre manos pues lo mismo sí te interesaría utilizar la clase "TList"... acaso algún compañero puesto en esto de los "reportes" pueda arrojar un poco de luz sobre el asunto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 08-10-2006
Ade Ade is offline
Miembro
 
Registrado: jul 2006
Ubicación: Murcia
Posts: 70
Poder: 18
Ade Va por buen camino
La verdad es q una vez q funciona asi, asi se queda pero digamos q lo tengo pendiente pues he leido ya varios hilos relacionados, tendre q buscar primero un buen libro, manual o hilo en el q se entre en detalle.

Segun se seleccione en un groupbox (lleno de checkbox) los campos que se quieren mostrar en un dbgird (junto con sus datos obviamente) con el nº de campos seleccionados sera el nº de columnas del quickrep, y ya te digo lei que para eso era mejor Tlist pero dandole vueltas encontre otra forma, jejjje
veremos a ver si en un futuro no es un problema,
Saludos y gracias
Responder Con Cita
  #6  
Antiguo 08-10-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Piensa que la descripción de la clase "TList" dice así:

Cita:
TList stores an array of pointers.
Ni más, ni menos. Bueno. En realidad esa es la descripción corta, la "larga" dice como sigue:

Cita:
TList, which stores an array of pointers, is often used to maintain lists of objects. TList introduces properties and methods to

- Add or delete the objects in the list.
- Rearrange the objects in the list.
- Locate and access objects in the list.
- Sort the objects in the list.
Vamos, que tampoco tiene mucho misterio, como suele decirse, me parece a mí...

De todos modos, parece que "TObjectList" pone la cosa todavía un poco más interesante:

Cita:
TObjectList maintains a list of (owned) objects.

Unit

Contnrs

Description

Use TObjectList to store and maintain a list of objects. TObjectList provides properties and methods to add, delete, rearrange, locate, access, and sort objects. If the OwnsObjects property is set to true (the default), TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 08-10-2006 a las 04:41:39.
Responder Con Cita
  #7  
Antiguo 08-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Es que... con un TObjectList sería muchiiiiisimo más facil, Sin necesidad de bucles, y pudiendo destruirlos y crearlos a voluntad:

Código Delphi [-]

//Cuando lo necesites, creas el TObjectList;
if not Assigned(Lista) then 
  Lista := TObjectList.Create(true);

// Al crear los labels, los añadimos a la lista
var q:TQRLabel;
for i := 1 to NumCampos  do begin
      q := TQRLabel.Create( nil ); // nadie lo destruye, lo haremos nosotros
      With q do
      begin
          campo:=ObtienePalabra(QRLabelnew.caption, ',', i);
          longitud:= length(campo);
          Name       := 'QRLabel' + IntToStr(i);//'txPorc' + IntToStr(aListas[i]);
          AutoSize   := true;
          Font.Name  := 'Courier New';
          Font.Style := [fsBold];
          Height     := 17;
          Left       := nCol;
          Top        := 32;
          Width      := longitud;
          Caption    := campo;
          Parent     := ColumnHeaderBand1;
          nCol:= nCol+(longitud*7);
         Lista.Add(q);
      end;

// Cuando quieras destruirlos:
 FreeAndNil(Lista); // todos..... los qrlabels y la propia lista.

// Si solo quieres destruir los labels:
   Lista.Clear;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
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
cambiar tamaño y mover componentes creados en tiempo de ejecucion gulder API de Windows 4 18-11-2006 23:21:16
Acomodar QRLabels en tiempo de ejecucion rex Impresión 9 08-10-2006 00:02:22
Eventos en componentes creados en tiempo de ejecucion joumont OOP 3 27-12-2005 14:48:23
destruir objeto creado en tiempo de ejecucuión jaime cotino Varios 5 28-06-2005 20:45:36
Objetos creados en tiempo de ejecución Scocc OOP 4 13-06-2003 20:55:29


La franja horaria es GMT +2. Ahora son las 16:52:11.


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