PDA

Visualizza la versione completa : [Delphi] Distruggere oggetti a runtime


tia86
22-07-2003, 11:17
come si fa a distruggere (a runtime) un oggetto creato ankesso a runtime?

es ho questo codice


procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var btn: TButton;
begin
btn := TBUtton.create (self);
btn.parent:= Self;
btn.left:= X;
btn.top:= Y;
btn.Name := 'bottone'+inttostr(count);
count:=Count+1;
end;

variabile count:integer; (privata)

come si fa a fare in modo ke premendo un pulsante tutti i pulsanti vengano distrutti?

es.

for i:=1 to count do
begin
s:= 'bottone'+inttostr(i);
Freeandnil(s);
end;
(questo codice da errore di violazione)



:ciauz:

p87
22-07-2003, 11:29
for i:=1 to count do
FreeAndNil(FindComponent( 'bottone'+IntToStr(i) ))

Ciauz :ciauz:

tia86
22-07-2003, 11:31
Originariamente inviato da p87


for i:=1 to count do
FreeAndNil(FindComponent( 'bottone'+IntToStr(i) ))

Ciauz :ciauz:


Grazie :)

tia86
22-07-2003, 11:36
strano nn funziona :master:

Costant object cannot be passed as var parameter

tia86
22-07-2003, 11:40
risolto!

bit : TComponent;

for i:=1 to count do
begin
s:= 'bottone'+inttostr(i);
bit:= FindComponent ('bottone'+inttostr(i));
FreeAndNil(bit);

end;

alka
22-07-2003, 12:12
Poni molta attenzione quando scandisci generalmente gli elementi di una lista, poichè il numero di elementi diminuisce di volta in volta (anche se, in questo caso, non mi sembra che si ricada in una situazione simile poichè la variabile Count è inizializzata manualmente).

L'approccio generico per la scansione con eliminazione dovrebbe essere, generalmente, percorso a rovescio per evitare "side effects":


for i := Count downto 1 do
TButton(FindComponent('Bottone' + IntToStr(i))).Free;


Se generi molti bottoni, prevedi anche l'uso di una lista in cui memorizzarne i riferimenti durante la creazione: l'uso del metodo FindComponent rallenta sempre di più maggiore è il numero di componenti.

Ciao! :ciauz:

tia86
22-07-2003, 12:30
Perfetto

grazie alka



:ciauz:

Loading