さて、数日ぶりに更新です。
今回は、久々にプログラミングの話題を。
先ず、お決まりの環境を。
MAC OS X 10.9.2
Lazarus 10.2.0
で、今回は何をしたのかというと、
外部プログラムの呼び出しをしました。
前回のブログ
普通、例えばwindowsだと、
ファイル選択ダイアログボックス表示して、
実行ファイルを指定し、
ShallAPIを引き数指定して走らせれば、それでokなんですが。
買って間もないMac、同じ事をしてみると、きれいに動かない。
そんなこんなで停滞していたのですが、
今日、進展がありまして。
パッケージファイルは、windowsでの実行ファイルとは異なり、
フォルダなんだそう。
で、そのフォルダをきちんと指定して、その奥に入っている、
ファイルを呼び出せば、ok、と。
それが解れば話は早い。
早速やってみました。
例えば、「デスクトップ/アプリ/パッケージファイル」
という、実行ファイルへのパスがあったとして。
くせ者はこの「パッケージファイル」で、
こいつがフォルダ。
正式なパスはこうなる。
「デスクトップ/アプリ/パッケージファイル.app」
更に、実行ファイルをプログラムから呼び出すには、こうすれば良かった。
「デスクトップ/アプリ/パッケージファイル.app/Contents/MacOS/パッケージファイル」
さて、これを、どうコードに落とすか?
こんな感じになった。
ただ、いかんせん即興ですので、そこら編はご愛嬌で。
まだ、もっと効率良いまともな書き方あるかもです。
※注:以下は実行ファイルのフルパスを取得するだけのサンプルです。※
var
s:string;
i:integer;
begin
if not Form1.OpenDialog1.Execute then
exit;
//ファイルパスから、パッケージファイル名だけを取得し、変数sに格納する。
s := ExtractFileName(Form1.OpenDialog1.FileName);
//取得したパッケージファイル名(*.app)を加工して、末尾のappを除去する。
for i := Length(s) -3 to Length(s) do begin
//拡張子部分の文字列がなかったかのように文字列末尾を加工する。
s[i] := char(0);
end;
//取得したパスに、パッケージの中身のフォルダ名と、加工したファイル名を継ぎ足して表示。
ShowMessage( Form1.OpenDialog1.FileName + ‘/Contents/MacOS/’ + s );
end;
はい、強引な力技です(笑)。
個人的には、こういう書き方好きだったりする。
後は、これを、TProcessに値を渡してあげれば良いだけです。
ということで、何とか実行ファイルの呼び出し成功。
これで、sjis対応と、外部プログラム呼び出しの二つの道が開けました。
良かった良かった。