![]() |
Android: MessageDlg Logik
Hallo,
ich finde die Android Logik nicht ganz sinnvoll, keine blockierenden Meldungen zuzulassen: Beispiel: Nachfrage, ob eine bestehende Datei überschrieben werden soll. Windows:
Delphi-Quellcode:
Android:
if FileExists() then
begin Case MsgDlg('soll die Datei überschrieben werden') of mrNo: exit; end; end; // ab hier wird die Datei überschrieben
Delphi-Quellcode:
if FileExists() then
begin MsgDlg('soll die Datei überschrieben werden') procedure(const AResult: TModalResult) begin Case AResult of mrNo: exit; mrYes: begin // ab hier wird die Datei überschrieben exit; end; end; end); exit; end; // ab hier wird die Datei überschrieben Mich stört hierbei, dass ich die nach der Frage abzuarbeitenden Befehle in eine Funktion auslagern muss, da die Befehle entweder bei einer nicht vorhandenen Datei und bei einem "Ja, du darfst überschreiben" ausgeführt werden sollen. Wie handhabt ihr diese Logik? Amigage |
AW: Android: MessageDlg Logik
Das Problem ist halt, daß es dort eigentlich nicht sowas wie "modale" Dialoge gibt, wie man sie aus den nicht-mobilen Plattformen kennt und Emba nicht in der Lage war etwas funktionell "gleichwertiges" hinzubekommen.
Eigentlich macht man ein neues Fenster auf und reagiert dort dann auf den Button-Klick ... und diese Syntax ist praktisch die gekapselte "Kurzfassung" davon, aber statt der anonymen Methode darfst du auch gern eine richtige Methode oder ein eigenes Fenster benutzen. |
AW: Android: MessageDlg Logik
Selbst bei der VCL gibt es eigentlich keine modalen Dialoge. Das was da als modal verkauft wird, ist eine Schleife, die ständig
Delphi-Quellcode:
aufruft. Vorher wurden alle anderen Formulare abgeschaltet und werden nachher wieder eingeschaltet, bzw. auf den gespeicherten Zustand zurückgesetzt.
Application.ProcessMessages
Dieses modal soll ja eigentlich nur weitere Eingaben in den anderen Formularen verhindern und nur in diesem einzigen zulassen. Darum wird bei den Mobil-Plattformen quasi ein Vorhang (Rectangle, Opacity 50%, HitTest True) davorgelegt und dann kommt der Dialog. Am Ende wird der wieder entfernt. Allerdings würde mich so eine Exit-Orgie in deinem Code auch stören:
Delphi-Quellcode:
if FileExists() then
begin MsgDlg('soll die Datei überschrieben werden', procedure(const AResult: TModalResult) begin if AResult = mrYes then begin // ab hier wird die Datei überschrieben end; end); end; |
AW: Android: MessageDlg Logik
Zitat:
(z.B. Android ist auch auch "nur" ein Linux) Und die zusätzliche Schleife ist nichts Besonderes, denn das ist der Normalfall ... siehe Application.Run |
AW: Android: MessageDlg Logik
Zitat:
|
AW: Android: MessageDlg Logik
Wie wärs denn damit?
Delphi-Quellcode:
Gruß
procedure TForm1.Button16Click(Sender: TObject);
begin if not Confirm('Willst Du?') then Exit // Weiter gehts erst nach Click end; function TForm1.Confirm(const AText:String):Boolean; var geklickt: Boolean; Ergebnis: Boolean; begin Ergebnis := false; geklickt := false; MsgDialog(AText,TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo],TMsgDlgBtn.mbYes, procedure(const AResult: TModalResult) begin Ergebnis := (AResult=mrYes); geklickt := true; end); repeat Application.ProcessMessages(); until geklickt; Result := Ergebnis; end; Eddie |
AW: Android: MessageDlg Logik
Dieses modal soll ja eigentlich nur weitere Eingaben in den anderen Formularen verhindern und nur in diesem einzigen zulassen. Darum wird bei den Mobil-Plattformen quasi ein Vorhang (Rectangle, Opacity 50%, HitTest True) davorgelegt und dann kommt der Dialog. Am Ende wird der wieder entfernt.
|
AW: Android: MessageDlg Logik
Zitat:
|
AW: Android: MessageDlg Logik
Dann programmiere deine Anwendung doch einfach besser lesbar
Delphi-Quellcode:
Wow, schon wird aus einem ominösen und unleserlichem
procedure ConfirmAction( const AText : string; const AProc : TProc );
begin MsgDialog(AText,TMsgDlgType.mtConfirmation,[TMsgDlgBtn.mbYes,TMsgDlgBtn.mbNo],TMsgDlgBtn.mbYes, procedure(const AResult: TModalResult) begin if (AResult=mrYes) then AProc(); end); end; procedure TForm1.Button6Click( Sender : TObject ); begin ConfirmAction( 'Willst du Drucken?', PrintFoo ); end; procedure TForm1.PrintFoo; begin // Hier der Code zum drucken end;
Delphi-Quellcode:
eine dokumentierte Methode. Auf einem Blick sieht man nun, dass hier nach Rückfrage ein Druck ausgelöst wird.
Button6Click
Ja, dass mit diesem komischen Dialog-Gedöns ist richtig ekelig: Man muss sich ja richtig Gedanken machen :roll: |
AW: Android: MessageDlg Logik
Zitat:
Üblichweise heißt ein Button bei mir nicht Button16 (manchmal auch Button17 oder ..18 :-D:-D,), das macht die IDE halt so, wenn man mal schell was ausprobieren will.... Und "willst Du" scheint mir auch nicht unbedingt aussage(frage)kräftig, steht üblicherweise nicht in meinen Dialogboxen. Könnt es vielleicht sein, dass das mal Q&D hingeklickt ist um die Funktionalität auszuprobieren / zu zeigen......? Aber im Ernst. Wer für Desktop programmiert, der ist gewöhnt, dass "modal" bedeutet, dass die Anwendung erst weiterläuft, wenn das modale Fenster geschlossen wurde, Darum geht's hier. Nicht um Namenskonventionen oder Programmlesbarkeit. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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