Verbesserung:
Code: Alles auswählen
procedure TForm1.BCMaterialDesignButtonKalenderClick(Sender: TObject);
begin
BGRAShapeKalender.Visible:=True;
If Not Assigned(FKalender) Then
Begin
FKalender:=TFKalender.Create(Self);
FKalender.OnClose:=@KalenderFormClose;
end;
FKalender.Show;
end;
In deiner Version wird im ersten Entscheidungsast der FKalender nur created, aber nicht angezeigt.
und dein Shape,Visible:=True kommt in beiden Ästen vor, also raus damit (davor oder danach)
"@" ist der sogenannte "Address"-Operator --> nimm die Speicher-Adresse der genannten Variablen/Objekts
In dieser Zeile sagt du "FKalender", das es für sein OnClose-Ereignis den Programmcode an genannter Speicheradresse ausführen soll, welches eben die
nach Aussen "unsichtbare" Prozedur "KalenderFormClose" ist.
Vom Prinzip ist es die "manuelle" Zuweisung, was du sonst im Objekt-Inspektor machst.
Ist hier die einzige Möglichkeit, da FKalender in einer eigenen Unit liegt, und nichts von der MainForm weiss (Weil nicht in Uses wegen Zirkelbezug)
Code: Alles auswählen
procedure TMainForm.KalenderFormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
CloseAction:=caNone;
FreeAndNil(FKalender);
BGRAShapeKalender.Visible:=False;
end;
FKalender.Free funzte bei mir tatsächlich auch nicht. FreeAndNil behebt das aber.
Achtung: WICHTIG: Da du FKalender NICHT modal anzeigst, kann es in o.g. Code zum Knall kommen (in meiner als auch in deiner Variante), und zwar wenn der User zwar den Kalender öffnet, aber dann bei offenem FKalender die MainForm schliesst (was er kann, da FKalender die MainForm nicht blockiert).
Wenn er DANN den FKalender schliesst, knallts, weil FKalender dann einen Code ausführen will, welcher nicht mehr im Speicher ist.
Ich habs nicht getestet, ist also Vermutung, da das Create des FKalender mit Owner MainForm ausgeführt wird.
Weiss jetzt aus dem Stegreif auch nicht mehr, ob die MainForm dann FKalender mit ins Grab nimmt, wenn der User MainForm schliesst.
Ausprobieren