![]() |
AW: Prüfen, ob ShowModal läuft?
-quatsch-
|
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. |
AW: Prüfen, ob ShowModal läuft?
Zitat:
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: * ![]() * in ![]() |
AW: Prüfen, ob ShowModal läuft?
Hallo,
Action:= caFree war doch nur für MDI? Zitat:
|
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) |
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. |
AW: Prüfen, ob ShowModal läuft?
Hallo,
Zitat:
Zitat:
Form2 öffnet Form3, Form3 öffnet Form2, Form2 öffnet Form3 Wie soll das gehen? Dazu müsste man sich den jeweiligen Status merken. |
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:
Bitte beachten, dass es sich um eine
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;
Delphi-Quellcode:
handelt.
CLASS FUNCTION
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. |
AW: Prüfen, ob ShowModal läuft?
Und soll diese Form nur einmal existieren, dann kommt
Delphi-Quellcode:
in eine CLASS VAR. (Free > FreeAndNil)
frm
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. |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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