読者です 読者をやめる 読者になる 読者になる

MacOSXでDelphiからCocoaを使う

Delphiから直接CocoaAPIを使えるようなので試してみた。
DelphiXE3でターゲットをOSXにしてコンパイル。動作させた環境はMacOSX 10.6。

cocoa_test.dpr

CocoaのNSURL、NSDataを使ってWeb上のファイルをダウンロードして保存するだけの簡単なコンソールアプリケーション。

program cocoa_test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, Macapi.Foundation;

var
  Pool: NSAutoreleasePool;
  URL: NSURL;
  Data: NSData;

begin
  try
    if ParamCount < 1 then
      Exit;
    NSDefaultRunLoopMode;
    Pool := TNSAutoreleasePool.Create;
    try
      URL := TNSURL.Wrap(TNSURL.Alloc.initWithString(NSSTR(ParamStr(1))));
      Data := TNSData.Wrap(TNSData.Alloc.initWithContentsOfURL(URL));
      Data.writeToFile(NSSTR('output' + ExtractFileExt(ParamStr(1))), True);
    finally
      Pool.drain;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

NSDefaultRunLoopModeを呼ばないと、「EObjectiveC: ObjectiveC のクラス NSString が見つかりません」というエラーになる。
NSAutoreleasePoolはメモリ管理に使われる。

実行

画像ファイルのURLをコマンドライン引数で指定してダウンロードし、openコマンドで開いてみる。

$ ./cocoa_test https://dl.dropbox.com/u/370615/cb400sf.jpg
$ open output.jpg

これで動作はしているけど、Cocoaに詳しいわけではないので、クラスの使い方があってるかわからない。