2

Windows エクスプローラーを模倣するアプリケーションがありTcxShellListViewます。他のシェル コントロールの中でも を使用します。

本当に素晴らしい機能は、実際の Windows エクスプローラーと私のアプリケーションの間Copy & Pasteでファイルをやり取りできることです。Cut & Paste

Drag & Dropすぐに使用できますが、DevExpress はクリップボード側をまだ実装していないようです。

何か案は?

4

1 に答える 1

3

コピー/貼り付けを自分で実装したい場合、メカニズムはドラッグ アンド ドロップとほとんど同じです。あなたが持っているドラッグアンドドロップコードはIDataObject. DoDragDropコピーするには、ドラッグを開始するために呼び出す代わりにOleSetClipboardIDataObject. 貼り付けるには、クリップボードからOleGetClipboard取得するために呼び出します。IDataObject次に、ドロップ操作とまったく同じコードを使用してIDataObject. それだけです。

それを行う別の方法がありますが、おそらく私の見解ではより良いアプローチです。そして、それはIContextMenu仕事をするために使うことです。この例は、TurboPower tpShellShock プロジェクトにあります。ユニットShellMenuExecuteで探してください。StShlCtlDevExpress コンポーネントがシェル インターフェイスを使用している限り、つまり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

于 2013-01-25T10:25:12.460 に答える