Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   asynchrone Dialoge (https://www.delphipraxis.net/209604-asynchrone-dialoge.html)

tbathelt 29. Dez 2021 10:56

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:
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;
Das ganze funktioniert zwar wie gewünscht, ist aber fürchterlicher Programmierstil - nur ist mir halt eben bislang dazu nix Besseres eingefallen.
Daher meine Frage: Wie handhabt ihr den Umgang mit asynchronen Dialogen?
Ich bin für alle Anregungen dankbar

Viele Grüße

Olli73 29. Dez 2021 11:23

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;

tbathelt 29. Dez 2021 11:35

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?).

Olli73 29. Dez 2021 11:47

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;

tbathelt 29. Dez 2021 12:06

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.

Olli73 29. Dez 2021 12:09

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.

blawen 29. Dez 2021 13:36

AW: asynchrone Dialoge
 
Zitat:

Zitat von Olli73 (Beitrag 1499785)
Ich finde die bisherige Programmierung mit "echten" modalen (blockierenden) Dialogen auch schöner. Aber die mobilen Systeme sind halt zu blöd dafür.

Funktioniert
Delphi-Quellcode:
TDialogServiceSync
in den Mobilen Umgebungen nicht?

Olli73 29. Dez 2021 14:25

AW: asynchrone Dialoge
 
Zumindest bei Android geht das NICHT.

TurboMagic 29. Dez 2021 17:53

AW: asynchrone Dialoge
 
Zitat:

Zitat von blawen (Beitrag 1499788)
Zitat:

Zitat von Olli73 (Beitrag 1499785)
Ich finde die bisherige Programmierung mit "echten" modalen (blockierenden) Dialogen auch schöner. Aber die mobilen Systeme sind halt zu blöd dafür.

Funktioniert
Delphi-Quellcode:
TDialogServiceSync
in den Mobilen Umgebungen nicht?

Naja, man kann das sicher aufrufen und compilieren lassen, zur Laufzeit bekommt man aber eine Exception.
Schuld ist nicht Delphi, sondern mindestens Android. Die wollen koste es was es wolle einfach keine
modalen Dialoge!

Grüße
TurboMagic

himitsu 30. Dez 2021 06:13

AW: asynchrone Dialoge
 
Zitat:

Delphi-Quellcode:
    xProc;
  end);

Diese Endlosschleife funktioniert wirklich gut. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.
Seite 1 von 2  1 2      

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