9.2ドラッグアンドドロップ機能を開発するための一般的な手順
ドラッグアンドドロップは、Windowsが提供するオブジェクトの操作を容易にする関数であり、Delphiで簡単に開発できます。
出てくる。ドラッグアンドドロップ操作プロセスによると、開発手順は4つの段階に分けることができます。
●ドラッグ操作を開始します
●ドラッグアイテムを受け取ります
●ドラッグアイテムをドロップします
●操作のドラッグを停止します
導入プロセス中に、タブセット(タグ付きセット)ドラッグアンドドロップ操作の例を組み合わせます。インターフェイス設計を図に示します。
ユーザーが実行時にタグを別のタグの位置にドラッグすると、タグはその場所に移動して原因となります
タグセットの再配置。
9.2.1ドラッグを開始します
ドラッグモードがdmautomaticに設定されている場合、ユーザーがソースコントロールでマウスを押すと自動的にドラッグします
開始します。ドラッグを開始したい場合
Begindragメソッドを使用します。
Tabset Drag and Dropでは、以下のMousedownイベント処理を使用して、タグのドラッグを開始します。
最初に、押された左ボタンが左ボタンであるかどうかを判断し、アイテムが合法かどうかを判断します。
手順tform1.tabset1mousedown(sender:tobject; button:tmousebutton;
シフト:tshiftState; x、integer);
var
Dragitem:整数;
始める
ボタン= mbleftの場合
始める
dragitem:= tabset1.itematpos(point(x、y));
if(dragitem> -1)and(dragitem <tabset1.tabs.count)then
tabset1.begindrag(false);
終わり;
終わり;
9.2.2ドラッグされたアイテムを受信します
コントロールがドラッグアイテムを受け取ることができるかどうかは、コントロールのオンドラゴーバーイベントによって決定されます。タブセットドラッグでは、主なことはマウスの位置を使用して判断することです。
手順tform1.tabset1dragover(sender、source:tobject; x、y:integer;
状態:tdragstate; var:boolean);
var
ドロップ:整数;
始める
source = tabset1の場合
始める
droppos:= tabset1.itematpos(point(x、y));
Accept:=(droppos> -1)and(droppos <> tabset1.tabindex)および
(droppos <tabset1.tabs.count);
終わり;
それ以外
受け入れる:= false;
終わり;
9.2.3ドラッグアイテムを下ろします
Ondragoverイベント処理が返されると、Trueを受け入れ、アイテムが削除されると、ondragdropイベント
応答をドラッグしてドロップするプロセス。タブセットドラッグアンドドロップインスタンスでは、タグの位置を変更することです。
手順tform1.tabset1dragdrop(sender、source:tobject; x、y:integer);
var
Oldpos:整数;
Newpos:整数;
始める
source = tabset1の場合
始める
Oldpos:= tabset1.tabindex;
newpos:= tabset1.itematpos(point(x、y));
if(newpos> -1)および(newpos <> oldpos)then
tabset1.tabs.move(oldpos、newpos);
終わり;
終わり;
9.2.4ドラッグ操作の終了
ドラッグ操作を終了するには2つの方法があります。ユーザーがマウスキーを解放するか、プログラムがEndDragメソッドを使用します。
ドラッグを強制します。ドラッグ操作を終了することには2つの結果があります。ドロップが受け入れられるか、ドロップが無視されます。
ドラッグ操作が完了した後、ソースコントロールは、ドラッグエンドイベントonEnddragに応答するメッセージを受信します。
9.3ドラッグアンドドロップアプリケーションの例:ファイルマネージャーのドラッグアンドドロップサポート
第6章で開発されたファイルマネージャーアプリケーションの例は機能の形になり始めましたが、動作しています
Windowsのファイルマネージャーと比較して、まだ多くの欠点があります。最大の欠点は、ファイルのドラッグアンドドロップの動きをサポートしていないことです
ドラッグアンドドロップコピー。この章の最後に、この欠陥を補うことができます。
ファイルドラッグアンドドロップの動きは、ユーザーがディレクトリツリーの下のディレクトリにファイルをドラッグしてドロップするときにファイルを指します。
このディレクトリに自動的に移動します。
着用してドロップすると、ファイルはドライブの現在のディレクトリに自動的にコピーされます。ソースコントロールとしてのファイルリストボックス
ターゲットコントロールのディレクトリツリーとドライブラベルは、異なるサブウィンドウに配置できます。ドライブの現在のディレクトリは任意のサブです
このサブウィンドウがドラッグソースとドラッグターゲットと関係があるかどうかに関係なく、ウィンドウの最新の操作結果。
上記の機能を実装するには、最初に解決する必要がある2つの問題があります。
1.各ドライブの現在のディレクトリを記録する方法は?
このために、グローバル変数を定義します。
var currentDirlist:string [70]の配列[0 ... 25];
directoryoutlineのオンチェンジイベントで:
手順tfmform.directoryoutlineChange(sender:tobject);
始める
CreateCaption;
filelist.clear;
filelist.directory:= directoryoutline.directory;
filelist.update;
CurrentDirlist [drivetabset.tabindex]:= directoryoutline.directory;
filemanager.directorypanel.caption:= directoryoutline.directory;
終わり;
drivetabsetは、ondragdropイベントに応答する前にonclickイベントに応答し、イベントによってアクティブ化されるため
directoryoutlineのオンチェンジイベントを送信すると、いつでもondragdropイベントで使用できるようにすることができます
空の文字列ではないように、現在のダイリストアレイアイテム。
2。動きの無関係性を確保し、亜風とのコピーを確保する方法は?
ここで重要な問題は、ソースコントロールを判断するときに、ISオペレーターを使用してタイプチェックを実行することです。
ソースがtfileListの場合は…
次のステートメントを使用する場合:
source = filelistの場合
…
その後、動きとコピーの操作は、このサブウィンドウの範囲に制限されます。
上記の質問を解決したとき、私たちの仕事はドラッグアンドドロップの一般的な開発ステップに従っていただけで、段階的に完了しました。
1.FILELISTは操作のドラッグを開始します
手順tfmform.fileListmousedown(送信者:tobject; button:tmousebutton;
シフト:tshiftState; x、integer);
始める
ボタン= mbleftの場合
TfileListboxのように送信者と
始める
itematpos(point(x、y)、true)> = 0の場合
Begindrag(false);
終わり;
終わり;
itematposは、現在ファイルがあるかどうかを確認するために使用されます。 BegindRagメソッドはパラメーターのfalseを渡し、ファイルリストがドラッグを開始せずにマウスイベントを個別に処理できるようにします。実際、この状況は大量に存在します。
2。DirectoryOutlineとDrivetabsetは、ドラッグを受け入れるかどうかを決定し、その場に置くかどうかを決定します。
手順tfmform.directoryoutlinedragover(sender、source:tobject; x、
Y:整数:tdragstate:
始める
ソースがtfileListboxの場合
Accept:= true;
終わり;
手順tfmform.drivetabsetdragover(sender、source:tobject; x、
Y:整数:tdragstate:
var
プロップ:整数;
始める
ソースがtfileListboxの場合
drivetabsetを使用します
始める
propos:= itematpos(point(x、y));
Accept:=(proppos> -1)and(proppos <tabs.count);
終わり;
終わり;
DirectoryOutlineは無条件の受け入れですが、Drivetabsetはそれが法的タグであるかどうかを確認する必要があります。
3。応答をドラッグアンドドロップします
DirectoryOutlineドラッグアンドドロップは、ファイルの移動機能を実装するために使用されます。プログラムのConfirmChangeイベントを呼び出します
処理プロセス中に、ターゲットパスはdirectoryoutline.items [getItem(x、y)]。fullpathによって取得されます。
手順tfmform.directoryoutlinedragdrop(sender、source:tobject; x、
Y:整数);
始める
ソースがtfileListboxの場合
DirectoryOutlineを使用してください
始める
cunsileChange( 'move'、filelist.filename、items [getItem(x、y)]。fullpath);
終わり;
終わり;
DriveTabsetドラッグアンドドロップは、ファイルコピー機能を実装するために使用されます。現在の位置をプログラム内の対応するドライバーに変換します
アクチュエータの文字、ターゲットパスは、currentDirlist [drivetabset.tabindex]によって取得されます。
手順tfmform.drivetabsetdragdrop(sender、source:tobject; x、y:integer);
var
Apoint:tpoint;
始める
apoint.x:= x; y:= y;
drivetabset.tabindex:= drivetabset.itematpos(apoint);
ソースがtfileListboxの場合
drivetabsetを使用します
始める
currentDirlist [tabindex] <> ''の場合
cunsileChange( 'copy'、thefileName、currentDirlist [tabindex]);
終わり;
終わり;
4.ファイルリストをドラッグして更新するためのファイルリストの応答
手順tfmform.filelistenddrag(sender、target:tobject; x、y:integer);
始める
ターゲット<> nilの場合、filelist.update;
終わり;