2009-04-16 11 views
10

データベースアプリケーションを開発します。ユーザーは新しい機能を要求します:ブロブをクリップボードにコピーして、Windowsエクスプローラで新しいファイルとして貼り付けることができます。 1つの解決策は、ブロブを一時フォルダに保存し、これらの一時ファイルをクリップボードに追加することです。どのように任意のデータをファイルとしてクリップボードにコピーしますか?

しかし、私はより良い解決策を探しています。 Windowsエクスプローラで貼り付けアクションをフックし、自分でコピー先のパスにBLOBを保存することは可能ですか?

答えて

5

私は、エクスプローラがコピー先ファイル自体にコピーをしているので、ソースファイルの名前は、データをクリップボードにコピーしたアプリケーションからしか得られないため、エクスプローラである必要はありません。コピー先のフォルダに同じ名前が既に存在していて、エクスプローラだけがコピー先のファイルの名前を変更したり、ベースファイル名に "(2)"を追加するなどして、変更した名前を作成することができます。

Windowsエクスプローラのクリップボード形式を指定する必要があります。 oファイルを貼り付けることができます。 documentation of standard clipboard formatsは、CF _ HDROPが正しいことを示しています。このクリップボード形式では、ソースファイル名のリストを提供しますが、ファイルはもちろん存在する必要がありますので、にディスクに保存する必要があります。

可能な限り軽量化を図ります。通常、ユーザーがクリップボードにデータをコピーすると、ペースト操作に使用されるかどうかにかかわらず、すぐにそこに置かれます。アプリケーションのためには、ファイルを作成し、ファイル名のリストをクリップボードに入れる必要があることを意味します。ただし、WindowsではDelayed Renderingというモードがサポートされていますが、このような場合にはまさに使用されます。基本的には、データの空のスタブだけをクリップボードに置きます。別のアプリケーションがデータにアクセスしようとすると、アプリから要求されます。したがって、ユーザーがファイルをエクスプローラに貼り付けようとしたときにのみ、ディスクに保存してファイル名のリストを返すように、これを実装することができます。

1

私はコピー/ペーストでおもしろかったので、しばらくお待ちしていましたが、あなたが提案していること(クリップボードに新しいファイルとしてBLOBを挿入すること)ができると確信しています。

私は、クリップボードに追加する方法によって、コピーするデータの種類を指定できることを覚えているようです。私はあなたがそのデータ型を正しく取得すると、Windowsエクスプローラからコピーしたかのように貼り付けることができると思います。

私は機会があれば、私は(私はここに仕事ですべての私のブックマークを持っていない)、この夜試してみて、いくつかの詳細を掘るよ...

[編集]はを見てくださいthe wxWidgets documentation on drag and drop。それは私が取り組んできたことであり、データ型についていくつかのヒントを示しています。

あなたは何を書いていますか?デルファイ?

[編集2]これは実際にはWindows(?)の制限であると思います。 wxWidgetsのドキュメントだけかもしれませんが、a suggestion that you only copy filenames rather than the files themselvesがあります。その場合、最初に一時ファイルを作成するというオリジナルの提案をお願いしなければならないでしょう:-(

13

私はそれを試したことはありませんが、確かに可能だと思います。 Shell Clipboard FormatsのMSDNドキュメントをご覧ください。CFSTR_FILECONTENTSおよびCFSTR_FILEDESCRIPTORは、処理する可能性が高い形式です。

さらに、デモプログラム:How to drag a virtual file from your app into Windows Explorerを提供する記事をCode Projectで見つけました。

アップデート:.NETで書かれ例:

+0

興味深いもの - リンクありがとう:-) –

+0

ありがとうございます。毎日何か新しいことを学ぶ! –

7
MSDNの記事から

Handling Shell Data Transfer Scenarios

  • 既存のファイルは、CF_HDROP形式で提供する必要があります。
  • CFSTR_FILECONTENTS/CFSTR_FILEDESCRIPTOR 形式のファイル形式のデータを提供します。このアプローチにより、 ターゲットは、 オブジェクトからファイルを作成することが可能になります。 オブジェクトについては、 を知る必要はありません。通常、データはIStreamインターフェイスとして に提示する必要があります。この データ転送メカニズムは、 よりも柔軟性があり、グローバルメモリオブジェクト よりもはるかに少ないメモリを使用します。

MSDNから読み取るために、2件の他の良い記事です:

私が最初に私がオフに印刷されたファイルを転送するために、クリップボードを使用して作業を開始したとき3つの記事すべてを読んで、それらを数回読んでください。

インターフェイスを扱うことはかなり複雑です。私はこれを助ける2つの良いライブラリを見つけました。

The Drag and Drop Component Suite for Delphi。ホームページを下にスクロールすると、よく読まれるよくある質問が表示されます。ダウンロードしたサンプルアプリケーションもたくさんあります。 AsyncSourceのデモはあなたが探しているものに役立つはずです。このスイートはソースのあるフリーウェアです。コードはよくコメントされているようです。

現在、Quasidataの[email protected]コンポーネントを使用しています。無料ではありませんが、非常に安価です。最初はTransfer @ Onceを使用しました。その理由は、ドラッグアンドドロップコンポーネントスイートよりも優れていたからです。しかし、その状況は逆転しています。 Transfer @ OnceはまだDelphi 2009をサポートしていません。アプリケーションを動かすと、おそらくコンポーネントが切り替わります。 Transfer @ Onceコードは購入に含まれています。個人的に私はDrag and Dropコードが読みやすく、従うのがはるかに簡単であることを発見しました。

関連する問題