AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular modal öffnen

Offene Frage von "himitsu"
Ein Thema von Sankt Rochus · begonnen am 4. Sep 2015 · letzter Beitrag vom 9. Sep 2015
Antwort Antwort
Seite 1 von 2  1 2      
Sankt Rochus

Registriert seit: 30. Nov 2012
15 Beiträge
 
#1

Formular modal öffnen

  Alt 4. Sep 2015, 11:28
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:
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;
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?

Variante 2: So, wie ich das aus der VCL gewohnt bin:

Delphi-Quellcode:
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;
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.

Das modale Fenster gebe ich übrigens in beiden Varianten per FormClose() frei:

Delphi-Quellcode:
procedure TfLabTokensMapping.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := TCloseAction.caFree;
end;
Was kann ich tun? Weiß irgendjemand Rat?

Vielen Dank schon einmal.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.434 Beiträge
 
Delphi 12 Athens
 
#2

AW: Formular modal öffnen

  Alt 4. Sep 2015, 11:44
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?
Das ist nicht FireMonkey geschuldet, sondern der Zielplattform, die sowas wie einen modalen Dialog nicht kennt. Ein blockierendes ShowModal kann auf einem solchen System schlichtweg nicht implementiert werden. Du musst also notgedrungen die eingefahrenen VCL/Windows-Wege verlassen und Neuland betreten. Das heißt eben auch, daß man die gewohnten Abläufe durch andere Ansätze ersetzt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
4.069 Beiträge
 
Delphi 12 Athens
 
#3

AW: Formular modal öffnen

  Alt 4. Sep 2015, 11:51
Du musst dich besser generell dran gewöhnen das ShowModal auf iOS und Android verboten ist.
Also besser so machen wie Sir Rufo das hier schön beschreibt.
Oder direkt mit einer anonymen Prozedur hinten dran.

Rollo
  Mit Zitat antworten Zitat
Sankt Rochus

Registriert seit: 30. Nov 2012
15 Beiträge
 
#4

AW: Formular modal öffnen

  Alt 4. Sep 2015, 13:15
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.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.142 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Formular modal öffnen

  Alt 4. Sep 2015, 13:23
Wieso dann Firemonkey?
Ein Grund könnte sein, damit man weg kommt von der strengen Bindung zur Windows API/VCL. Ist sicherlich Zukunftsorientiert!
  Mit Zitat antworten Zitat
Rollo62
Online

Registriert seit: 15. Mär 2007
4.069 Beiträge
 
Delphi 12 Athens
 
#6

AW: Formular modal öffnen

  Alt 4. Sep 2015, 14:29
Zitat:
Das ist aber natürlich schade, dass es kein ShowModal mehr gibt ):
Das fehlt mir nicht:
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
  Mit Zitat antworten Zitat
Sankt Rochus

Registriert seit: 30. Nov 2012
15 Beiträge
 
#7

AW: Formular modal öffnen

  Alt 4. Sep 2015, 14:43
Zitat:
Ein Grund könnte sein, damit man weg kommt von der strengen Bindung zur Windows API/VCL. Ist sicherlich Zukunftsorientiert!
Klar, für Windows 11 hat Microsoft ja bereits die Windows API abgekündigt

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 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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.434 Beiträge
 
Delphi 12 Athens
 
#8

AW: Formular modal öffnen

  Alt 4. Sep 2015, 15:17
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.
Dann verstehe ich das Problem nicht: Unter Windows funktioniert das alte parameterlose FMX-ShowModal doch genauso wie in der VCL!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Sankt Rochus

Registriert seit: 30. Nov 2012
15 Beiträge
 
#9

AW: Formular modal öffnen

  Alt 7. Sep 2015, 13:12
Zitat:
Dann verstehe ich das Problem nicht: Unter Windows funktioniert das alte parameterlose FMX-ShowModal doch genauso wie in der VCL!
Hallo Uwe Raabe,

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.020 Beiträge
 
Delphi 12 Athens
 
#10

AW: Formular modal öffnen

  Alt 7. Sep 2015, 15:03
Man könnte auch auf die saudumme Idee kommen und dem blöden FMX modal beizubringen?

z.B. in etwa so (rein schematisch)
Delphi-Quellcode:
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;
Natürlich schön als als Methode "RealShowModal" per Class-Helper an alle Forms drangehangen.



"ShowModal" ist jedenfalls ein voll bescheuerter Name, denn eigentlich ist es doch ein xxx.Show(OnClose: TCloseEvent); .
Kein Wunder, wenn sich dann welche wundern, daß es doch nicht modal ist.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 7. Sep 2015 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz