Delphi 10.1 BerlinでダイアログAPIを使ってみた

Delphi/C++Builderの10.1 Belrinの新機能のひとつに「ダイアログAPIの簡素化」があります。
この新しいダイアログAPIを各プラットフォームで使ってみました。

使用した関数はInputQueryです。

TDialogService.InputQuery関数

TDialogService.InputQuery関数は、入力フィールドを持つダイアログボックスを表示します。

procedure TForm1.ButtonInputDialogClick(Sender: TObject);
begin
  TDialogService.InputQuery(
    'Input String',
    ['Enter Your Name'],
    ['Your Name'],
    procedure(const AResult: TModalResult; const AValues: array of string)
    begin
      Memo1.Lines.Add('Your Name = ' + AValues[0]);
    end);
  Memo1.Lines.Add('ButtonInputDialogClick');
end;

上のコードを実行すると、
WindowsとOSXでは、ダイアログを表示してから「ButtonInputDialogClick」が出力されました。
AndroidとiOSでは、「ButtonInputDialogClick」が出力されてから、ダイアログが表示されました。

この関数はOSによって動作が異なるようです。

OS 処理
Windows 同期
OSX 同期
Android 非同期
iOS 非同期

また、TDialogService.InputQueryは、複数の入力フィールドを持つことができます。

procedure TForm1.ButtonInputDialogClick(Sender: TObject);
begin
  TDialogService.InputQuery(
    'Input String',
    ['Enter Your First Name', 'Enter Your Family Name'],
    ['First Name', 'Family Name'],
    procedure(const AResult: TModalResult; const AValues: array of string)
    begin
      Memo1.Lines.Add('First Name = ' + AValues[0]);
      Memo1.Lines.Add('Family Name = ' + AValues[1]);
    end);
  Memo1.Lines.Add('Button1Click');
end;

iOSでは、このコードを実行すると実行時エラーになりました。
複数の入力フィールドを持つことはできないようです。
Windows・OSX・Androidでは動作しました。

OS 複数フィールド
Windows
OSX
Android
iOS ×

IFMXDialogServiceSync.InputQuerySync関数

IFMXDialogServiceSync.InputQuerySync関数は、ダイアログが閉じるまで処理がブロックされます。

procedure TForm1.ButtonIFMXDialogServiceSyncClick(Sender: TObject);
var
  Service: IFMXDialogServiceSync;
  AValues: array of string;
begin
  AValues := ['Your Name'];
  if TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceSync, IInterface(Service)) then
  begin
    if Service.InputQuerySync('Input String', ['Enter Your Name'], AValues) then
    begin
      Memo1.Lines.Add('Your Name = ' + AValues[0]);
    end;
  end;
  Memo1.Lines.Add('ButtonIFMXDialogServiceSyncClick');
end;

Windows・OSX・iOSでは、ダイアログが表示された後に、「ButtonIFMXDialogServiceSyncClick」が出力されました。
Androidではダイアログは表示されず、「ButtonIFMXDialogServiceSyncClick」だけ出力されました。

OS 対応
Windows
OSX
Android ×
iOS

この関数もiOSでは複数フィールドに対応していません。

IFMXDialogServiceAsync.InputQueryAsync関数

IFMXDialogServiceSync.InputQueryAsync関数は、ダイアログが閉じるのを待たずに処理が継続します。

procedure TForm1.ButtonIFMXDialogServiceAsyncClick(Sender: TObject);
var
  Service: IFMXDialogServiceAsync;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXDialogServiceAsync, IInterface(Service)) then
  begin
    Service.InputQueryAsync('Input String', ['Enter Your Name'], ['Your Name'],
      procedure(const AResult: TModalResult; const AValues: array of string)
      begin
        Memo1.Lines.Add('Your Name = ' + AValues[0]);
      end);
  end;
  Memo1.Lines.Add('ButtonIFMXDialogServiceAsyncClick');
end;

Windows・OSX・Android・iOSでは、「ButtonIFMXDialogServiceAsyncClick」が出力された後に、ダイアログが表示されました。

OS 対応
Windows
OSX
Android
iOS

この関数もiOSでは複数フィールドに対応していません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください