Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como Elimina los Componentes de un Contenedor (https://www.clubdelphi.com/foros/showthread.php?t=44271)

ASAPLTDA 01-06-2007 22:14:30

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;


delphi.com.ar 01-06-2007 22:42:54

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.

seoane 01-06-2007 23:17:20

Solo por fastidiar :p

También podemos ir hacia adelante:
Código Delphi [-]
  while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;

delphi.com.ar 04-06-2007 16:19:32

Cita:

Empezado por seoane
Solo por fastidiar :p

También podemos ir hacia adelante:
Código Delphi [-]
  while ScrollBox1.ComponentCount  > 0 do 
      ScrollBox1.Components[0].free ;

Se que es solo para fastidiar :p, 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!

ASAPLTDA 04-06-2007 16:45:16

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 :mad: el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL :eek: , 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:D

ASAPLTDA 04-06-2007 18:27:42

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 :eek:
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 :mad: el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL :eek: , 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:D


Lepe 04-06-2007 20:33:34

Cita:

Empezado por ASAPLTDA
y no funciono, Pero revisando encontre algo simpatico :mad: el valor de ScrollBox1.ComponentCount es cero (0) aunque haalan varios componentes en EL :eek:

Ahora que lo dices... igual es la propiedad scrollbox1.ControlsCount y scrollbox.Controls[0].Free

Saludos

xander 04-06-2007 20:43:29

Cita:

Empezado por delphi.com.ar
Se que es solo para fastidiar :p, 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.

roman 04-06-2007 20:57:10

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


La franja horaria es GMT +2. Ahora son las 10:07:32.

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