![]() |
Formular modal öffnen
Hallo,
ich bin eigentlich kein grober Neuling in Delphi und scheitere doch an den einfachsten Problemen, dank dieses neuen tollen FireMonkey-Frameworks... Ich habe eine Formularklasse TfLabTokenMapping. Darin enthalten ist eine Klassenfunktion, die die Klasse instanziiert und das Formular modal anzeigen soll. Es handelt sich um einen Konfigurationsdialog, bei dem ein String mit Einstellungen (MappingList) und ein boolesches Result (False = Klick auf Abbrechen) zurückgegeben werden sollen. Die Klassenfunktion wird von einer Methode im Hauptformular mit einigen, hier im Detail unwichtigen Parametern aufgerufen. Konkret geht es mir um den hier korrekten Aufruf von ShowModal(...) und bestenfalls noch um das Freigeben des Speichers. Ich habe zwei Varianten ausprobiert. Variante 1: ShowModal mit anonymer Funktion aufrufen. Ich bin kein Freund davon, doch ist das wohl der von Embarcadero empfohlene Weg. Die Variablen aNewMappingList und Result können nicht direkt von der anonymen Funktion aufgenommen werden (Compilerfehler). Deshalb lege ich sie erst in lokale Variablen ab, die ich anschließend kopiere.
Delphi-Quellcode:
Problem dabei ist, dass ShowModal in diesem Fall nicht modal / blockierend ausgeführt wird. Frechheit von FireMonkey. Damit rattert mein Code durch und selbst die aufrufende Methode wird weiter fortgesetzt. Natürlich sind aNewMappingList und Result dann noch nicht gesetzt worden. Kann ich das Blockieren irgendwie erzwingen?
class function TfLabTokensMapping.ChangeMapping(aRequiredLabParams, aCurrentMappingList, aAllLabTokensWithDesc: string; out aNewMappingList: string): Boolean;
var fLabTokensMapping: TfLabTokensMapping; l_NewMappingList: string; l_Result: Boolean; begin // Nur etwas initialisieren und eine Parameterprüfung Result := False; aNewMappingList := EmptyStr; if Length(Trim(aRequiredLabParams)) = 0 then Exit; // Das Formular erzeugen fLabTokensMapping := TfLabTokensMapping.Create(nil, aRequiredLabParams, aCurrentMappingList, aAllLabTokensWithDesc); // Das Formular anzeigen fLabTokensMapping.ShowModal( procedure(ModalResult: TModalResult) begin if (ModalResult = mrOk) then begin l_NewMappingList := fLabTokensMapping.Mapping; l_Result := True; end else begin l_Result := False; end; end); // Werte zurück geben aNewMappingList := l_NewMappingList; Result := l_Result; end; Variante 2: So, wie ich das aus der VCL gewohnt bin:
Delphi-Quellcode:
Jetzt blockiert ShowModal auch. Jedoch bekommen ich nun seltsames Verhalten nach Rückkehr zu meinem Hauptformular. Irgendwie scheinen einige Messages nicht mehr verarbeitet zu werden. Button-Klicks machen nichts mehr, Hover-Events und das Verschieben des Formulars funktionieren noch. Seltsam.
class function TfLabTokensMapping.ChangeMapping(aRequiredLabParams, aCurrentMappingList, aAllLabTokensWithDesc: string; out aNewMappingList: string): Boolean;
var fLabTokensMapping: TfLabTokensMapping; l_NewMappingList: string; l_Result: Boolean; begin // Nor Initialisierungen und eine Parameterprüfung Result := False; aNewMappingList := EmptyStr; if Length(Trim(aRequiredLabParams)) = 0 then Exit; // Das Formular erzeugen fLabTokensMapping := TfLabTokensMapping.Create(nil, aRequiredLabParams, aCurrentMappingList, aAllLabTokensWithDesc); // Formular anzeigen und Ergebnis zurück geben if (fLabTokensMapping.ShowModal = mrOk) then begin aNewMappingList := fLabTokensMapping.Mapping; Result := True; end else begin Result := False; end; end; Das modale Fenster gebe ich übrigens in beiden Varianten per FormClose() frei:
Delphi-Quellcode:
Was kann ich tun? Weiß irgendjemand Rat?
procedure TfLabTokensMapping.FormClose(Sender: TObject; var Action: TCloseAction);
begin Action := TCloseAction.caFree; end; Vielen Dank schon einmal. |
AW: Formular modal öffnen
Zitat:
|
AW: Formular modal öffnen
Du musst dich besser generell dran gewöhnen das ShowModal auf iOS und Android verboten ist.
![]() Oder direkt mit einer anonymen Prozedur hinten dran. Rollo |
AW: Formular modal öffnen
Okay, danke schon mal für eure Antworten.
Das ist aber natürlich schade, dass es kein ShowModal mehr gibt ): Ich bin immer mehr der Meinung, dass sich der Einsatz von FireMonkey nur lohnt (und sonst nur Ärger macht), wenn man wirklich für verschiedene Plattformen entwickelt, was wir leider nicht tun. Wieso dann Firemonkey? War nicht meine Entscheidung, und lässt sich jetzt auch nicht mehr so schnell umändern. Okay, zur Sache... Aktuell werden vom Hauptformular, das die beschriebene Mathode aufruft, die Einstellungen entgegen genommen und in einer Datei gespeichert. Jetzt würde ich das spontan so umbauen, dass das Hauptformular die Methode aufruft und wie von Sir Rufo beschrieben eine Call-Back-Funtion übergibt, die dann von der anonymen Funktion im ShowModal(...) aufgerufen wird und die die Einstellungen in die Datei schreibt. Hoffe, dass das funktionieren wird. Danke euch vielmals. |
AW: Formular modal öffnen
Zitat:
|
AW: Formular modal öffnen
Zitat:
Denn mit den neuen anonymen Prozeduren bleiben ShowMessage etc. erhalten wie bisher, nur eben nicht Modal --> so das die Anwendung responsiv bleibt. Das ist nicht nur gut für iOS und Android, auch Win Anwendungen sind besser wenn nicht bis zum Klick alles blockiert wird. Da muss man mal ein bischen Umdenken, aber es lohnt sich die alten Zöpfe abzuschneiden. Rollo |
AW: Formular modal öffnen
Zitat:
Das Projekt, das ich betreue, habe ich von meinem Kollegen übernommen, der (meine ich) auf FireMonkey aufgestiegen ist, weil er neugierig war. Finde ich grundsätzlich auch die richtige Einstellung. Nur gingen bei uns einfach schon etliche Stunden / Tage ins Land, um Firemonkey-Probleme zu lösen, die aus meiner Sicht sich nicht immer mit unserer anfänglichen FMX-Unkenntnis begründen liesen. Um ganz ehrlich zu sein ... würde ich heute ein Projekt ganz neu starten, und wäre Plattformunabhängigkeit kein Thema, wohl aber Effizienz und Zukunftssicherheit, ich ginge vermutlich auf die Microsoft-Schiene, C#.NET oder so. Das ist jetzt natürlich meine ganz persönliche Meinung und wurde hier bestimmt schon ganz oft diskutiert :-D Als mehrjähriger Delphi-Entwickler kann ich sagen, dass Delphi an sich toll ist :) Doch den immer von Embarcadero propagierten "stark wachsenden Markt" kann ich bei den Embarcadero-Produkten aktuell leider nicht sehen. Ich habe die Befürchtung, dass Embarcadero weiterhin Marktanteile verlieren wird und deshalb letztlich zuerst die Qualitätssicherung, später dann die komplette Neuentwicklung bei Embarcadero zurückgehen wird. Ersteres ist IMHO jetzt schon teilweise der Fall. Zumindest die Codegear-Zeiten haben Delphi wirklich nicht gut getan. Microsoft dagegen ist für mich bekannt für einwandfrei integrierte (Microsoft-Landschaft halt), robuste und effiziente Lösungen für die Entwicklung. Microsoft ist stark hinterher, Fehler zu korrigieren, und die Dokumentationen sind sehr ausführlich. Zudem bietet Microsoft das meiste kostenlos an (Windows wird billger / kostenloses Upgrade, Visual-Studio Express-Editions, Dreamspark für Schüler / Studenten) etc.. . Und auch wenn Microsoft der "böse Gigant" ist, gefällt mir Microsofts Produktstrategie meistens ganz gut. Okay, entschuldigt den Off-Topic :) |
AW: Formular modal öffnen
Zitat:
|
AW: Formular modal öffnen
Zitat:
danke für deine Antwort. Ich dachte auch zunächst, das ShowModal ohne anonyme Funktion entspräche absolut der Fuktionalität wie in der VCL. Tatsächlich bekomme ich, sofern ich das Formular auch irgendwie freigeben möchte, jedoch immer unerwartetes Verhalten. Ich habe schon verschiedene Möglichkeiten ausprobiert, bis hin das Formular gar nicht freizugeben (Nicht schön, aber besser als nichts.). Das modale Fenster mag sich auch schließen, doch mal bekomme ich dann in Events (Hover etc...) des Hauptformulars seltsame Zugriffsverletzungen, mal frieren Teile der UI ein, da manche Events offenbar gar nicht mehr getriggert werden (z.B. Click bei manchen Buttons), mal läuft irgendwas mit den Styles schief, sodass anstatt des Iceberg-Blaus plötzlich alles schwarz wird, mal crasht die ganze Anwendung. Kurzum, alles lässt mich darauf schließen, dass Firemonkey intern ein per ShowModal(<Keine Parameter>) angezeigtes Fenster nicht richtig verwaltet, zumindest nicht so wie in der VCL. Ich habe schon jahrelange VCL-Erfahrung und müsste eigentlich wissen, wie man ein Fenster auf macht (Wenn die Luft im Büro stickig ist ;) ), aber ich lass mich natürlich gerne eines besseren belehren, vlt. mache ich tatsächlich etwas falsch. Ich habe in meinem Eingangspost unter "Variante 2" meinen VCL-Code gepostet. Siehst du (oder jemand anders) darin einen Fehler? Danke schon einmal. |
AW: Formular modal öffnen
Man könnte auch auf die saudumme Idee kommen und dem blöden FMX modal beizubringen? :freak:
z.B. in etwa so (rein schematisch)
Delphi-Quellcode:
Natürlich schön als als Methode "RealShowModal" per Class-Helper an alle Forms drangehangen.
var
WarteVariable: TModalResult; WarteVariable := mrNone; MeinDialog.ShowModal( procedure(ModalResult: TModalResult) begin WarteVariable := ModalResult; end); while (WarteVariable = mrNone) and not Application.Terminated do begin Application.ProgressMessages; Sleep(10); end; case WarteVariable of mrNone: Exit; mrOK: DoA; else DoB; end; "ShowModal" ist jedenfalls ein voll bescheuerter Name, denn eigentlich ist es doch ein
Delphi-Quellcode:
.
xxx.Show(OnClose: TCloseEvent);
Kein Wunder, wenn sich dann welche wundern, daß es doch nicht modal ist. :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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