![]() |
Wie ShowModal Form aus dem HauptForm schließen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich versuche wie folgt ein modales Fenster zu schließen:
Delphi-Quellcode:
bekomme aber immer diese Fehlermeldung, siehe Anhang. Wie bekomme ich das modale Fenster aus dem Hauptfenster zu?
procedure TMainForm.SetAppOnline();
begin OfflineForm.Visible := False; //oder OfflineForm.ModalResult := mrCancel; //oder OfflineForm.ModalResult := mrOK; end; Danke! |
AW: Wie ShowModal Form aus dem HauptForm schließen?
Wo kommt der Fehler, bei allem zusammen, oder wirklich nur bei einem der Oder?
Delphi-Quellcode:
oder
OfflineForm.ModalResult := irgendwas_ungleich_mrNone;
Delphi-Quellcode:
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)
OfflineForm.Close;
* Du hast die QuellCodes der FCL rumliegen * Du hast den Fehlertext * Du könntest eventuell auf die Idee kommen und da drin z.B. nach dem Fehlertext (oder Teilen davon) zu suchen, nachzuschauen warum Dieses angezeigt wird und schon weißt du auch das Warum. (oder Pause drücken und hoffen man erkennt im Stacktrace wo der Aufruf her kommt und so dort hinzufinden, bzw. man debuggt sich vor dem Knall zu der Stelle) PS: Auch Lazarus wird bestimmt Strg+C kennen, mit dem man Dialoge als "Text" kopieren kann. (meist hört man ein liebevolles Beep, als Bestätigung) |
AW: Wie ShowModal Form aus dem HauptForm schließen?
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:
Oder du klickst auf einen Abbrechen-Button:
Procedure TMyModalForm.BtnOkayClick(Sender : TObject);
Begin ModalResult := mrOK; End;
Delphi-Quellcode:
Oder du klickst auf einen Schließen-Button:
Procedure TMyModalForm.BtnCancelClick(Sender : TObject);
Begin ModalResult := mrCancel; End;
Delphi-Quellcode:
Procedure TMyModalForm.BtnCloseClick(Sender : TObject);
Begin Close; End; Zitat:
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 :? Zitat:
Die Fehlermeldung ist offensichtlich irreführend, denn sie sagt aus, das Fenster sei bereits modal geöffnet. |
AW: Wie ShowModal Form aus dem HauptForm schließen?
Der erste Teil der Fehlermeldung klang so, als wenn die Form sichtbar ist.
Genauso, wie wenn man ShowModal aufruft, während die Form sichtbar ist. Wie will die LCL erkennen, ob jemand "Fremdes" das ModalResult setzt? Solange man das nicht bösartig in einem anderem Thread macht (was man niemals machen sollte), kann das doch auch eine Methode sein, welche über die modale Form ausgelöst wurde. :gruebel: Oder hat die LCL zwei der Property? Eein Internes und ein Öffentliches. :shock: |
AW: Wie ShowModal Form aus dem HauptForm schließen?
Alle oben genannten Versuche führen zu dem Fehler, OfflineForm.Close; auch.
|
AW: Wie ShowModal Form aus dem HauptForm schließen?
@AlexII
Perlsau hat es schon angesprochen und auch ich frage mich seit einigen Threads, ob du dir des Sinns des ShowModal Fensters sicher bist. In der Regel ruft man ein Fenster ShowModal auf, um in des Fenster zu wechseln. Bin ich also in Form1 und rufe daraus das Fenster Form2 modal auf, will ich nun mit meiner Arbeit in des Form2 Fenster wechseln. Rufe ich es auf, will ich, dass der Anwender nun in Form2 arbeitet, aber nicht in Form1. Will ich nur ein zweites Fenster parallel zum ersten Fenster, rufe ich es normal auf. Will ich, dass Form2 über Form1 ist, stelle ich es StayOnTop. Nur welchen Sinn macht es ein Fenster ShowModal aufzurufen um weiter im alten Fenster zu arbeiten? Habe ich Form1 und Form2 und will ich Form2 zusätzlich auf dem Fenster haben, rufe ich es mit Show auf. Will ich, dass Form2 Top ist, stelle ich es so ein. Habe ich Form1 und Form2 und will mit der Arbeit in Form2 wechseln, rufe ich es mit ShowModal auf. Will ich, dass Form2 Top ist, stelle ich es so ein. Dialogfenster für Öffnen, Speichern, Font, Farbe, usw. sind ShowModal. Rufe ich sie auf, will ich ein Ergebnis haben. Ich rufe das Speichern Dialogfenster nicht auf um noch weiter im Hauptfenster zu arbeiten. |
AW: Wie ShowModal Form aus dem HauptForm schließen?
Natürlich kann man eine modale Form auch von ausserhalb schliessen, dazu benötigt man aber z.B. einen Timer.
Die Fehlermeldung sagt aber aus, dass schon der Aufruf von
Delphi-Quellcode:
fehlschlägt und somit dieser bisher gezeigte Code für den Fehler nicht aber auch absolut gar nicht verantwortlich ist.
OfflineForm.ShowModal
|
AW: Wie ShowModal Form aus dem HauptForm schließen?
Ich bin mir nicht sicher, ob du verstehst, was ein modales Fenster ist, und wie Perlsau es erklärt hat. Versuchen wir es mal mit einem (zum Teil sinnfreien) Beispiel:
Delphi-Quellcode:
Wann taucht deiner Meinung nach die Meldung 'blub' auf? Wenn du das ggf. mal ausprobierst, wird dir vielleicht klar, wie der Programmablauf ist und warum eine Zuweisung an ModalResult in diesem Kontext - im Code oben innerhalb der Klasse TForm1 - keinerlei Sinn hat, innerhalb der Klasse TfmStartupProperties (=blockierendes Kindfenster von TForm1) hingegen schon.
function TForm1.PluginShowForm(const AhParent: HWND): Boolean;
var fmStartupProperties: TfmStartupProperties; begin fmStartupProperties:= TfmStartupProperties.Create(nil, AhParent); try fmStartupProperties.ShowModal; ShowMessage('blub'); finally fmStartupProperties.Free; end; end; MfG Dalai |
AW: Wie ShowModal Form aus dem HauptForm schließen?
Zitat:
Egal, ich guck jetzt meinen Film weiter, das ist entspannender :lol: Zitat:
Zitat:
Delphi-Quellcode:
Ist OfflineForm modal sichtbar, komme ich an diesen Button auf dem Mainform ja gar nicht ran. Ein OnIdle hab ich nicht gefunden, und einen Timer laufen zu lassen, ist mir jetzt zu viel Streß.
procedure TFormMain.Button1Click(Sender: TObject);
begin //OfflineForm.Visible := False; //OfflineForm.ModalResult := mrCancel; OfflineForm.ModalResult := mrOK; end; |
AW: Wie ShowModal Form aus dem HauptForm schließen?
OfflineForm wird auch wirklich modal angezeigt?
Um das zu prüfen, was die Perlsau meint: Eine Methode in die Form, da drin Close aufrufen und dann rufst du diese Methode auf. Ich bin was essen, hab keine Lust mir die LCL runterzuladen und das zu machen, was der TE auch selber machen kann. > nachsehen, warum es diese Meldung gibt (da findet man garantiert ein paar IFs und die sagen Einem, was sie nicht mögen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz