Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Prüfen, ob ShowModal läuft? (https://www.delphipraxis.net/185217-pruefen-ob-showmodal-laeuft.html)

AlexII 22. Mai 2015 16:35

Prüfen, ob ShowModal läuft?
 
Hallo,

ich möchte wissen, ob eine modales Formular läuft bzw. gerade offen ist.

Delphi-Quellcode:
if Form.ShowModal = 1 {oder andere Zahl?} then
if Form.Visible then
if ShowModal.Show then
Wie macht man das richtig? Danke!

Perlsau 22. Mai 2015 16:44

AW: Prüfen, ob ShowModal läuft?
 
ShowModal ist eine Funktion, die eine Form modal aufruft und beim Schließen einen Integer zurückliefert. Daher macht es aus meiner Sicht keinen Sinn, nach dem Aufruf von ShowModal darauf zu test, ob die Form noch visible ist, denn das ist sie mit Sicherheit nicht.

AlexII 22. Mai 2015 16:47

AW: Prüfen, ob ShowModal läuft?
 
Ok... aber wie kann ich prüfen, ob das modale Form gerade offen ist oder nicht?

jbg 22. Mai 2015 17:02

AW: Prüfen, ob ShowModal läuft?
 
Zitat:

Zitat von AlexII (Beitrag 1302620)
Ok... aber wie kann ich prüfen, ob das modale Form gerade offen ist oder nicht?

Während ShowModal läuft, ist fsModal in FormState gesetzt.
Delphi-Quellcode:
if fsModal in MyForm.FormState then
begin
  // VCL-Formular wird modal angezeigt
end;

Perlsau 22. Mai 2015 17:08

AW: Prüfen, ob ShowModal läuft?
 
Zitat:

Zitat von AlexII (Beitrag 1302620)
Ok... aber wie kann ich prüfen, ob das modale Form gerade offen ist oder nicht?

... oder einfach Form.Visible abfragen. Nachdem du ein Formular modal aufgerufen hast, ist die Prüfung im aufrufenden Formular sinnlos, denn die ergibt immer Visible = False. Das ist deshalb so, weil der Programmzeiger ja erst nach dem Schließen der modalen Form zurückkehrt, und nach dem Schließen einers Formulars ist Visible immer False, sonst wäre das Formular ja nicht geschlossen worden.

Oder anders ausgedrückt: Du kannst vom aufrufenden Formular aus nicht prüfen, ob ein modal aufgerufenes Formular sichtbar ist, denn du bist zu diesem Zeitpunkt nicht im aufrufenden Formular. Wenn du wieder im aufrufenden Formular bist, ist das modal aufgerufene Formular wieder geschlossen.

Ich hoffe, das war jetzt unmißverständlich 8-)

Zitat:

Zitat von jbg (Beitrag 1302623)
Zitat:

Zitat von AlexII (Beitrag 1302620)
Ok... aber wie kann ich prüfen, ob das modale Form gerade offen ist oder nicht?

Während ShowModal läuft, ist fsModal in FormState gesetzt.
Delphi-Quellcode:
if fsModal in MyForm.FormState then
begin
  // VCL-Formular wird modal angezeigt
end;

Von wo aus soll denn das modal angezeigte Formular abgefragt werden?

AlexII 22. Mai 2015 17:34

AW: Prüfen, ob ShowModal läuft?
 
OK, danke euch! :thumb:

jbg 22. Mai 2015 19:30

AW: Prüfen, ob ShowModal läuft?
 
Zitat:

Zitat von Perlsau (Beitrag 1302624)
Von wo aus soll denn das modal angezeigte Formular abgefragt werden?

Von einem Timer oder OnIdle zum Beispiel.

Ich habe in der initialen Frage nichts gesehen, was darauf schließen lässt, dass er die Modalität erst nach dem ShowModal abfragen möchte. Seine Beispiele demonstrieren nur drei verschiedene (nicht funktionierende) Versuche die Modalität abzufragen. Zumindest habe ich das so aufgefasst.

Sir Rufo 22. Mai 2015 19:31

AW: Prüfen, ob ShowModal läuft?
 
@jbg :thumb:

Dalai 22. Mai 2015 19:35

AW: Prüfen, ob ShowModal läuft?
 
Aber wenn man innerhalb eines modalen Formulars die Modalität abfragt, weiß man doch bereits vorher, dass es modal ist. Klar, das Form könnte auch mit .Show (also nicht-modal) aufgerufen worden sein, aber das kann man doch als Programmierer selbst steuern. Oder hab ich da was nicht verstanden oder mitbekommen?

MfG Dalai

himitsu 22. Mai 2015 19:43

AW: Prüfen, ob ShowModal läuft?
 
Man kann in einer gemeinsam genutzten Methode sowas abfragen, wenn man es wissen muß und nicht weiß ob es das ist.

Aber solange hier in zwei Threads nur zusammenhanglose Stückchen gezeigt werden und alles Wichtige fehlt, hat es eh keinen Sinn eine Lösung finden zu wollen.
Meine Galskugel ist grade in der Reinigung.

sahimba 22. Mai 2015 22:18

AW: Prüfen, ob ShowModal läuft?
 
-quatsch-

Laaeris 15. Mär 2018 17:11

AW: Prüfen, ob ShowModal läuft?
 
Liste der Anhänge anzeigen (Anzahl: 1)
...ich bin mir nicht sicher, ob das wirklich alles Quatsch ist.
Folgendes Problem:

Hauptform mit zwei Detailforms, in diesem Fall die Objekte Vereine und Spiele.

Ich kann ein Spiel Modal aufrufen -> das Spiel hat Vereine, die ich aufrufen kann -> Der Verein hat Spiele, die ich aufrufen kann -> ...
Ich verwende aus dem Hauptformular für beides Showmodal und kann aus dem Detailformular jeweils ein weiteres aufrufen:

Hauptform -> Spiel -> Verein
Hauptform -> Verein -> Spiel

Danach ist aber Schluss. Wenn jetzt jemand über ein Spiel in einen Verein kommt, hier ein ANDERES Spiel sehen will, bin ich mit dieser Kette derzeit am Ende und es kommt eine nachvollziehbare Fehlermeldung.
Ich will die Forms nicht mit .Show aufrufen, das macht mehr Probleme als es löst.

Welchen Weg würdet Ihr gehen?
Ich habe versucht das mal grafisch abzubilden - Schritt 3 in meinem Bild geht so nicht.

himitsu 15. Mär 2018 17:40

AW: Prüfen, ob ShowModal läuft?
 
Zitat:

nachvollziehbar
Nicht wirklich.
OK, in Bezug auf dass du die selbe Form nochmal modal aufrufen willst, obwohl sie gerade sichtbar ist (modal oder nicht) ... ja, da muß eine Exception kommen.

Wenn du die Forms aber nicht automatisch beim Programmstart erstellen lässt, sondern erst beim Anzeigen/Aufrufen dynamisch erzeugst, dann kannst du jedes Fenster mehrmals "gleichzeitig" erzeugen und anzeigen.
(in den Forms z.B. ins OnClose ein
Delphi-Quellcode:
Action:=caFree
)

aktuell bei dir:
* Delphi-Referenz durchsuchenApplication.ModalLevel gibt an, wie viele modale Forms es gibt
* in Delphi-Referenz durchsuchenTForm.FormState steht ob es grade Modal angezeigt wird (fsModal), aber auch einfach auf DeineForm.Visible schauen reicht, also ob die Form schon sichtbar ist

hoika 15. Mär 2018 17:43

AW: Prüfen, ob ShowModal läuft?
 
Hallo,
Action:= caFree war doch nur für MDI?

Zitat:

bin ich mit dieser Kette derzeit am Ende und es kommt eine nachvollziehbare Fehlermeldung
Warum am Ende?

himitsu 15. Mär 2018 17:48

AW: Prüfen, ob ShowModal läuft?
 
Am Ende, weil dann bestimmt die Fehlermeldung "Eine sichtbare Form kann nicht Modal angezeigt werden" kommt.
Form1.ShowModal -> Form2.ShowModal -> Form1.ShowModal *peng*

caFree: Nein, das geht bei allen Fenstern.
Damit wird ja nur dafür gesorgt, dass sich das Fenster selber freigibt, wenn man es z.B. mit [X] schließt. (externe Variablen, welche auf diese Form zeigen sollte man da natürlich auch wegräumen oder erst garnicht sowas einbauen)

KodeZwerg 15. Mär 2018 21:53

AW: Prüfen, ob ShowModal läuft?
 
Vorschlag:
Ein neues Hauptformular erstellen was im End-Effekt nur ein Wrapper für die anderen Formulare wird.
Vielleicht ein mini-Fenster (ohne Titelleiste) mit ein paar Knöpfen drauf um die Formulare sichtbar zu machen?
(oder die Knöpfe als multi-funktions-anzeige nutzen, beispiel geöffnete Formulare = der Knopf hat ein anderes Bild)
Die Original Formulare selbst aus der .dpr rausnehmen und dynamisch einbinden, jetzt nur noch eine Fenster-Kontrolle einbauen damit nichts doppelt geöffnet wird.
Nachtrag: das Wrapper Fenster kann ja in den SysTray abgelegt werden sowie ein Formular offen ist, oder ein miniaturisiertes Formular, oder transparent oder dies oder das.
Dreh- und Angelpunkt ist dann der Wrapper dem Du alles beibringen musst was Du benötigst, könnte auch dienen um Daten zwischen Formularen auszutauschen (senden/empfangen). Je nach Bedürfnis.
Achja, und generell auf ShowModal in diesem Zusammenhang verzichten da ja verschiedene Fenster aktiv sein könnten oder ShowModal konsequenter einsetzen ohne das im ShowModal weitere Fenster erstellt werden.
Ich nutze ShowModal nur bei Fenstern wo ich unbedingt eine User-Eingabe erwarte. Beispiel: Datei überschreiben Dialog.
Ps: Ich habe auch bei ShowModal oft das Problem das falls ein Fehler Auftritt, der Windows-Fehler-Dialog "unter" dem ShowModal erstellt wird, sprich: ich komm nicht ran um "Ok" zu klicken. Alt-Tab und Eingabetaste mag zwar eine Notlösung sein, aber ein nicht-OnTopModal-Fenster ist unkomplizierter in solchen Fällen.

hoika 16. Mär 2018 06:58

AW: Prüfen, ob ShowModal läuft?
 
Hallo,
Zitat:

Die Original Formulare selbst aus der .dpr rausnehmen und dynamisch einbinden,
OK, das geht einfach

Zitat:

jetzt nur noch eine Fenster-Kontrolle einbauen damit nichts doppelt geöffnet wird.
Aber
Form2 öffnet Form3, Form3 öffnet Form2, Form2 öffnet Form3

Wie soll das gehen?
Dazu müsste man sich den jeweiligen Status merken.

Jasocul 16. Mär 2018 07:20

AW: Prüfen, ob ShowModal läuft?
 
Einige Vorschläge gruseln mich wirklich.

1. Die Formen (in dieser Konstellation) immer dynamisch erzeugen.
2. Kein direkter Zugriff von einer Form auf die andere und umgekehrt. Parameter sind da hilfreich beim Erzeugen.

Ich mache das üblicherweise so:
Delphi-Quellcode:
class function TForm3.ShowFormModal(Sender: TComponent; <Parameterliste>): TModalResult;
var
  frm : TForm3;
begin
  frm := TForm3.Create(Sender);
  try
    Result := frm.ShowModal;
  finally
    frm.Free;
  end;
end;
Bitte beachten, dass es sich um eine
Delphi-Quellcode:
CLASS FUNCTION
handelt.
Wenn man das analog für Form2 macht, kollidiert auch nichts.
Ein eventueller Informationsaustausch erfolgt über die angedeutete Parameterliste. Mit Var-Parametern kann man sich dann auch Informationen zurück geben lassen.

Die entsprechenden globalen Variablen Form2 und Form3 zur Sicherheit gleich löschen. Dann kann man die auch nicht mehr versehentlich benutzen.

himitsu 16. Mär 2018 07:34

AW: Prüfen, ob ShowModal läuft?
 
Und soll diese Form nur einmal existieren, dann kommt
Delphi-Quellcode:
frm
in eine CLASS VAR. (Free > FreeAndNil)
So kann man vor dem Create mit Assign prüfen und dann entweder einen Fehler werfen oder die bestehende Form wiederverwenden, also z.B. mit neuem Inhalt füllen.

KodeZwerg 16. Mär 2018 11:00

AW: Prüfen, ob ShowModal läuft?
 
Genau @himitsu, in manchen Projekten verwende ich es so.
Nur das bei mir der Wrapper ein unsichtbares 1x1px Fenster ist, Form1 wird automatisch geöffnet.
Die Formulare haben keinen Zugriff untereinander, das regelt alles der Wrapper.
Wenn Form1 nun Form2 sichtbar haben will, wird eine Anfrage an Wrapper gestellt,
der weiß zu jedem Zeitpunkt was in welchen Modus offen ist.
Wenn Form1 was an Form2 schicken will, geschieht dies, na ratet mal, genau, über den Wrapper.
Auf diese Weise kann man alles ohne komplikationen Regeln, jedenfalls traten bei mir (noch) keine auf.
Ob Form2 beim klick auf [X] nun Zerstört oder versteckt wird oder lediglich Form1 Fokus bekommt, muss jeder selbst Entscheiden.

günni0 16. Mär 2018 11:10

AW: Prüfen, ob ShowModal läuft?
 
Kann man statt einem Fenster-Wrapper nicht eine Unit ohne sichtbares Fenster nehmen?

KodeZwerg 16. Mär 2018 11:51

AW: Prüfen, ob ShowModal läuft?
 
Bei mir hat es den Hintergrund, mein 1x1 Fenster dient mir gleichzeitig als Log was auch dargestellt werden kann.
Wenn kein Wrapper Fenster, dann ist soweit ich weiß, wenn Du das erste Fenster [X]'st = Programm ist geschlossen.
Also wenn Form1 als Standard genommen wird und Form1 [X] dann ist alles zu.
Wenn ein Wrapper Fenster, ob sichtbar oder nicht, existiert, kann auch das Programm überleben.
Bei mir wird das 1x1 Fenster normalisiert sowie kein Formular angezeigt wird.

Man kann natürlich auf einen Wrapper verzichten und alles in der Form1 Regeln lassen bei in etwa gleichem Prinzip.

günni0 16. Mär 2018 14:10

AW: Prüfen, ob ShowModal läuft?
 
Wäre es eine Alternative eine Wrapper-Unit zu haben die für das Ein- und Ausblenden von Forms zuständig ist?
Form1 fragt Wrapper-Unit an, Wrapper-Unit zeigt Form2 an.
Nun weiß die Wrapper-Unit, welche/s Fenster offen ist/sind.

Laaeris 17. Mär 2018 19:46

AW: Prüfen, ob ShowModal läuft?
 
...erstmal vielen Dank für die hilfreichen Ideen. Hingekriegt habe ich noch nichts Sinnvolles, aber ich arbeite dran. Leider habe ich viele der Wege noch nie beschritten, so dass ich erstmal ein bisschen lernen muss...

Und das Problem mit dem ShowModal (dass das Auswahlfenster nicht vorne ist inkl. des Workarounds) habe ich auch manchmal, und ich bin auch kein Fan von ShowModal, leider multipliziert sich das Problem bei mir, wenn ich die meisten Fenster Show öffne und nur wenige Showmodal. Wie gesagt, ich probiere gerade ein wenig herum.
Sobald ich eine für mich "schöne" Lösung habe, melde ich mich wieder. :-)

Viele Grüße

David

KodeZwerg 17. Mär 2018 21:12

AW: Prüfen, ob ShowModal läuft?
 
Kein Ding, Fragen kostet ja nichts. Wenn Du Probleme bei der Umsetzung der verschiedenen Vorschläge hast, ich nehm ein erneutes nachfragen nicht böse.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 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-2025 by Thomas Breitkreuz