XojoでのドロップレットUI
2017/07/18XojoでドロップレットのUIを作る必要があって調べたので備忘録として記しておきます。そのうちまた必要になりそうだし。なおMacで作ってます。Winでどうなのかはテストしてないのでわからないけど流れは多分ほぼ同じ。
アプリアイコンへのドラッグアンドドロップ
アプリアイコンへのドラッグアンドドロップのやり方は以下。
1 ファイルタイプグループを作成
 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。
 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。
2 ビルド設定でドロップできるようにするファイルタイプを選択
 ビルド設定でドロップできるようにするファイルタイプを選択する。1で適切にファイルタイプを設定していれば選択できるようになっているはず。
 ビルド設定でドロップできるようにするファイルタイプを選択する。1で適切にファイルタイプを設定していれば選択できるようになっているはず。
3 Appのイベントハンドラ種別でOpenDocumentを選んでコードを記述
AppのイベントハンドラでOpenDocumentを選んで実行したいコードを書く。例えば以下のような感じ。例では拡張子が.TXT以外のものをハネるようにチェックを入れている。もうちょいスマートな方法がありそうなのだが。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | If item <> Nil And item.exists Then   dim path as String = item.NativePath   '++++++++++++++TXTファイルかどうかのチェック++++++++++++++   Dim txtOrNotValue As Boolean   txtOrNotValue = checkTxtFileOrNotValue(path)   if txtOrNotValue  then     MsgBox path   Else     Exit   End if Else   MsgBox(item.name+" doesn't seem to exist") End If quit | 
チェック用メソッドは
| 1 2 3 4 5 6 7 8 9 10 11 12 | Dim txtOrNot As Boolean = True '++++++++++++++TXTファイルかどうかのチェック++++++++++++++ Dim rg as New RegEx Dim myMatch as RegExMatch rg.SearchPattern= "\.txt$" myMatch=rg.search(checkFilePath) if myMatch <> Nil then   Return True else   Return False End if | 
単純に正規表現で拡張子をチェックしてマッチするかどうかでTrue/Falseを返して判定してる感じ。
特定のウィンドウ内領域へのドラッグアンドドロップ
特定のウィンドウ内領域へのドラッグアンドドロップのやり方は以下。
1 ファイルタイプグループを作成
 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。
 新規にファイルタイプグループを作成し、適宜ドロップしたいファイルタイプを登録する。豊富にファイルタイプのバリエーションが用意されているのでその中から選ぶ感じ。なければ作る。
2 ドラッグ&ドロップの対象にしたいエリアを作る
 ドラッグ&ドロップの対象にしたいエリアを適宜作る。例ではWindow1の中にdropAreaという領域を設定している。
 ドラッグ&ドロップの対象にしたいエリアを適宜作る。例ではWindow1の中にdropAreaという領域を設定している。
3 イベントハンドラ「Open」を設定
 ドラッグ&ドロップの対象エリアにイベントハンドラ「Open」を作り、コードを記述する。コードは以下。
 ドラッグ&ドロップの対象エリアにイベントハンドラ「Open」を作り、コードを記述する。コードは以下。
| 1 | me.AcceptFileDrop(DropTypes.Text) | 
DropTypes.Textの部分は適宜変える。ドロップされるファイルの種別区分をしないならDropTypes.Allとか。
4 イベントハンドラ「DropObject」を設定
 ドラッグ&ドロップの対象エリアにイベントハンドラ「DropObject」を作り、コードを記述する。コードは以下。
 ドラッグ&ドロップの対象エリアにイベントハンドラ「DropObject」を作り、コードを記述する。コードは以下。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | if obj.FolderItemAvailable then   dim f as FolderItem = obj.FolderItem   dim path as String = f.NativePath   '++++++++++++++TXTファイルかどうかのチェック++++++++++++++   Dim txtOrNotValue As Boolean   txtOrNotValue = checkTxtFileOrNotValue(path)   if Not txtOrNotValue  then     Exit   End if   If f <> Nil Then     dropArea.Text = path   End If end | 
記述例では拡張子が.TXTかどうかをチェックした上で.TXTだった場合にパスをエリア内に記述している。チェックメソッドのコードは上と同じなので割愛。
複数ファイルをドロップして連続実行させるには「do〜Loop Until Not obj.NextItem」で全体を囲む。
(2017.7.19)
※「RegExはデフォルトで大文字小文字を区別しない」との情報をいただいたのでコードをプチ修正しました。
(2017.7.19追記)
※複数ファイルドロップの場合について追記
(2022.3.4追記)
