#TApplication.ExeName
これは Delphi Advent Calendar 補欠の記事です。
VCL でおなじみの Application.ExeName は FMX には存在しません。
同じ効果を持つものとして ParamStr(0) を使うと、言われてきました。
これで、確かに Windows や OS X では正しく動作するのです。
##しかし!!
Android では、正しく動作しません。
でも、そもそも Android では、何を返すべきなのでしょうか…?
apk のパス? classes.dex のパス??
…何が正解か判らないから ParamStr(0) は値を返さないのかもしれません。
今回はアプリの全てが含まれる apk が一番近いかなあと思い「ExeName は apk のパスを返す」と規定しました。
apk のパスは Context.getPackageCodePath で取得できます。
(ApplicationInfo などからも取得できます)。
// Application(apk) のパスが返る
TAndroidHelper.Context.getPackageCodePath;
#TApplicationHelper
これをラッピングした TApplication のヘルパクラスを作りました。
ソースはこちら。
※コードの使用や改変はご自由にどうぞ
これを uses すれば、こんな風に ExeName が使えるようになります。
implementation
{$R *.fmx}
uses
FMX.ApplicationHelper;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Application.ExeName);
end;
#取れる値の例
- Windows
C:\Source\Delphi\ExeName\Win32\Debug\Project1.exe
- OSX
/Users/UserName/PAServer/scratch-dir/SDKVersion/Project1.app/Contents/MacOS/Project1
- iOS
/var/mobile/Containers/Bundle/Application/AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA/Project1.app/Project1
- Android
/data/app/com.embarcadero.Project1.apk
#まとめ
Android の ExeName って結局何を返すのが正解なんでしょうね!?
あと、TApplicationHelper と言いながら1個しか機能が追加されないし、TApplication に依拠してるわけでもないので、普通の関数にしたほうが良いかもしれませんね!