Form als Variable einer Klasse

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Form als Variable einer Klasse

Beitrag von LazProgger »

Ich habe eine Klasse, in der unter anderem einige Infos abgespeichert sind. Nun soll es eine dynamisch erstellte Form geben, die diese Infos visualisiert. In den Beispielen habe ich mal alles unwichtige entfernt.

Die Form ist so definiert:

Code: Alles auswählen

TObjForm = class(TForm)
private
    { private declarations }
public
    { public declarations }
end;   


Die Klasse so:

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;


Wie man sieht, soll die Form immer erst dann erstellt werden, wenn ShowForm aufgerufen wird. Im OnCreate des Objekts dagegen soll die Form noch nicht erstellt werden.

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.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Form als Variable einer Klasse

Beitrag von m.fuchs »

Also dein Minimalbeispiel habe ich mal übernommen und es läuft problemlos. Hast du es bei dir auch noch mal getestet, nachdem du alles "unwichtige" entfernt hast?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: Form als Variable einer Klasse

Beitrag von LazProgger »

Sorry Leute, das bereinigte Beispiel funktioniert bei mir auch..

Ich werde mal weiter schauen, woran das liegen mag. Jetzt bin ich echt verwundert, der andere Code sollte das eigentlich nicht wirklich beeinflussen.

Aber Danke schonmal!

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Form als Variable einer Klasse

Beitrag von m.fuchs »

Zeig doch mal den Originalcode, wenn er nicht zu lang ist.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

LazProgger
Beiträge: 63
Registriert: Di 11. Mär 2014, 00:33

Re: Form als Variable einer Klasse

Beitrag von LazProgger »

Hat sich erledigt, funktioniert jetzt. Das Problem lag darin dass ich einen Fehler im OnCreate hatte, den ich hier instintiv richtig rein geschrieben habe.. ;)

Also eigentlich kann man dieses Thema gerne wieder löschen ;)

Antworten