Zdravím,
tvořím aplikaci, ve které se vytváří a spravuje struktura objektů pomocí MDI Formulářů. Vazba MDI na formulář je provedena pomocí proměnné typu třídy konkrétního objektu který má formulář spravovat (lze v něm nastavovat vlastnosti toho objektu).
Například mám třídu Traťová kolej:
TTratovaKolej = class
CreateID: Integer;
Cislo: ShortString;
Smer: ShortString;
Zkratka: ShortString;
NetID: ShortString;
constructor Create(aCreateID: Integer);
destructor Destroy(); override;
end;
Objekty, vytvořené podle této třídy (respektivě ukazatele na ně), jsou po vytvoření ukládány v poli:
ArrTratoveKoleje: Array of TTratovaKolej;
Když chci vlastnosti daného objektu upravit, vyvolám MDI formulář, ve kterém je v části public deklarována proměnná typu TTratovaKolej
//...
private
{ Private declarations }
public
{ Public declarations }
ATratovaKolej: TTratovaKolej;
//...
Do této proměnné vložím při vytváření formuláře odkaz na konkrétní objekt z výše uvedeného pole:
procedure TSpravaMDI.CreateMDIChild_TratovaKolej(
NovaTK: Boolean;
ATratovaKolej: TTratovaKolej);
var
Child: TDlgTratovaKolej;
begin
Child := TDlgTratovaKolej.Create(Application);
//...
if NovaTK
then
Child.ATratovaKolej := TTratovaKolej.Create(Indexer.GetID())
else begin
Child.ATratovaKolej := ATratovaKolej;
Child.PrevzitKolej();
//Nastavuje do editačních políček hodnoty z objektu
end;
end;
//volání pro vytvoření okna, správný index je předem zjištěný
SpravaMDI.CreateMDIChild_TratovaKolej(False, ArrTratoveKoleje[IndexKoleje]);
Otevření okna, úprava vlastností, i uložení do konkrétního objektu probíhá v pořádku. Problém nastane, když vedle tohoto okna otevřu jiné, ve kterém je možnost smazat objekt (resp. všechny objekty), na který odkazuje proměnná ATratovaKolej v MDI formuláři. Pro uvolnění objektu používám
for i := 0 to High(ArrTratoveKoleje) do
begin
FreeAndNil(ArrTratoveKoleje[i]);
end;
Problém je, že smazání proběhne, ale odkaz, držený v MDI formuláři, je "platný", respektivě se chová divně (při náhledu v Debug inspectoru) jsou v proměnných tohoto "smazaného" objektu nesmyslné hodnoty.
Očekával jsem že odchytit smazání objektu půjde odchytit tím, že odkazt na smazaný objekt se změní na nil. To se ale nestane, assigned(ATratovaKolej) vrací také true.
Kde dělám chybu, popřípadě jak ve formuláři zareagovat na smazání objektu, na který se v MDI formuláři takto odkazuji?
Díky, N.