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では複数フィールドに対応していません。