アプリケーションにファイルをドロップした場合の動作をざっとまとめてみました。

 ここで解説しているのは「アプリケーションウィンドウ」(の中のフィールドやボタン)にドロップすることではなく、デスクトップ上の「アプリケーションファイルアイコン」に他のファイルをドロップした場合の動作です。


マックOSの場合

 マックOSではアプリケーションファイルに何かがドロップされると、そのアプリケーションにアップルイベントが送られます。 on appleEvent ハンドラでアップルイベントを捕まえ、処理したい種類のものかどうか調べます。

on appleEvent theClass,theID
  if ( theClass & theID ) is "aevtodoc" then --*1
    request appleEvent data --*2
    answer it
  else
    pass appleEvent --*3
  end if
end appleEvent
*1 aevtクラスのodocというイベントかどうかをチェックしています。この組み合わせの時は「ファイルを開け」という命令が、どこか(大抵はファインダー。他のアプリのこともある)から来ています。

*2 イベントに付けられているデータを取り出しています。ここでは開くべきファイルのフルパスです。結果は it に返されます。

*3 アップルイベントはシステム上で何かある度に送られて来ますから、処理しないものは必ず pass しておく必要があります。

 起動していないアプリに書類をドロップした場合、そのアプリが起動し、直後にこのイベントが送られて来ます。
 既に起動しているアプリのアプリケーションファイルに更に書類をドロップしても、イベントは送られて来ません。普通のアプリケーションならば常にイベントが起きるはずですが、RunRev特有のバグの可能性があります。

 複数のファイルをドロップすると、(上記の例では it に)ファイルパスのリストが入ります。


マックOSのドロップ設定

 マックではドロップで受け付けるファイルの種類をリソースで設定する必要があります。以下OS9の話です。OSXでは多分plistを編集するのだと思いますが、良く分からないです。すみません。

 作ったアプリケーションをResEditで開くと、BNDLというリソースがあります。これをダブルクリックし、更に ID128 のリソースを開きます。Resourceメニューから Create New File Type を実行して新しい欄を追加します。その欄のTypeの部分をクリックするとタイプ入力状態になるので、例えば "TEXT" と入力します。リソースウィンドウを閉じ、保存してResEditを終了します。

 更にこの変更をファインダーに反映させるために、デスクトップファイルを作り直します。マックを再起動してファインダーが表示される直前、或いはアプリケーションの入ったMOなどをマウントする直前に、Command+Optionキーを押し続けます。すると「デスクトップファイルを作り直していいか」と聞かれるので、OKを押します。これでファインダーの情報が書き換えられ、先の例で言うとTEXTタイプのファイルをドロップ出来るようになります。

 特定のファイルタイプだけでは不便だという場合は、ワイルドカード '****' を設定することも出来ます。これならばどんなファイルもドロップ出来ます。(ファイルパスからファイルタイプを調べる関数を下に置いておきます) 更に 'fold' を追加しておけばフォルダ、'disk' を追加しておけばボリュームもドロップ出来るようになります。

 RunRevで作ったアプリはデフォルトで RApp というクリエータになりますが、このまま使った場合、RunRevで作ったファイルは全てテキストファイルを受け付けるようになってしまいます。これを防ぐには独自のクリエータ(Distribution BuilderのMacOSタブで入力)を使う必要があります。独自クリエータを設定したアプリを配布するときは、アップルのサイトからそのクリエータサイン使用の許可を取る必要があります。
--ファイルのパスを渡すとファイルタイプを返す関数
function getFileType tgPath
  set the itemDel to "/"
  put urlEncode( the last item of tgPath) into fName
  delete last item of tgPath
  put the defaultfolder to saveDefFldr
  set the defaultfolder to tgPath
  put the long files into infoList
  set the defaultfolder to saveDefFldr
  set the itemDel to ","
  repeat for each line aInfo in infoList
    if ( item 1 of aInfo is fName ) then
      return char 5 to 8 of ( item 11 of aInfo )
    end if
  end repeat
  return ""
end getFileType


Windowsの場合

 WindowsはDOSのコマンドラインと同じようなファイルハンドリングをしているようです。Windows上でmyApp.exeアプリケーションファイルにmyText.txtをドロップすると、コマンドラインで
myApp.exe myText.txt
と実行したのと同じになります。コマンドラインに打ち込まれた内容はRunRevの特殊変数 $0、$1、$2・・・に入るので、ここから読み出す事が出来ます。
on openStack
  answer $0 &return& $1 &return& $2
end openStack
 この例では$0にmyApp.exe(つまり自分自身)のフルパス、$1にmyText.txtのフルパスが入ります。バッチファイルと同じ要領ですね。

 特殊変数 $0、$1、$2・・・ は、いつでも、どのハンドラからでも、何度でも読み出すことが出来るので、二重に処理してしまわないよう注意が必要です。 openStackハンドラか、preOpenStackハンドラで処理するのがいいでしょう。

 既に起動しているアプリのアプリケーションファイルに何かをドロップした場合は、同じアプリがもうひとつ起動します。

 複数のファイルをドロップしてもどちらか一方しか取り出せないようです。つまりコマンドラインから使わない限り、$2以降は常にemptyです。


ドロップしたファイルで何をする

 ドロップされたファイルのフルパスを取得したあとは、いろんな処理が可能です。基本的には「ファイルをドロップしてアプリケーションを起動し、作業が終わったら自動的に終了」という使い方が一般的になると思います。

ファイル加工型:
 ファイルの内容を加工してそれを保存しなおす。
 例えばテキストファイルの整形や文字コード変換、
 画像ファイルのフォーマット変換や減色処理など。

ファイル取り込み型:
 ファイルの内容をスタック内に取り込む。
 例えばログ保存スタックにテキストファイルをドロップすると、
 新規カードを作ってそのフィールドにテキストを読み込む。
 或いはスタックではなく特定のファイルに、ドロップした
 テキストファイルを順次加えていくタイプも考えられる。

ファイル処理型:
 ファイルをファイルのまま処理する。
 例えば決められたftpサーバに転送したり、
 内容によってフォルダに振り分けたりする。

 他にも、フォルダ内のカタログ作成ソフト、マルチメディア系のプレイヤー、拡張子やファイルタイプに縛られずに自分用にカスタマイズ出来るラウンチャーなども考えられます。


 ドロップさせたファイルを他のアプリケーションで開く場合は、launch命令などを使います。開くアプリケーションを固定するなら、launch filePath with appName でOK。いわゆるラウンチャーはこの方法で行けるでしょう。

 しかしそのファイルを作ったアプリ(或いは関連づけされているアプリ)で開くには、ちょいと技が必要です。以下のスクリプトを使えば、アプリならそのまま起動、ファイルならクリエータ情報(や関連づけ)に従ってアプリが起動、フォルダやボリュームならウィンドウが開きます。

マック用
-- 渡されたパスのファイルをAppleScriptで開くルーチン
-- パスは予め revMacFromUnixPath でマック形式にしておいて下さい。
on openByFinder tgPath
  put "tell application" &"e& "Finder" "e into myAS
  put " to open alias" &"e& tgPath "e after myAS
  do myAS as AppleScript
end openByFinder
 むむ。’quote’が文字化けしますね。全角で書き直して置きます。
put ”tell applicarion” &&quote& ”Finder” &quote into myAS
put ” to open alias” &&quote& tgPath &quote after myAS

Windows用
-- ドロップされたファイルのショートカットを作り、
-- スタートメニューから実行するスクリプト。小島健治さん作
on openStack
  get $1
  create alias "C:/Temp.lnk" to file it
  set the hideConsoleWindows to true
  get shell("start C:\Temp.lnk")
  delete file "C:\Temp.lnk"
end openStack

 アプリケーションウィンドウではなく、敢えてアプリケーションファイルにドロップさせる意味は、よく考える必要がありそうです。特にWindowsではこの方法は余り一般的ではないようですから。


2005.03.03
2005.03.11
UDI

inserted by FC2 system