Visual Studio CodeでESLintを使う

eslintをインストールする

ESLintがインストールされていない場合は、コマンドプロンプトから次のコマンドを実行して、ESLintをインストールします。

npm install -g eslint

ESLintがインストールされているかは、次のコマンドを実行して確認できます。

eslint -v

インストールされていれば、ESLintのバージョンが表示されます。

VS Code ESLint extensionをインストールする

Visual Studio Codeで「Ctrl+P」を押します。

次のコマンドを入力し、Enterキーを押します。

ext install vscode-eslint

eslint01

eslint02

VS Code ESLint extensionがインストールされます。

VS Code ESLint extensionをインストールすると、設定ファイル(settings.json)の”eslint.enable”がtrueになります。

念のため、標準のJavaScriptの検証機能を無効にします。

メニューの「ファイル」→「基本設定」→「ユーザー設定」を選択します。

右側のウィンドウに「”javascript.validate.enable”: false」を追加します。

// 既定の設定を上書きするには、このファイル内に設定を挿入します
{
    // JavaScript の検証を有効/無効にします
    "javascript.validate.enable": false
}

eslintの設定ファイルを作成する

プロジェクトのフォルダーで、コマンドプロンプトから次のコマンドを実行します。

eslint --init

設定についての質問が始まります。
矢印キーで回答を選択して、Enterキーで確定します。

? How would you like to configure ESLint? (Use arrow keys)
? How would you like to configure ESLint? Answer questions about your style
? Are you using ECMAScript 6 features? No
? Where will your code run? Node
? Do you use JSX? No
? What style of indentation do you use? Spaces
? What quotes do you use for strings? Double
? What line endings do you use? Windows
? Do you require semicolons? Yes
? What format do you want your config file to be in? JSON
Successfully created .eslintrc.json file in C:\Users\yamam_000\Documents\sample

質問が終了すると、設定ファイルが作成されます。

ESLintで検証する

ここまで設定ができていれば、Visual Studio CodeはJavaScriptのコードをESLintで検証します。

JavaScriptファイルをVisual Studio Codeで開きます。
ESLintで検証されていることがわかります。

eslint03

MSBuildを使ってDelphi 10.1 Berlinのプロジェクトをビルドする

環境設定

コマンドプロンプトから次のバッチファイルを実行すると、MSBuildを使用するための環境が設定されます。

call "C:\Program Files (x86)\Embarcadero\Studio\18.0\bin\rsvars.bat"

これで、msbuildコマンドが使えるようになりました。

「msbuild /version」コマンドを実行するとMSBuildのバージョンが表示されます。

> msbuild /version
Microsoft (R) Build Engine Version 3.5.30729.8693
[Microsoft .NET Framework, Version 2.0.50727.8689]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

3.5.30729.8693

msbuildの実行

msbuildコマンドは引数にプロジェクトファイルを指定します。

msbuild Project1.dproj オプション1 オプション2 …

ターゲットオプション

「/t:」の後にターゲットを指定します。
ターゲットには「clean」「make」「build」があります。
ドキュメントにはありませんが、他にも「deproy」などが使えるようです。

msbuild Project1.dproj /t:build

ビルド構成オプション

「/p:config=」の後にビルド構成を指定します。
ビルド構成には「Debug」「Release」があります。
ユーザーがプロジェクトにビルド構成を追加した場合は、追加したビルド構成名も使用できます。

msbuild Project1.dproj /t:build /p:config=Release

ターゲットプラットフォームオプション

「/p:platform=」の後にターゲットプラットフォームを指定します。
ターゲットプラットフォームには「Android」「iOSDevice64」などがあります。

msbuild Project1.dproj /t:build /p:config=Release;platform=iOSDevice64

その他のオプション

ドキュメントにはありませんが、他にも使用できるオプションがあります。

BT_BuildTypeオプションは、iOSアプリの構成を指定します。
構成には「Debug」「Adhoc」「AppStore」があります。

msbuild Project1.dproj /t:build /p:config=Release;platform=iOSDevice64;BT_BuildType=Debug

DCC_iOSMinimumVersionオプションは、iOSアプリの最低動作OSバージョンを設定できます。
info.plistのMinimumOSVersionの値になります。

msbuild Project1.dproj /t:build /p:config=Release;platform=iOSDevice64;DCC_iOSMinimumVersion=9.0

使用できるオプションは、「C:\Program Files (x86)\Embarcadero\Studio\18.0\bin\」フォルダーにある「CodeGear.Common.Targets」「CodeGear.Cpp.Targets」「CodeGear.Delphi.Targets」「CodeGear.Deployment.Targets」「CodeGear.Group.Targets」「CodeGear.Profiles.Targets」をご覧ください。

VisualStudioCodeでJavaScriptのプログラムをデバッグする

Visual Studio Codeを使って、JavaScriptのプログラムをデバッグできるようになるまでの設定を紹介します。

Visual Studio CodeにはJavaScriptの開発を支援する機能がはじめから用意されているため、ブレークポイントなどの機能を簡単に使用できます。

アプリケーションのインストール

Visual Studio Codeとnode.jsをインストールします。

Visual Studio Codeをインストールする

Visual Studio Codeをインストールします。

Visual Studio Codeのページから、インストーラをダウンロードして実行すれば、インストールできます。

VisualStudioCode

難しい設定はないので、詳細は省略します。

node.jsをインストールする

Windowsにnode.jsをインストールする方法は次のページをご覧ください。

Visual Studio CodeでJavaScriptのコードをデバッグする

Visual Studio CodeでJavaScriptのコードをデバッグする手順です。

フォルダーを作成する

JavaScriptのプログラムを配置するフォルダーを作成します。

今回は、ドキュメントフォルダーの下にsampleフォルダーを作成しました。

jsdebug01

Visual Studio Codeでフォルダーを開く

Visual Studio Codeでフォルダーを開きます。

「エクスプローラー」ボタンを押します。

jsdebug02

「フォルダーを開く」ボタンを押し、フォルダーを選択します。

jsdebug03

フォルダーが開かれました。

jsdebug04

JavaScriptのファイルを作成する

デバッグするJavaScriptのファイルを作成します。

「新しいファイル」ボタンを押します。

jsdebug05

ファイル名を入力します。

jsdebug06

ファイルが作成されました。

jsdebug07

サンプルのコードを入力します。

var msg = 'hello world';
console.log(msg);

入力中は、エディターが入力を支援してくれます。

jsdebug08

入力が終わったら、ファイルを保存します。

JavaScriptのコードをデバッグするための設定ファイルを作成する

「デバッグ」ボタンを押します。

jsdebug09

デバッグの「開始」ボタンを押します。

jsdebug10

デバッグの設定がなされていないため、どの環境を使用するか問い合わせがあります。

jsdebug11

Node.jsを選択するか、Node.jsと入力します。

jsdebug12

設定ファイルが作成されます。
そのまま保存します。

jsdebug13

「エクスプローラー」ボタンを押します。

jsdebug14

sampleフォルダーの下に「.vscode」フォルダーが作成されて、「.vscode」フォルダーの中にlaunch.jsonファイルが作成されていることが確認できます。
このlaunch.jsonファイルが設定ファイルになります。

JavaScriptのコードをデバッグする

app.jsをクリックして、app.jsを表示します。

jsdebug15

行番号の左の余白をクリックして、ブレークポイントを設定します。

jsdebug16

「デバッグ」ボタンを押します。

jsdebug17

デバッグの「開始」ボタンを押します。

jsdebug18

プログラムが実行され、ブレークポイントの行で停止します。
変数の状態などが表示されます。

jsdebug19

「続行」ボタンを押すと、処理を続行します。

jsdebug20

「ステップオーバー」ボタンを押すと、次の行に処理が移ります。
「ステップインする」ボタンを押すと、関数の中の行に処理が移ります。
「ステップアウトする」ボタンを押すと、関数を抜けます。
「停止」ボタンを押すと、プログラムを終了します。

実行するJavaScriptのファイルを変更する

デバッグ実行したときに実行されるJavaScriptのファイルは、launch.jsonの”configurations”→”program”で設定します。
初期値は「”${workspaceRoot}/app.js”」になっています。
ファイル名を変更すれば、任意のファイルを実行できます。

テストコードでIFMXPhotoLibraryを使用するためのモックを作る

XE8からフォトアルバム(カメラロール)に画像を保存する機能が追加されました。 IFMXPhotoLibraryのAddImageToSavedPhotosAlbumメソッドを使うと画像をフォトアルバム(カメラロール)に保存できます。

参考:Delphi 10 SeattleのFiremonkeyアプリケーションでフォトアルバム(カメラロール)に画像を保存するには

procedure TForm1.Button1Click(Sender: TObject);
var
  Service: IFMXPhotoLibrary;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXPhotoLibrary, Service) then
  begin
    Service.AddImageToSavedPhotosAlbum(Image1.Bitmap, WriteImageCompletion);
  end;
end;

IFMXPhotoLibraryは、Windowsでは使用できません。
Windows上でDUnitXを使って、フォトアルバムに写真を登録するコードをテストしたい。
コールバックが呼ばれるようになんとかしたい。

そこで、Windows用のIFMXPhotoLibraryを作成しました。
Windowsにフォトアルバムはありませんので、何もしないで、登録成功を返します。

unit ImageManagerWindows;

interface

uses FMX.Platform, FMX.MediaLibrary, FMX.Graphics;

type
  TImageManagerWindows = class sealed(TInterfacedObject, IFMXPhotoLibrary)
  public
    procedure AddImageToSavedPhotosAlbum(const ABitmap: TBitmap;
      const AWriteImageCompletionEvent: TWriteImageCompletionEvent = nil);
  end;

implementation

var
  ImageManager: TImageManagerWindows;

  { TImageManagerWindows }

procedure TImageManagerWindows.AddImageToSavedPhotosAlbum
  (const ABitmap: TBitmap; const AWriteImageCompletionEvent
  : TWriteImageCompletionEvent);
begin
  // 何もしないで成功したことにする
  if Assigned(AWriteImageCompletionEvent) then
    AWriteImageCompletionEvent(True, '保存しました。');
end;

procedure RegisterMediaLibraryServices;
begin
  ImageManager := TImageManagerWindows.Create;

  TPlatformServices.Current.AddPlatformService(IFMXPhotoLibrary,
    IInterface(ImageManager));
end;

initialization

RegisterMediaLibraryServices;

end.

たとえば、次のようなクラスをWindowsでテストできます。

unit Diary;

interface

type
  /// <summary>
  /// 日記
  /// </summary>
  TDiary = class
  private
    FSaved: Boolean;
    FResultMessage: string;
    procedure WriteImageCompletion(const ASaved: Boolean;
      const AResultMessage: string);
  public
    /// <summary>
    ///   フォトアルバムへの登録に成功したときはTrue
    /// </summary>
    property Saved: Boolean read FSaved;
    /// <summary>
    ///   フォトアルバムに登録したときの結果のメッセージ
    /// </summary>
    property ResultMessage: string read FResultMessage;
    /// <summary>
    /// 指定した日付の写真をフォトアルバムへ登録する
    /// </summary>
    procedure ExportPhoto(const ADate: TDate);
  end;

implementation

{ TDiary }

uses FMX.Platform, FMX.MediaLibrary, FMX.Graphics;

procedure TDiary.ExportPhoto(const ADate: TDate);
var
  Service: IFMXPhotoLibrary;
  ABitmap: TBitmap;
begin
  ABitmap := nil;
  if TPlatformServices.Current.SupportsPlatformService(IFMXPhotoLibrary, Service)
  then
  begin
    Service.AddImageToSavedPhotosAlbum(ABitmap, WriteImageCompletion);
  end;
end;

procedure TDiary.WriteImageCompletion(const ASaved: Boolean;
  const AResultMessage: string);
begin
  FSaved := ASaved;
  FResultMessage := AResultMessage;
end;

end.

テストコードです。

unit MyTest;

interface

uses
  DUnitX.TestFramework;

type

  [TestFixture]
  TMyTest = class(TObject)
  public
    [Test]
    procedure SavePhotoAlbum;
  end;

implementation

{ TMyTest }

uses System.DateUtils, Diary;

procedure TMyTest.SavePhotoAlbum;
var
  Diary: TDiary;
begin
  Diary := TDiary.Create;
  Diary.ExportPhoto(Today); // フォトアルバムに登録する
  Assert.IsTrue(Diary.Saved); // 登録に成功したときはTrue
  Diary.Free;
end;

initialization

TDUnitX.RegisterTestFixture(TMyTest);

end.

Windowsでもテストを実行できるようになりました。

AddImageToSavedPhotosAlbumT

Android Studio 2.1でJNIを使って開発するには

Android Studio 2.1でJNIを使って開発する手順です。

環境

  • Windows 10
  • Android Studio 2.1.1

プロジェクトの作成

Android Studioで新しいプロジェクトを作成します。

011

「Application name」と「Company Domain」を入力します。

ここでは、「Application name」を「JniTest」としました。

012

「Phone and Tablet」をチェックし、「Minimum SDK」を選択します。

013

「Empty Activity」を選択します。

014

「Activity Name」と「Layout Name」は初期値のままにします。

015

プロジェクトが作成されます。

016

メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。

017

018

Gradleの設定

メニューの「File」→「Settings」を選択し、「Build, Execution, Deployment」→「Build Tools」→「Gradle」を選択します。

「Use Default Gradle wrapper (recommended)」にチェックを入れ、「OK」ボタンを押します。

019

Android NDKのインストール

メニューの「Tools」→「Android」→「SDK Manager」を選択します。

「SDK Tools」タブを選択し、「Android NDK」をチェックします。。

001

「Apply」ボタンを押します。

002

License Agreement画面の「Accept」をチェックして、「Next」ボタンを押します 。

003

インストールが始まります。

004

メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。

build.gradle(Project)ファイルの編集

「build.gradle(Project: jnitest)」を開きます。

classpath 'com.android.tools.build:gradle:2.1.0'

の行を次のように変更します。

classpath 'com.android.tools.build:gradle-experimental:0.7.0'

020

gradle-wrapper.propertiesファイルの編集

「gradle-wrapper.properties (Gradle Version)」を開きます。

distributionUrl=…

の行を次のように変更します。

distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip

021

build.gradle(Module)ファイルの編集

「build.gradle(Module: app)」を開きます。

次のように変更します。

apply plugin: 'com.android.model.application'

model {
    android {
        compileSdkVersion = 23
        buildToolsVersion = "23.0.3"

        defaultConfig {
            applicationId = "jp.gesource.jnitest"
            minSdkVersion.apiLevel = 19
            targetSdkVersion.apiLevel = 23
            versionCode = 1
            versionName = "1.0"
        }
        buildTypes {
            release {
                minifyEnabled = false
                proguardFiles.add(file('proguard-android.txt'))
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
}

メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。

Android NDK locaationの設定

「File」→「Project Structure」→「SDK Location」を選択します。

「Android NDK locaation」が設定されていなければ、設定して「OK」ボタンを押します。

022

build.gradleの設定

build.gradle(Module: app)を開き、「buildTypes」の設定の下に「ndk」の設定を追加します。

buildTypes {
    …
}
ndk {
    moduleName = "jnitest"
}

023

MainActivityの編集

MainActivity.javaを開き、次の行を追加します。

static {
    System.loadLibrary("jnitest");
}
public native String getMsgFromJni();

build.gradleのmoduleNameで設定した名前をSystem.loadLibraryの引数に設定します。

024

getMsgFromJni関数が存在しないため、getMsgFromJniの部分でエラーになっています。
カーソルをgetMsgFromJniの上に移動し、ALT+Enterキーを押します。

025

Enterキーを押すと、jniフォルダーにjnitest.cファイルが作成され、関数が作成されます。

include <jni.h>

JNIEXPORT jstring JNICALL
Java_gesource_jp_jnitest_MainActivity_getMsgFromJni(JNIEnv *env, jobject instance) {
    // TODO
    return (*env)->NewStringUTF(env, returnValue);
}

jnitest.cのreturnValueの部分を編集します。

return (*env)->NewStringUTF(env, "Hello JNI");

res/layout/activity_main.xmlファイルを開き、TextViewのidを「jni_msgView」に設定します。

026

MainActivity.javaを開き、MainActivityクラスのonCreateメソッドの末尾に次の行を追加します。

((TextView) findViewById(R.id.jni_msgView)).setText(getMsgFromJni());

TextViewの部分がエラーになっているので、Alt+Enterキーを押して修正します。

027

メニューの「Run」→「Run ‘app’」を選択して、アプリケーションを実行できることを確認します。

028

C言語で記述した処理が実行されています。

Tポイントの個人情報の第三者提供を止めるには

Tポイントの個人情報の第三者提供を止める手続きをしていない場合、業者が手数料を支払い開示請求をすれば、個人情報の中身を確認できるそうです。

Tポイントの個人情報の第三者提供を止める手続きについては、次のページをご覧ください。

Windowsにnode.jsをインストールする

Windowsにnode.jsをインストールするには、nodistを使用します。
nodistは、Windows用のnode.jsバージョン管理ツールです。
node.jsはバージョンアップの速度が速いため、バージョン管理ツールを使って管理しておくと便利です。

nodistはGitHubのページからダウンロードできます。

nodejs001

「Installing with the official installer」のところに、インストーラへのリンクがあります。
そこからインストーラをダウンロードします。

nodejs002

ダウンロードが完了したら、インストーラを実行してインストールします。
インストールの設定は初期値のままにします。

インストーラを使ってインストールすると環境変数のPATHも設定してくれます。

nodejs003

nodejs004

nodejs005

nodejs006

nodejs007

nodejs008

nodejs009

nodistを使うには、gitも必要になります。
gitがインストールされていない場合は、インストールします。

Git for Windowsをインストールします。

nodejs010

ダウンロードが完了したら、インストーラを実行してインストールします。
インストールの設定は初期値のままにします。

nodejs011

nodejs012

nodejs013

nodejs014

nodejs015

nodejs016

nodejs017

nodejs018

nodejs019

nodejs020

nodistとgitのインストールが終わったら、nodistで最新版のnode.jsをインストールします。

コマンドプロンプトから次のコマンドを実行します。

nodist update

エラーが発生する場合は、selfupdateを実行すると解決するかもしれません。

nodist selfupdate

node.jsの最新版ではなく、特定のバージョンのnode.jsをインストールしたい場合、
「nodist dist」でインストールできるバージョンを確認し、
「nodist add バージョン」で指定したバージョンをインストールします。

例:インストールできるバージョンを確認する

> nodist dist
  nodev0.1.14
  nodev0.1.15
  nodev0.1.16
  nodev0.1.17
  nodev0.1.18

特定のバージョンのnode.jsをインストールには、「nodist add バージョン」を使用します。

> nodist add nodev4.2.2

例:インストールされているnode.jsを確認する

> nodist list
> nodev4.2.2  (global)
  nodev6.0.0 

使用するnode.jsを変更するときは、nodistの引数にバージョンを指定します。

例:nodev6.0.0を使用するように設定する

> nodist nodev6.0.0

設定が変更されたことを確認します。

> nodist list
  nodev4.2.2 
> nodev6.0.0  (global)

以上で、node.jsのインストールは完了しました。

Delphi 10.1 Berlinで、文字列からハッシュ値(MD5/SHA-1/Jenkins)を生成する

Delphi XE8以降ではSystem.Hashユニットに、ハッシュ値を生成する機能が用意されています。

  • System.Hash.THashMD5
    MD5ハッシュを実装するレコードです。

  • System.Hash.THashSHA1
    SHA-1ハッシュを実装するレコードです。

  • System.Hash.THashBobJenkins
    Jenkinsハッシュを実装するレコードです。

次のコードはTHashMD5を使うサンプルです。

md5

uses System.Hash;

procedure TForm1.Button1Click(Sender: TObject);
const
  MSG = 'Hello, world';
var
  MD5: THashMD5;
  Hash: string;
begin
  MD5 := THashMD5.Create;
  MD5.Update(MSG);
  Hash := MD5.HashAsString;

  Edit1.Text := Hash;
end;

バイト列からハッシュ値を生成することもできます。

procedure TForm1.Button2Click(Sender: TObject);
const
  MSG = 'Hello, world';
var
  MD5: THashMD5;
  Bytes: TBytes;
  Hash: string;
begin
  MD5 := THashMD5.Create;
  Bytes := TEncoding.UTF8.GetBytes(MSG);
  MD5.Update(Bytes, Length(Bytes));
  Hash := MD5.HashAsString;

  Edit2.Text := Hash;
end;

Delphi 10.1 BerlinのFireMonkeyのグリッドで右寄せや中央揃えで表示する列クラスを作成する

セルごとに表示を細かく制御したい場合は、TGridのOnDrawColumnCellイベントを使用します。
列ごとに右寄せや中央揃えが決まっているのであれば、専用の列クラスを作成すると便利です。

列クラスはFMX.GridユニットのTColumnクラスを継承して作成します。

type
  TTextAlignColumn = class(FMX.Grid.TColumn)
  end;

テキストの位置揃えを指定するためのプロパティを作成します。

type
  TTextAlignColumn = class(FMX.Grid.TColumn)
  private
    FHorizontalAlign: TTextAlign;
  published
    property HorizontalAlign: TTextAlign read FHorizontalAlign
      write FHorizontalAlign;
  end;

設定したテキストの位置揃えは、描画の直前にBeforeDrawingメソッドでTTextLayoutに反映します。

type
  TTextAlignColumn = class(FMX.Grid.TColumn)
  private
    FHorizontalAlign: TTextAlign;
  protected
    procedure BeforeDrawing(const Canvas: TCanvas); override;
  published
    property HorizontalAlign: TTextAlign read FHorizontalAlign
      write FHorizontalAlign;
  end;

procedure TTextAlignColumn.BeforeDrawing(const Canvas: TCanvas);
begin
  inherited;
  Layout.HorizontalAlign := FHorizontalAlign;
end;

Paddingなどの設定も、BeforeDrawingで行うといいでしょう。

procedure TTextAlignColumn.BeforeDrawing(const Canvas: TCanvas);
begin
  inherited;
  Layout.HorizontalAlign := FHorizontalAlign;
  Layout.Padding.Right := 5;
end;

次のサンプルアプリケーションは、左寄せ・中央揃え・右寄せで表示します。

フォームにTGridを配置します。

grid01

フォームのOnCreateイベントで列を追加します。

procedure TForm1.FormCreate(Sender: TObject);
var
  Column: TTextAlignColumn;
begin
  Grid1.Row := 20;

  Column := TTextAlignColumn.Create(Grid1);
  Column.HorizontalAlign := TTextAlign.Leading;
  Grid1.AddObject(Column);

  Column := TTextAlignColumn.Create(Grid1);
  Column.HorizontalAlign := TTextAlign.Center;
  Grid1.AddObject(Column);

  Column := TTextAlignColumn.Create(Grid1);
  Column.HorizontalAlign := TTextAlign.Trailing;
  Grid1.AddObject(Column);
end;

グリッドのOnGetValueでセルの値を設定します。

procedure TForm1.Grid1GetValue(Sender: TObject; const ACol, ARow: Integer;
  var Value: TValue);
begin
  Value := Format('%d %d', [ACol, ARow]);
end;

アプリケーションを実行すると、テキストが指定した位置に表示されます。

grid02

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