(Xojo)ListBoxからFinderにドロップしたDragItem.FolderItemのパスを得る

| コメント(0) | トラックバック(0)

引き続きXojo(とMacOS)ネタ。

要するに、こういうことをやりたいとき、Dropされたアイテムのパスを得られないとどうしようもないのですが、DragItem.Destinationというプロパティでこれが実現できる、とあります(サポートに教えてもらった)。但しこれはMac OS限定ということでWindows、Linuxではダメらしい。今回はMac OS限定の開発なので、これでできると思いきや、Carbonでは動くがCocoaではこの値がとれない(現段階でサポートに確認中)。で、このためだけにCarbonにするのも悔しかったので、どうにかやってみようと。

アプリのリストボックスからアイテムをドラッグ&ドロップしたい

アプローチその1. エイリアスを作ってTimerで監視

MakeAliasというAppleScriptを作ってテンポラリ領域に作ったファイルのエイリアスを作り、Timerを使ってドラッグされた先のパスを見る。


on run (theOriginal)
    set theOriginal to POSIX file theOriginal
    set theOriginal to alias theOriginal
    tell application "Finder"
        set theFolder to folder of theOriginal
        make new alias file at theFolder to theOriginal returning theResult
        set theResult to theResult as string
    end tell
    --set theResult to POSIX path of theResult
    return theResult
end run

オリジナルのアイテムのパスを得るためにResolveAliasというAppleScriptを作る。

on run (theOriginal)
    set theOriginal to alias theOriginal
    tell application "Finder"
        set theResult to (original item of theOriginal) as alias
    end tell
    set theResult to POSIX path of theResult
    return theResult
end run

結論から言うと、これはNG。またもやCarbonで動くがCocoaでアウトなのでした。DragItem.FolderItemがMoveではなくCopyになってしまう。なので、オリジナルのパスはテンポラリ領域のファイルとなる(ただ、せっかくやったのでこうやって書いておくのだ。きっとどこかで誰かが、あるいは自分の役に立つので)。POSIX path というのが使えるのを学びましたよ(PathをUnixタイプのNative Pathに変換してくれる)。

アプローチその2. Spotlightを使ってTimerで監視

こちらは上手く行きました。ちょっとだけタイムラグが出るのが玉にきずですが。

Dim command As String = "mdfind -name " + DraggingItem
Dim Sh As New Shell
Sh.Execute( command )
Dim Res As String = Sh.ReadAll

要するに、存在しないファイル名(乱数から生成したMD5ハッシュ値とタイムスタンプとかから組み立てたファイル名)でテンポラリファイルを作り、不可視にしてDragさせる。同時にTimerを走らせる。If System.MouseDown = False Then (マウスが押されていない状態になった時)に上記を実行する(mdfindというコマンドがあって、こいつは Spotlight のコマンドラインツールなのです。

多少のタイムラグが出るものの、これでドラッグされた不可視アイテムのパスが得られるので、その親(フォルダ)に対して選択されたアイテムをダウンロードさせる、という方法。存在しないファイル名として作ったファイル名が本当に存在しないかどうかも同じコマンドで得られるので。

ただ、やっぱりちゃんと DragItem.Destination なりでサポートして欲しいと思ったのでした。とりあえずCocoa化はできた。Carbonはやっぱり速度とかLook & Feelが美しくないので、やっぱり作るならCocoaで作りたいよね。

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/712

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2013年12月 6日 13:16に書いたブログ記事です。

ひとつ前のブログ記事は「Perlで書いたスクリプトにXojoでGUIを被せる。」です。

次のブログ記事は「(Xojo)MenuItemを配列にしたときのメニューハンドラでのメニュー判別」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6