PDA

Ver la Versión Completa : Como Elimina los Componentes de un Contenedor


ASAPLTDA
01-06-2007, 22:14:30
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


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
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:

while ScrollBox1.ComponentCount > 0 do
ScrollBox1.Components[0].free ;

delphi.com.ar
04-06-2007, 16:19:32
Solo por fastidiar :p

También podemos ir hacia adelante:

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
Hola Amigos,
Muchas Gracias por responder, he leido las 2 alternativas que proponen + la consideracion de rendimiento.

Aplique la siguiente:
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
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 :)


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

Aplique la siguiente:
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
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
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:

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 := 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:


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:


while ScrollBox.ControlCount > 0 do
ScrollBox.Components[0].free ;


el valor de ControlCount debe tomarse cada vez.

// Saludos