[ captPicard @ 08.04.2010. 14:27 ] @
Pozdrav,

problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.

Ne uspijeva sa niti jednim
TButton.Free;
FreeAndNil(TButton);

tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Ideje, iskustva?

Hvala.
[ savkic @ 08.04.2010. 18:06 ] @
> problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.
> Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Da li ti je ovo greška u kucanju, ovo ne radi ništa. Treba ti nešto poput btnOK.Free.

> tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Kako to testiraš i da li ti prijavljuje baš za buttone ili neke druge stvari?

> Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Šta znači opcija fokusiranja, kako se ta dugmad razlikuju od ostalih?
[ captPicard @ 08.04.2010. 18:31 ] @
Citat:
savkic: > problem je slijedeći: dinamički se kreiraju TButton kontrole i dodjeljuju im se OnClick eventi. Problem nastaje kada treba TButton osloboditi.
> Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Da li ti je ovo greška u kucanju, ovo ne radi ništa. Treba ti nešto poput btnOK.Free.

> tj. malo radi, malo ne, nakon par kreiranja/uništavanja javlja se memory leak.

Kako to testiraš i da li ti prijavljuje baš za buttone ili neke druge stvari?

> Zanimljivo je da se taj problem ne događa sa buttonima koji nemaju opciju fokusiranja.

Šta znači opcija fokusiranja, kako se ta dugmad razlikuju od ostalih?


Naravno, greška u kucanju. Button1.Free i FreeAndNil(Button1) npr.

Ne znam za šta prijavljuje, u to problem, dobijem AccessViolation err ili Abstract err. Buttoni se kreiraju na MainForm.OnShow, za svaki element u mainMenu se kreira button i procedura OnClick.
Npr. SpeedButton nema opciju da može primiti fokus (npr da možemo sa tabom doći do njega), i sa tim buttonima radi sve ok. Ako se SpeedButtoni zamijene sa TButton-ima, javlja se taj leak u petlji gdje se radi Button.Free

Dakle, u kodu se ništa ne mijenja, samo se zamijeni TSpeedButton sa TButton.

Hvala savkic na odgovoru, sutra ču ti pokušati poslati primjer koda.
[ sasaz2008 @ 08.04.2010. 18:54 ] @
>Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Kako je već rečeno, ne možeš se oslobadjati klasa, već samo njihova instanca. Ali to je verovatno greška u copy&paste....

Problem je verovatno u tome što nije baš preporučljivo raditi Free i FreeAndNil zajedno, pošto FreeAndNil upravo radi sledeće:

Btn:=TButton.Create(...):
...
//FreeAndNil(Btn);
Btn.Free;
Btn:=nil;

I naravno, pre oslobadjanja promeni fokus na formu ili neku komponentu koja nije dinamički generisana.
[ captPicard @ 08.04.2010. 18:56 ] @
Citat:
sasaz2008: >Ne uspijeva sa niti jednim
> TButton.Free;
> FreeAndNil(TButton);

Kako je već rečeno, ne možeš se oslobadjati klasa, već samo njihova instanca. Ali to je verovatno greška u copy&paste....

Problem je verovatno u tome što nije baš preporučljivo raditi Free i FreeAndNil zajedno, pošto FreeAndNil upravo radi sledeće:

Btn:=TButton.Create(...):
...
//FreeAndNil(Btn);
Btn.Free;
Btn:=nil;


Ma greškom sam upisao, znam da ne mogu oslobađati klase :)

Krivo si shvatio, ne radim zajedno Free i FreeAndNil, nego ne radi niti sa .Free niti sa FreeAndNil().
[ sasaz2008 @ 08.04.2010. 19:05 ] @
U svojstvo OnClick event buttona koji se briše takodje se pre toga stavlja nil?

Promeni pre toga fokus na formu ili neku komponentu koja nije dinamički generisana i trebalo bi da radi bez problema.

[Ovu poruku je menjao sasaz2008 dana 08.04.2010. u 20:15 GMT+1]
[ savkic @ 08.04.2010. 22:54 ] @
> Ne znam za šta prijavljuje, u to problem, dobijem AccessViolation err ili Abstract err.

Ček to su različite stvari, memory leak znači da neki objekat ne oslobađaš a AV znači pristup nealociranoj memoriji (najčešće uništavanje ili pristup već uništenom objektu), abstract error znači upotrebu neke apstraktne metode. Pošalji kod i napiši šta se tačno dešava. Za kontrolisanje memorije preporučujem FastMM (stavi ga za memory manager), na kraju rada programa on će ti detaljno ispisati šta je ostalo neoslobođeno.

> Buttoni se kreiraju na MainForm.OnShow, za svaki element u mainMenu se kreira button i procedura OnClick.

A kada se uništavaju? Ako se to radi na kraju života forme, onda i ne moraš raditi eksplicitno uništavanje, dovoljno je da staviš za owner buttona formu.

> Npr. SpeedButton nema opciju da može primiti fokus (npr da možemo sa tabom doći do njega), i sa tim buttonima radi sve ok.

Prisustvo ili odsustvo fokusa sigurno nije uzrok. Da li ti koristiš baš TButton i TSpeedButton kontrole ili neke njihove naslednice?
[ sasaz2008 @ 09.04.2010. 00:31 ] @
Denise,

Bilo bi od velike pomoći kada bi poslao jednostavan project sors koji demonstrira grešku i napisao koju verziju Delphi-ja koristiš.
[ captPicard @ 09.04.2010. 01:02 ] @
Hvala svima na trudu, stavit ću sutra source sa primjerom, pa će biti mnogo jasnije.
Našao je kolega drugo rješenje, ali jako me zanima zašto to ne radi kako bi trebalo raditi.
[ rambo @ 10.04.2010. 01:27 ] @
Zašto koristiš OnShow forme za kreiranje komponenti? Za to se obično koristi OnCreate. Nešto mi sumnjivo baš to. Moguće je da se problem javlja baš zbog OnShow jer se (iste) komponente kreiraju svaki put kada ta forma dobije fokus, što predpostavljam da nije namera. Prebaci kreiranje tih buttona u OnCreate pa proveri dali ti se javljaju isti problemi.