Windows エクスプローラーを模倣するアプリケーションがありTcxShellListView
ます。他のシェル コントロールの中でも を使用します。
本当に素晴らしい機能は、実際の Windows エクスプローラーと私のアプリケーションの間Copy & Paste
でファイルをやり取りできることです。Cut & Paste
Drag & Drop
すぐに使用できますが、DevExpress はクリップボード側をまだ実装していないようです。
何か案は?
Windows エクスプローラーを模倣するアプリケーションがありTcxShellListView
ます。他のシェル コントロールの中でも を使用します。
本当に素晴らしい機能は、実際の Windows エクスプローラーと私のアプリケーションの間Copy & Paste
でファイルをやり取りできることです。Cut & Paste
Drag & Drop
すぐに使用できますが、DevExpress はクリップボード側をまだ実装していないようです。
何か案は?
コピー/貼り付けを自分で実装したい場合、メカニズムはドラッグ アンド ドロップとほとんど同じです。あなたが持っているドラッグアンドドロップコードはIDataObject
. DoDragDrop
コピーするには、ドラッグを開始するために呼び出す代わりにOleSetClipboard
、IDataObject
. 貼り付けるには、クリップボードからOleGetClipboard
取得するために呼び出します。IDataObject
次に、ドロップ操作とまったく同じコードを使用してIDataObject
. それだけです。
それを行う別の方法がありますが、おそらく私の見解ではより良いアプローチです。そして、それはIContextMenu
仕事をするために使うことです。この例は、TurboPower tpShellShock プロジェクトにあります。ユニットShellMenuExecute
で探してください。StShlCtl
DevExpress コンポーネントがシェル インターフェイスを使用している限り、つまりIShellFolder
、同じアプローチを使用できます。このシェル ベースのアプローチの利点は、シェルに作業を任せることです。コピー ダイアログを表示する必要がある場合は、シェルが表示します。これにより、最も統合されたユーザー エクスペリエンスが得られます。
このコードは次のようになります。
procedure ShellMenuExecute(
const Sender : TObject; const Folder : IShellFolder;
var Pidl : PItemIDList; const Count : Integer;
const AHandle : THandle; ClipboardAction : TStMenuAction);
var
CM : IContextMenu;
CI : TCmInvokeCommandInfo;
begin
if Folder <> nil then begin
if (Folder.GetUIObjectOf(AHandle, Count, Pidl,
IID_IContextMenu, nil, Pointer(CM)) = NOERROR)
then begin
ZeroMemory(@CI, SizeOf(CI));
CI.cbSize := SizeOf(TCmInvokeCommandInfo);
CI.hwnd := AHandle;
case ClipboardAction of
caCut : CI.lpVerb := 'cut';
caCopy : CI.lpVerb := 'copy';
caPaste : CI.lpVerb := 'paste';
caProperties : CI.lpVerb := 'properties';
end;
CM.InvokeCommand(CI);
CM := nil;
end;
end;
end;
このコードをそのまま使用できるはずだと思います。handle パラメーターが正しく宣言されていないことを指摘しておきます。である必要がありますHWND
。の呼び出し中に表示されるダイアログの所有ウィンドウとして使用されますInvokeCommand
。