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...