Hallo,
Ich hab da ml eine einfache Frage zum Thema Forms im
BDS 2006:
Ich Habe mir eine eigene Klasse geschrieben :
Delphi-Quellcode:
type
TMeinForm = class(TForm)
private
{ Private-Deklarationen }
U_Ist_Destroy : Boolean;
U_Ist_Close : Boolean;
U_WarDeactivate : Boolean;
U_Activate_Arbeitet : Boolean;
U_DeActivate_Arbeitet : Boolean;
.....
protected
{ Protected-Deklarationen }
....
public
Fensternr : Integer;
DSFensterEinstellungen : TIBDataSet;
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
{ Published-Deklarationen }
end;
constructor TMeinForm.Create(AOwner: TComponent);
begin
U_Ist_Destroy := false;
U_Ist_Close := False;
U_WarDeactivate := False;
U_Activate_Arbeitet := False;
U_DeActivate_Arbeitet := False;
// Hier ist das Fenster noch nicht erzeugt
inherited;
// Hier ist das Fenster erzeugt -> nach dieser Proc (Create) kommt erst FormCreate aus dem jeweiligen Fenster
U_Fensternr := FensterNr(Self);
DSFensterEinstellungen := TIBDataSet.Create(Self);
.....
end;
destructor TMeinForm.Destroy;
Var I : Integer;
OBJ : TObject;
warStamm : Boolean;
begin
U_Ist_Destroy := true;
{
For i := Self.ComponentCount -1 downto 0 do
Begin
OBJ := Self.Components[I];
FreeAndNil(OBJ);
End;
}
FreeAndNil(DSFensterEinstellungen );
inherited;
// if warStamm then Self := NIL;
end;
Aus dieser Fenstervorlage wird dann ein Fenster gebaut, wie man es in Delphi gewöhnt ist. Mit Panels, Buttons usw.....
bsp:
Delphi-Quellcode:
type
TForm1 = class(TMeinForm)
OpenDialog1: TOpenDialog;
Tabelle_Gestalten: TMenuItem;
PopUpINS: TMenuItem;
PopUpDEL: TMenuItem;
PopUpSAVE: TMenuItem;
Panel1: TPanel;
N1: TMenuItem;
....
das Fenster wird mit "Application.CreateForm(TForm1, Form1)" erzeugt und anschliesend mit Form1.Show; angezeigt.
Beim beenden des Fensters wird in FormClose Action auf CAFree gesetzt.
Und jetzt kommt das Phänomen:
Wenn der destructor komplett abgearbeitet worden ist haben einige Objecte auf Form1 haben noch einen Wert. (Form1.OpenDialog1 hat "$2621000").
Obwohl es das Fenster und damit auch semtliche Objecte auf ihm ja nichtmehr geben dürfte.Da Alle Objecte Form1 als Owner haben.
Und genauso ist es auf mit der Variable "Form1". Wenn ich jetzt also Abfragen möchte
Delphi-Quellcode:
if not Assigned(Form1) then Application.CreateForm(TForm1, Form1);
Form1.show;
bekomme ich nur Leider bekomme ich dann bei "Form1.show;" eine Zugriffsferletzung.
Da Form1 nicht Nil wird es nicht erzeugt. Obwohl es ja nicht da sein dürfte/ ist.
Wenn ich jetzt aber in den destructor nach inherited; Self:= NIL; rein schreibe bekomme ich eine Zugriffsverletzung.(Was ja klar ist, da es ja auch eigentlich unsinn ist)
Ich hoffe ihr könnt mir Dabei helfen, wie ich alle Objecte auf dem Form "Sauber" Zerstören kann und die Variable "Form1" auf NIL bekomme.