Imam mali problemčić...
Defirnirao sam klasu kao nasljednika TPanel.
TStavka
Dodao sam (prepisao iz TInterfacedObject:
objDestroyingFlag = Integer($80000000);
function GetRefCount: Integer; inline;
class procedure __MarkDestroying(const Obj); static; inline;
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
Kreirao sam interface za tu klasu.
IStavka
Varijabla koja mi je za objekt je Stavka: IStavka. Definirana je u public forme.
Obični button za kreiranje objekta i OnButtonClick:
Code:
Stavka := TStavka.Create(Form1);
drugi (radi testa):
Code:
Stavka := nil;
Morao sam kreirati destruktor da bih oslobodio kontrole koje su na TStavka (nekoliko tLabela i TEdita)
Sve radi OK, pozove se destruktor kada treba, nakon Stavka := nil kao i kad closam formu. Probem je kad se napravi Close programa, a forma na kojoj je Stavka je kreirana. Ako prije closanja programa napravim: Stavka := nil ili closam formu, sve je OK, ako ne, tada se dogodi sljedeće redosljedom:
1. pozove se destroy TStavke (nigdje ga direktno ne pozivam)
2. pozove se _Release, brojać je na 1 i on ponovno pozove destroy. Normalno, program javi Invalid... pokušava napraviti destroy objekata koji ne postoji.
Prvi put destroy nije pozvan iz funkcije _Release, drugi put je.
U čemu je problem? Gdje griješim?
Nadopuna, zaobišao sam problem, ali me svejedno zanima o čemu se radi.
- Objekt je na MDIChild formi
- u onclose MDIChild forme sam dodao: Stavka := nil;
- u onsClose Main forme sam dodao: formStavke.Free
Nakon toga mi radi ok. Ako izbacim jedno ili drugo, opet javlja grešku.
[Ovu poruku je menjao FranjoZG dana 23.03.2019. u 18:35 GMT+1]