![]() |
FMX.DialogServices... wie benutzen?
Ich bekomme seit meinem Umstieg nach Berlin eine Warnung:
Zitat:
Sherlock |
AW: FMX.DialogServices... wie benutzen?
Ich ignoriere die Meldung aktuell noch :-)
|
AW: FMX.DialogServices... wie benutzen?
Hi,
ich besitze leider kein Berlin (wie doof das klingt :D) jedoch findet sich bei Emba doch genügend Infos dazu, oder etwa nicht? ![]() ![]() ![]() ![]() Gib uns doch sonst ein Beispiel welches wir versuchen können so ähnlich wie möglich über FMX.DialogServices nachzubauen, sieht laut Dokumentation gar nicht allzu anders aus. Freundliche Grüsse Edit: Das könnte dir vielleicht am nützlichsten sein falls du kein async brauchst (da brauchst du dich auch nicht mit anonymen mehtoden rumschlagen ;)): ![]() Achtung: "To call MessageDialogSync without the need of an instance of IFMXDialogServiceSync, use TDialogServiceSync.MessageDialog instead." |
AW: FMX.DialogServices... wie benutzen?
Und noch ein Achtung: Das Sync-Gedöns ist NICHT für Android!
|
AW: FMX.DialogServices... wie benutzen?
Eventuell zur Verdeutlichung.
Mir ist klar, daß ich das hier zu verwenden habe: ![]() Mir ist jedoch nicht klar wie. Die Achtungs habe ich auch bereits gelesen, weshalb ja TDialogService zu bevorzugen ist, da wird dann eben Plattformabhängig entschieden was zu tun ist. Ich weiß nur nicht wie ich es benutzen soll... (Wiederholung ist meine Stärke :D) Konkret habe ich nur eine Stelle wo ich das brauche. Hier der bisherige Code:
Delphi-Quellcode:
Wie ersetze ich an der markierten Stelle MessageDlg durch TDialogService.MessageDialog?
procedure TFDeviceReader.AusRebootBtnClick(Sender: TObject);
var Command: Integer; Frage: string; begin if Sender = AusBtn then begin Command := 0; Frage := rsReallyShutDown; end else begin Command := 1; Frage := rsReallyReboot; end; if MessageDlg(Frage, TMsgDlgType.mtConfirmation, mbYesNo, 0) = mrYes then // <-- Wie verwende ich hier TDialogService? begin case Command of 0: begin ShowMessage(rsShutdown); fDevice.SendShutDown(Command); fDevice.Connected := False; Halt(0); end; 1: begin ShowMessage(rsReboot); fDevice.SendShutDown(Command); fDevice.Connected := False; repeat Sleep(10000); until fDevice.ConnectionTest; end; end; end; end; Sherlock |
AW: FMX.DialogServices... wie benutzen?
So in der Art (schnell hingeschrieben, ungetestet):
Delphi-Quellcode:
TDialogService.MessageDialog(Frage, TMsgDlgType.mtConfirmation, mbYesNo, 0,
procedure(const AResult: TModalResult) begin if AResult = mrYes then begin case Command of 0: begin ShowMessage(rsShutdown); fDevice.SendShutDown(Command); fDevice.Connected := False; Halt(0); end; 1: begin ShowMessage(rsReboot); fDevice.SendShutDown(Command); fDevice.Connected := False; repeat Sleep(10000); until fDevice.ConnectionTest; end; end; end; end ); |
AW: FMX.DialogServices... wie benutzen?
Aha, Danke. Kleinere Korrektur, und so geht es dann auch:
Delphi-Quellcode:
Es fehlte noch der DefaultButton.
procedure TFDeviceReader.AusRebootBtnClick(Sender: TObject);
var Command: Integer; Frage: string; begin if Sender = AusBtn then begin Command := 0; Frage := rsReallyShutDown; end else begin Command := 1; Frage := rsReallyReboot; end; TDialogService.MessageDialog(Frage, TMsgDlgType.mtConfirmation, mbYesNo, TMsgDlgBtn.mbNo, 0, procedure(const aResult: TModalResult) begin if aResult = mrYes then case Command of 0: begin ShowMessage(rsShutdown); fDevice.SendShutDown(Command); fDevice.Connected := False; Halt(0); end; 1: begin ShowMessage(rsReboot); fDevice.SendShutDown(Command); fDevice.Connected := False; repeat Sleep(10000); until fDevice.ConnectionTest; end; end; end); end; Insgesamt etwas holprig, und IMHO schlechter lesbar, als die alte Variante. Ich habe nicht übel Lust einen Wrapper zu bauen, der folgendes tut, und damit wieder die schlichte Eleganz der alten Implementierung herstellt:
Delphi-Quellcode:
Mag mir einer der fachkundigeren Mitforisten erläutern, was an der neuen Variante besser ist?
function myMessageDlg(const AMessage:string; const ADialogType: TMsgDlgType; const AButtons: TMsgDlgButtons; const AHelpContext:integer; const ADefaultButton: TMsgDlgBtn):TModalResult;
begin // Alle Parameter auf Gültigkeit prüfen, yada yada yada // Jetzt die neue Methode verwenden TDialogService.MessageDialog(AMessage, ADialogType, AButtons, ADefaultButton, AHelpContext, procedure(const aResult: TModalResult) begin Result := aResult; end); end; Sherlock |
AW: FMX.DialogServices... wie benutzen?
Die anonyme prozedur ist sehr wahrscheinlich dazu da um das ganze bei bedarf auch Asynchron auszuführen ohne das du dich um das Threading-Gedöns im Hintergrund kümmern musst, weswegen du das bei der Synchronen Variante nicht finden kannst. Ist aber nur eine Vermutung.
Freundliche Grüsse |
AW: FMX.DialogServices... wie benutzen?
Zitat:
|
AW: FMX.DialogServices... wie benutzen?
Zitat:
Was passiert denn bei Android, wenn man den Dialog ignoriert, und etwas anderes in der Applikation anstellt? Geht das wirklich, so daß dieses Verhalten halbwegs Sinn ergibt? Sherlock |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:36 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