Šta je novo?

[Delphi7] Brisanje dinamicki kreiranih komponenata

ToxiC

Čuven
Učlanjen(a)
12.12.2002
Poruke
2,560
Poena
679
Kako da izbrisem dinamicki kreirane komponente na formi?

nacin kreiranja:
Kod:
.
.
.
var
 memo:TMemo;
 nekiBr:integer;
begin
.
.
.
  for i:=1 to nekiBr do
  begin
    memo:=TMemo.Create(Self);
    memo.Parent:=Self;
  end;
.
.
.
end;
probao sam i sa Free i Destroy ali nece !
 
Prvo, trebalo bi te Memoe nekako da popamtiš, recimo da ih popišeš u niz, ili jednostavno da im tokom kreiranja daš neko ime tipa memo.Name = 'Memo' + IntToStr(i) i postaviš Parent da bude forma ili neki drugi container. I onda pri uništavanju tražiš i uništiš komponentu kao FreeAndNil(FrmIme.FindComponent('Memo1')). Recimo, ako hoćeš da uništiš one memoe koje si napravio, ideš

Kod:
for i := nekiBr downto 1 do FreeAndNil(FrmIme.FindComponent('Memo' + IntToStr(i)));

ili

Kod:
for i := (FrmIme.ComponentCount - 1) downto 0 do
begin
  if LeftStr(FrmIme.Components[I].Name, 4) = 'Memo' then FreeAndNil(FrmIme.Components[I]);
end;
 
U tvoj for ciklus dodaj
Kod:
memo.Name := 'Memo'+IntToStr(i);

Zatim Kada hoces da izbrises komponentu koristi funkciju FindComponent:
Kod:
    with TMemo(FindComponent('Memo' + IntToStr(neki_integer_u_zavisnosti_koji_memo_brises))) do
      Free;

PS. Nisam bio konektovan dok sam kucao, pa me Vudu pretece....
 
Poslednja izmena:
To je to, radi
imate 10x :bottle:
 
Ako se radi o "ciscenju" pri gasenju programa, ne moras to da radis dokle god si kao Owner specifikovao bilo koji drugi component (non-nil). Npr. u ovom primeru Self (kao owner u create) pokazuje najverovatnije na formu i kada je forma ubijena, onda ce automatski da ocisti i svu svoju "decu" (tj. onu koja su u dizajn tajmu stavljena na formu i onu koja su u Create metodi stavili nju kao ownera). U slucaju da novokreirana komponenta nema ownera (aka Create(nil)), tada treba sam da ocistis.

P.S.
Kada vec hoces da pogasis memoe, sigurnije je brisati ih prema tipu nego prema imenu ili delovima imena, npr:

Kod:
  for i:=FrmIme.ComponentCount-1 downto 0 do
    if (FrmIme.Components[i] is TMemo) then FrmIme.Components[i].Free();

Ne moras nuzno stavljati memoe u listu; da bi ih razlikovao od onih koje si u dizajn-tajmu stavio na formu, mozes staviti neku vrednost u Tag property kod kreiranja i onda pri ovoj petlji proveravas da li je komponenta memo i sta stoji u Tagu.
 
Poslednja izmena:
@silver
probao sam i to resenje i radi, naravno ja na ovom stadijumu programera ne mogu da vidim razliku, tek jedna bitnija stvar, kako uopste izgleda forma.

ADOQuery vraca neke rezultate iz tabele i na osnovu broja koji vrati se na PageControl1 (on vec postoji na formi) kreira toliko i TabSheet-a kojima je parent PageControl, a na svakoj od tih TabSheet-a se kreira po jedan Memo, Label i Edit kojima je parent taj TabSheet!!
Po ponovnom pokretanju ADOQuery-ja treba da se izbrisu sve te "novokreirane" komponente i ostane "cist" PageControl, na koji se po vracanju rezultata ADOQuery-ja ispisuju ponovo TabSheet-ovi, pa na njima....i tako u krug!!!
hvala puno :)
 
Kod kreiranja memoa, labela i editboxa stavi onda da tabsheet bude i owner (ne "self", self je tu najverovatnije forma) i parent, pa kod brisanja treba samo da obrises tabsheetove, a oni ce automatski da ociste sve komponente ciji su vlasnik.
 
silverglider je napisao(la):
Kod kreiranja memoa, labela i editboxa stavi onda da tabsheet bude i owner (ne "self", self je tu najverovatnije forma) i parent, pa kod brisanja treba samo da obrises tabsheetove, a oni ce automatski da ociste sve komponente ciji su vlasnik.
Odlicno, radi i to mnogo brze :wave:
 
Nazad
Vrh Dno