SigSegV bei FormCreate

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
ManniSt
Beiträge: 27
Registriert: Mi 16. Okt 2019, 15:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

SigSegV bei FormCreate

Beitrag von ManniSt »

Hallo zudsammen,

habe da eine neue Form kreiert, die mit einem Testetxt auch super angezeigt wird.

OnCreate startet auch, die Form wird korrekt dargestellt.
Nur...: Wenn ich da F_Menu.Top oder ähnliches, was sich auf F_Menu bezieht, eingebe erscheint ein SigSegV.

Beim Kompilieren gibt es keine Fehlermeldungen.
Der Pieps kommt, ich kann auch Objekte auf der Form ändern.
F_Menu. ....... erzeugt den SigSegV

Hat da jemand eine Idee?

Gruß

Manni
-----------------------
Aufruf aus der aufrufenden Form:

Code: Alles auswählen

  F_Menu := TF_Menu.Create(Nil);  //Form wird erstellt
  F_Menu.ShowModal;          //Form wird angezeigt
  FreeAndNil(F_Menu);        //Form wieder freigeben
--------------------------
In F_Menu:

Code: Alles auswählen

procedure TF_Menu.FormCreate(Sender : TObject); 
begin
  tone(440,250);
  F_Menu.Width  := 300;
end;                         // procedure TF_Menu.FormCreate

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: SigSegV bei FormCreate

Beitrag von fliegermichl »

Im Create Konstruktor wird das Formular ERST erzeugt und DANN an die Variable F_Menu übergeben. Du solltest in Klassenmethoden niemals auf eine Instanzvariable zugreifen. Entweder F_Menu. ganz weglassen, (dann bezieht es sich sowieso auf sich selbst) oder den self Parameter verwenden. self.width := ...

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: SigSegV bei FormCreate

Beitrag von wp_xyz »

Das ist ein schönes Beispiel dafür, warum man die Variable, die automatisch zu einem Formular angelegt wird, NIE im Code der zugehörigen Klasse verwenden sollte.

In deinem Beispiel ist F_Menu zu Programmbeginn nil. Ich nehme an, es wird nicht automatisch erzeugt (d.h. steht unter "Projekt-Optionen" > "Formulare" nicht in der linken List mit den automatisch erzeugten Formularen (wenn doch, dann gibt es noch ein weiteres Problem...)). Dein Hauptformular ruft nun "F_Menu := TF_Menu.Create(Nil)" auf. D.h. das Formular wird erzeugt, und wenn dieser Vorgang beendet ist, wird der Pointer auf das erzeugte Formular in die Variable "F_Menu" geschrieben. Im Zusammenhang mit Create wird das Ereignis OnCreate aufgerufen; während dieses Ereignisses existiert das Formular aber noch gar nicht "offiziell", d.h. die Variable "F_Menu" hat immer noch den Wert nil. Und du greifst im Handler von OnCreate auf diese Variable zu... Das kann nicht gutgehen.

Ein anderer Grund, nicht den Formularnamen im Code der Formularklasse zu verwenden, ist, dass dein Programm nur dann funktioniert, wenn das Formular mit exakt diesem Namen erzeugt wurde. Wenn du also von der Klasse TF_Menu eine zweite Instanz mit Namen F_Menu2 erzeugst, wird der Code für F_Menu2 ignoriert. Oder, wenn du F_Menu inzwischen geschlossen und zerstört hast, stürzt das Programm beim Erzeugen von F_Menu2 ab, wenn sein OnCreate-Ereignis auf F_Menu zugreift..

Wenn du im OnCreate-Handler also den Bezeichner "F_Menu" nicht verwenden darfst, was nimmst du dann, um die Breite des Formulars dort zubestimmen? Entweder "Self" (anlog zu: Jeder Mensch weiß, von wem er spricht, wenn er "ich" sagt), oder lass den Formularnamen direkt weg - das Formular "weiß" schon, was gemeint ist.

Code: Alles auswählen

procedure TForm2.FormCreate(Sender: TObject);
begin
  //Self.Width := 300;
  //oder üblicher
  Width := 300;
end;
P.S.
fliegermichl war schneller...

ManniSt
Beiträge: 27
Registriert: Mi 16. Okt 2019, 15:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

[Gelöst] SigSegV bei FormCreate

Beitrag von ManniSt »

Genau das war die Lösung!
Habe das jetzt in OnActivate umgelagert.

Nun habe ich mir aber vor lauter Verwunderung den Hinterkoüpf zerkrazt, daeen in allen meinen Projekten habe ich das eigentlich nie anders gemacht.

Seltsam - aber naja: VIELEN DANK!

Gruß

Manni

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [Gelöst] SigSegV bei FormCreate

Beitrag von wp_xyz »

ManniSt hat geschrieben:
So 6. Feb 2022, 16:01
Habe das jetzt in OnActivate umgelagert.
Und steht die Form-Variable immer noch drin? Wenn ja, ist es genauso falsch wie vorher, nur dass es diesmal nicht kracht.
ManniSt hat geschrieben:
So 6. Feb 2022, 16:01
Nun habe ich mir aber vor lauter Verwunderung den Hinterkoüpf zerkrazt, daeen in allen meinen Projekten habe ich das eigentlich nie anders gemacht. Seltsam
Da kannst du dann mit im Chor singen: "Tausend mal ist nix passiert, aber heute hat es Zoom gemacht"

Antworten