Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2007
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Como Elimina los Componentes de un Contenedor

Buenas Tardes Foristas
Con el siguiente codigo en un scrollbox creo en ejecucion los campos pertenecientes a una tabla. Cunado Cambio de Tabla requiero recrear los campos de la nueva tabla previa eliminacion de los campos anteriores. pero no he podidom usarlo. Ajunto el Codigo de creacion de los campos y el internto de eliminarlos .
La creacion de Campos funciona muy bien
Gracias por su colaboracion

Código:
  
procedure TFDSPTAB.BitBtn_showFieldsClick(Sender: TObject);
var
 i:Integer;
 s:string;
 campo:TField;
 DBEdit0: TDBEdit;
 Label0: TLabel;
 localOwner: TComponent;
 top:Integer;
begin

// se intenta eliminar los campos los campos creados con anterioridad
 for i:=0 to ScrollBox1.ComponentCount -1 do begin; 
      ScrollBox1.Components[i].free ;
   end;

// crear los campos por la tabla abierta
 for i:=0 to D.DSPTAB.Fields.Count -1 do begin
   S:= D.DSPTAB.fields[i].FieldName;
        DBEdit0 := TDBEdit.Create(nil) ;
        Label0 :=  TLabel.Create(nil) ;
        with Label0 do begin
          Name:= 'Label_' + s;
          Caption :=s + ' ...................................';
          Parent:= ScrollBox1;
          Top:=  (24) +(i*23);
          Left:=7;
        end;
        with  DBEdit0 do begin
          Name :=s;
          DataField :=s;
          //Parent:= Form1;
          Parent:= ScrollBox1;   // Panel_fields;
          Top:=  (Height + 3) +(i*23);
          Left:=160;
          Width :=200;
          DataSource := D.DSPTAB_d ;
        end;
end;
Responder Con Cita
  #2  
Antiguo 01-06-2007
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por ASAPLTDA
Código:
  
 for i:=0 to ScrollBox1.ComponentCount -1 do begin; 
      ScrollBox1.Components[i].free ;
   end;
Siempre que elimines items de una lista en forma secuencial, debes hacerlo decrementalmente, porque en cuanto elimines el primero la cuenta de items será una unidad menor.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 01-06-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Solo por fastidiar

También podemos ir hacia adelante:
Código Delphi [-]
  while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;
Responder Con Cita
  #4  
Antiguo 04-06-2007
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
Empezado por seoane
Solo por fastidiar

También podemos ir hacia adelante:
Código Delphi [-]
  while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;
Se que es solo para fastidiar , pero también es bueno aclarar que el utilizar un for decreciente es un poquito mas "económico" que este código, ya que se consulta solo una vez en todo el ciclo la cantidad de ítems de la lista, por el contrario en este caso, se evalúa para cada iteración.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 04-06-2007
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Unhappy Como Elimina los Componentes de un Contenedor

Hola Amigos,
Muchas Gracias por responder, he leido las 2 alternativas que proponen + la consideracion de rendimiento.

Aplique la siguiente:
Código:
while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;
y no funciono, Pero revisando encontre algo simpatico el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL , quisiera que le echaran una mirada al codigo donde creo los componentes dbedit, para confirmar si la forma que aplico es la correcta. Disculpen que pida esa revision pero le he trabajdo y no encuenntro la solucion. Gracias
Utilizo turbo delphi 2006 gratuito
Responder Con Cita
  #6  
Antiguo 04-06-2007
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Porque No Podia Eliminar los Componentes Creados en Ejecucion

Hola Amigos,

La propiedad de .ComponentCount es actualizada cuando un contenedor es propietario de un componente y no depende de la propiedad Parent

Para poder utilizar la instruccion ScrollBox1.ComponentCount , los componentes creados en ejecucion deben ser creador con un propietario
Ejemplo0 RunTimeButton := TDBEdit.Create(nil) ; // OWNER ?? APPLICATION
Ejemplo1 RunTimeButton := TButton.Create(Self); // OWNER LA FORMA
Ejemplo1 RunTimeButton := TButton.Create(ScrollBox1); // OWNER SCROLLBOX1

Muchas Gracias por su Apoyo


Cita:
Empezado por ASAPLTDA
Hola Amigos,
Muchas Gracias por responder, he leido las 2 alternativas que proponen + la consideracion de rendimiento.

Aplique la siguiente:
Código:
while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;
y no funciono, Pero revisando encontre algo simpatico el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL , quisiera que le echaran una mirada al codigo donde creo los componentes dbedit, para confirmar si la forma que aplico es la correcta. Disculpen que pida esa revision pero le he trabajdo y no encuenntro la solucion. Gracias
Utilizo turbo delphi 2006 gratuito

Última edición por ASAPLTDA fecha: 04-06-2007 a las 23:00:52.
Responder Con Cita
  #7  
Antiguo 04-06-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por ASAPLTDA
y no funciono, Pero revisando encontre algo simpatico el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL
Ahora que lo dices... igual es la propiedad scrollbox1.ControlsCount y scrollbox.Controls[0].Free

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #8  
Antiguo 04-06-2007
Avatar de xander
xander xander is offline
Miembro
 
Registrado: jul 2006
Posts: 499
Poder: 18
xander Va por buen camino
Cita:
Empezado por delphi.com.ar
Se que es solo para fastidiar , pero también es bueno aclarar que el utilizar un for decreciente es un poquito mas "económico" que este código, ya que se consulta solo una vez en todo el ciclo la cantidad de ítems de la lista, por el contrario en este caso, se evalúa para cada iteración.

Pues eso no es del todo cierto... si lo implementas como se había mencionado antes:
Código Delphi [-]
  for i:=0 to ScrollBox1.ComponentCount -1 do ...
claro que se evalua en cada iteración... puedes probar poniendo alguna función en el for y llevando un log de las llamadas a la función y verás que en cada iteración del for se manda a evaluar la expresión de terminación.

Otra cosa sería si hicieras:
Código Delphi [-]
  C := ScrollBox1.ComponentCount -1;
  for i:=0 to C do ...

Entonces si solo se evalua una sola vez la cuenta de los componentes.
__________________
"Hey, nena, debe ser genial ser tú y verme a mí mismo..."
Responder Con Cita
  #9  
Antiguo 04-06-2007
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
La condición de terminación claro que se evalúa en cada ciclo, pero delphi.com.ar se refiere a la cantidad de items.

Si ponemos:

Código Delphi [-]
for I := ScrollBox.ControlCount -1 downto 0 do
  ScrollBox.Controls[i].Free;

se toma el valor de ScrollBox.ControlCount al comienzo del ciclo y nada más. De la forma que propone seoane:

Código Delphi [-]
while ScrollBox.ControlCount  > 0 do 
  ScrollBox.Components[0].free ;

el valor de ControlCount debe tomarse cada vez.

// Saludos
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
Necesito un contenedor transparente Anunakis Gráficos 4 02-06-2008 03:17:36
Imagen de Paintbrush en Contenedor OLE pablo OOP 0 09-06-2005 01:08:35
Agregar controles a un contenedor senpiterno Varios 5 08-09-2004 02:22:25
Contenedor con barras de scroll senpiterno Varios 3 07-09-2004 05:17:57
como se elimina un carecter de un string... ronimaxh Varios 10 23-08-2004 22:03:53


La franja horaria es GMT +2. Ahora son las 20:04:57.


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