Die Form ist so definiert:
Code: Alles auswählen
TObjForm = class(TForm)
private
{ private declarations }
public
{ public declarations }
end;
Code: Alles auswählen
TObj = class
private
FForm: TObjForm; // HIERMIT TRITT SIGSEGV AUF
protected
public
procedure ShowForm;
constructor Create;
destructor Destroy; override;
end;
//var
// FForm: TObjForm; // HIERMIT TRITT KEINE SIGSEGV AUF
procedure TObj.ShowForm;
begin
if Assigned(FForm) then begin // HIER TRITT SIGSEGV AUF
FForm.Show;
end else begin
// Form erstellen
end;
end;
constructor TObj.Create;
begin
inherited Create;
FForm:=nil;
end;
destructor TObj.Destroy;
begin
if assigned(FForm) then begin
FForm.Free;
end;
inherited Destroy;
end;
ShowForm soll mit Assigned(FForm) überprüfen, ob FForm auf nil steht (und schon erstellt wurde). Falls FForm existiert, soll die Form sofort angezeigt werden, ansonsten soll die Form neu erstellt werden.
Nun führt die Zeile Assigned(AForm) allerdings zu einer Zugriffsverletzung (SIGSEGV). Das merkwürdige ist, dass der Code einwandfrei funktioniert, wenn man FForm als globale Variable definiert. Der Fehler tritt nur dann auf, wenn FForm innerhalb der Klasse als Klassenvariable definiert ist.
Nach Möglichkeit würde ich aber gerne FForm zusammen mit der Klasse abspeichern und nicht als globale Variable. Schließlich wäre es dann nicht mehr möglich, mehrere unabhängige Formen voneinander zu betreiben.
Ich habe schon vieles ausprobiert, aber irgendwie tritt immer bei Assigned die Fehlermeldung auf. Kann mir jemand weiterhelfen? Es ist vielleicht eine Kleinigkeit für einen Profi...
PS: FForm als private Variable innerhalb von ShowForm zu erzeugen, ist leider auch keine Lösung für mich, da man auch später auf die Form über die Klassenvariable zugreifen können sollte bzw. die Form interaktiv ist. Die Form sollte also schon irgendwie als Variable in der Klasse gespeichert werden.