Also mal ganz von vorne:
Ein Form ruft man deshalb modal auf, um zu verhindern, daß der Anwender in der aufrufenden Form herumwerkelt, so lange die modale Form sichtbar ist. In der modalen Form hat der Anwender nun das eine oder andere zu erledigen. Je nachdem, was der Anwender dort macht, wird Modalresult gesetzt, und zwar
innerhalb der modalen Form – was anderes geht ja gar nicht, denn der Anwender kann zu diesem Zeitpunkt ausschließlich in der modalen Form was machen, auf die Mainform hat er keinen Zugruff, das ist die Bedeutung von Modal. So weit, so gut.
Wenn du nun die modale Form ohne Zuweisung von Modalresult via Close schließt, erhält Modalresult immer den Wert mrNone. Die Zuweisung eines anderen Wertes – noch immer ist die modale Form sichtbar! – schließt die modal angezeigte Form; der Programmzeiger kehrt zum nächsten Befehl in der Mainform (bzw. der aufrufenden Form) zurück und führt diesen aus. Jetzt ist die "modale" Form nicht mehr geöffnet, es gibt also gar keine modale Form mehr ... wir erinnern uns: modal heißt, daß die aufrufende Form gesperrt ist, und natürlich alle anderen Formulare deiner Anwendung ebenso, sollten sie sichtbar sein.
Nun versuchst du von deiner Mainform aus Modalresult zu setzen. Das macht keinen Sinn. Modalresult als Rückgabewert (result) der modal aufgerufenen Form wird
immer in letztgenannter gesetzt. Immer! Du kannst doch gar nicht von der Mainform aus das modale Fenster schließen, denn der Programmzeiger befindet sich in der modal angezeigten Form, so lange diese nicht geschlossen wird, und kehrt erst wieder zur Mainform zurück, nachdem die modal angezeigte Form geschlossen wurde.
Zum Schließen der modalen Form setzt du dort z.B. einen Button, der Modalresult auf mrOK setzt:
Delphi-Quellcode:
Procedure TMyModalForm.BtnOkayClick(Sender : TObject);
Begin
ModalResult := mrOK;
End;
Oder du klickst auf einen Abbrechen-Button:
Delphi-Quellcode:
Procedure TMyModalForm.BtnCancelClick(Sender : TObject);
Begin
ModalResult := mrCancel;
End;
Oder du klickst auf einen Schließen-Button:
Delphi-Quellcode:
Procedure TMyModalForm.BtnCloseClick(Sender : TObject);
Begin
Close;
End;
ich versuche wie folgt ein modales Fenster zu schließen:
Delphi-Quellcode:
procedure TMainForm.SetAppOnline();
begin
OfflineForm.Visible := False;
//oder
OfflineForm.ModalResult := mrCancel;
//oder
OfflineForm.ModalResult := mrOK;
end;
bekomme aber immer diese Fehlermeldung, siehe Anhang. Wie bekomme ich das modale Fenster aus dem Hauptfenster zu?
Diese Fehlermeldung bekommst du, weil OfflineForm nicht visible ist. Du kannst Modalresult nicht von einer anderen Form aus setzen, sondern immer nur in der modal angezeigten Form selber. Das ist doch logisch, denn ModalResult dient dazu, die modale Form mit einem bestimmten Rückgabewert zu schließen. Jede Zuweisung an ModalResult (außer mrNone) schließt die modal angezeigte Form. Sonst würde ja auch die Zuweisung von Modalresult keinen Sinn machen.
Ich hoffe, daß es jetzt klar ist, ansonsten muß ich hier leider passen, mir geht die Geduld etwas flöten, weil ich schon seit 4 Uhr auf den Beinen (bzw. auf dem Hintern) bin
Wo kommt der Fehler, bei allem zusammen, oder wirklich nur bei einem der Oder?
OfflineForm.ModalResult := irgendwas_ungleich_mrNone;
oder OfflineForm.Close;
sind die offiziellen Wege, eine modale Form zu schließen. (Close setzt intern auch nur das ModalResult auf mrAbort oder vermutlich eher auf mrCancel ... weiß grade nicht genau was)
AlexII versucht, im Formular OfflineForm das Property ModalResult von der Mainform aus zu setzen. Zu diesem Zeitpunkt kann OfflineForm aber gar nicht modal sichtbar sein. Wäre OfflineForm modal geöffnet, würde der Programmzeiger niemals an diese Stelle kommen, um ModalResult von der Mainform aus zu setzen. Man bekommt ein modales Fenster nicht "von der Hauptform zu". Der Programmzeiger kann gar nicht in den Code der Hauptform zurückkehren, so lange das modale Fenster angezeigt wird. Modal heißt doch nicht, okay, dann wechsle ich jetzt schnell mal wieder in die Hauptform und mach das dann von dort aus zu. Das auch nur anzudenken ist Unsinn hoch 3.
Die Fehlermeldung ist offensichtlich irreführend, denn sie sagt aus, das Fenster sei bereits modal geöffnet.