![]() |
asynchrone Dialoge
Hallo zusammen, ich möchte mit diesem Post nochmal das Thema asynchrone Dialoge aufgreifen, da ich dazu bislang keine wirklich hilfreichen Infos finden konnte.
Wenn man Code programmiert, der auf verschiedenen Platformen laufen soll (z.B. Android), kommt man um die Verwendung asynchroner Dialoge nicht herum. Manchmal braucht man aber eine Eingabe, bevor es Sinn macht, mit dem Programmablauf weiterzumachen. In den durchsuchten Beiträgen habe ich bislang für solche Situationen nur etwas unspezifische Hinweise auf die Callback-Funktion der Dialoge gefunden. Ich habe mir daher einen "work-around" zurechtgebastelt, wie er im nachfolgenden Code-Beispie zu sehen ist.
Delphi-Quellcode:
Das ganze funktioniert zwar wie gewünscht, ist aber fürchterlicher Programmierstil - nur ist mir halt eben bislang dazu nix Besseres eingefallen.
type
Tproc = procedure of object; var JmpIdx: Integer; res: String; procedure xInput(xTitle, xPrompt, xDefault: String; xProc: Tproc); begin TDialogServiceAsync.InputQuery(xTitle, xPrompt, xDefault, procedure(const ARes: TModalResult; const AVal: array of String) begin if ARes=mrOk then res := AVal[0] else res := ''; xProc; end); end; procedure TForm1.xyz; var s: String; Label lbl01; begin case JmpIdx of 1: Goto lbl01; end; JmpIdx := 1; xInput('Titel', 'Prompt', 'Default', xyz); exit; lbl01: Label1.Text := res; end; procedure TForm1.Button1Click(Sender: TObject); begin JmpIdx := 0; xyz; end; Daher meine Frage: Wie handhabt ihr den Umgang mit asynchronen Dialogen? Ich bin für alle Anregungen dankbar Viele Grüße |
AW: asynchrone Dialoge
Delphi-Quellcode:
procedure TForm1.xyz;
begin TDialogServiceAsync.InputQuery('Title', 'Prompt', 'Default', procedure(const ARes: TModalResult; const AVal: array of String) begin if ARes=mrOk then Label1.Text := AVal[0] else Label1.Text := ''; end); end; |
AW: asynchrone Dialoge
Mein Beispiel ist natürlich nur ein "Dummy-Code". In einem echten Programm ist der Ablauf komplexer.
Wenn z.B. die Eingabe von InputQuery nur beim ersten Programmstart gebraucht wird und später aus einer Datenbank kommt, müsste man den weiteren Code doppelt programmieren, da man nicht in die Callback Routine hineinspringen kann (oder?). |
AW: asynchrone Dialoge
So in etwa:
Delphi-Quellcode:
procedure TForm1.xyz;
begin if FirstStart then begin TDialogServiceAsync.InputQuery('Title', 'Prompt', 'Default', procedure(const ARes: TModalResult; const AVal: array of String) begin if ARes=mrOk then Login(AVal[0]) else Abbruch; end); end else begin Login(ValueAusDb); end; end; |
AW: asynchrone Dialoge
Sieht schon gar nicht schlecht aus.:thumb:
Es stört mich allerdings noch, dass z.B. bei mehreren verschiedenen Abfragen der Ablauf der Prozedur Login() in verschiedene einzelne Fragmente unterteilt werden muss, da man anders den Sprung aus der jeweiligen Callback Routine nicht an die richtige Stelle realisieren kann. Trotzdem hilft mir der Vorschlag schon gut weiter. Vielen Dank dafür. |
AW: asynchrone Dialoge
Ich finde die bisherige Programmierung mit "echten" modalen (blockierenden) Dialogen auch schöner. Aber die mobilen Systeme sind halt zu blöd dafür.
|
AW: asynchrone Dialoge
Zitat:
Delphi-Quellcode:
in den Mobilen Umgebungen nicht?
TDialogServiceSync
|
AW: asynchrone Dialoge
Zumindest bei Android geht das NICHT.
|
AW: asynchrone Dialoge
Zitat:
Schuld ist nicht Delphi, sondern mindestens Android. Die wollen koste es was es wolle einfach keine modalen Dialoge! Grüße TurboMagic |
AW: asynchrone Dialoge
Zitat:
|
AW: asynchrone Dialoge
Zitat:
dann ist alles schön beim Aufrufer zusammengefasst, und nicht über die ganze Unit verstreut. Deshalb finde ich das eigentlich sehr aufgeräumten Code (sieht nur etwas unelegant aus, auf den ersten Blick). Natürlich sollte man nicht zu viel darin machen, und man könnte weitere Aufgaben per Message anstossen.
Delphi-Quellcode:
...
begin if ARes=mrOk then begin ... MacheHierWas; ... end else begin ... MacheHierWasAnderes; ... end; end); |
AW: asynchrone Dialoge
Zitat:
|
AW: asynchrone Dialoge
Der etwas holperige Code lässt immerhin einen halbwegs linearen Ablauf der Prozedur "xyz" zu, unabhängig davon wie oft der Eingabedialog "xInput" aufgerufen wird. Außerdem kann durch die parameterisierte Rücksprungadresse in "xInput" dieser Eingabedialog bei Bedarf auch von verschiedenen anderen Prozeduren aufgerufen werden.
... und nochmal, obwohl Olli73 es schon geschrieben hat, es ist definitiv keine Endlosschleife !!! |
AW: asynchrone Dialoge
Zum dem Thema ein alternativer Vorschlag.
Ich beschäftige mit erst seit kurzem mit dem FMX Framework und bin durch das Buch von Andrea Magni auf die Komponente TFormStand aufmerksam geworden. Damit lassen sich mit ein wenig Tricksen eigene quasi modale Formulare mit beliebigen Design, Größe und Position realisieren. Der Rest der App kann ebenfalls mit einem Lighbox Effekt abgedunkelt werden. Wird ein Bereich außerhalb des "modalen Dialogs" angetippt, wird dieser nicht automatisch geschlossen. Den Rest der App benachrichtige ich generell über den Messagemanager mit Sendmessage und eigenen Botschaften. |
AW: asynchrone Dialoge
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:09 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