delphiで作ったソフトとエクスプローラーの間でクリップボードを使ってファイルをコピー、貼り付け、切り取りをしたいのですが
どのようにすればファイルをクリップボードに貼り付けたり、コピーできるのかインターネットで探してもよくわかりません
もし知っている方がおられましたらご教授ください
http://homepage3.nifty.com/m-and-i/tips/tipspage.htm
CP(2,972byte)
このコンポーネントも試しましたが貼り付けと切り取りがうまくいきませんでした
何でもいいからファイル切り取りして、クリップボードを開いて
クリップボード保存して。メモ帳で開いて、
中のデータ覗いて 検索にかける
↓
ほら いっぱいでてきた。
↓
http://netez.com/2xExplorer/shellFAQ/adv_drag.html#shclip
ちょっとDelphiで遊んできます。 ■Юヘ(^_^) バタン
すいません 英語のページで何が書いてあるのかわかりません
できれば delphiのコードで書かれた例など ないでしょうか?
お手数かけますm(_ _)m
一個翻訳完了?・・・ 英語でなくC→Delphiだけど
いっちょあがり。
とりあえずクリップボートからデータとるだけだけど
あとでみて
どこのユニットにあるのかわかりやすいように。
ユニット.型
ユニット.関数
で定義しています。
uses Clipbrd,ActiveX,ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
DataObject : ActiveX.IDataObject; // LPDATAOBJECT
FormatEtcIn : ActiveX.TFormatEtc; // FORMATETC
medium : ActiveX.tagSTGMEDIUM; // STGMEDIUM
nFiles , i : Integer;
Buf : array[0..MAX_PATH+500] of Char;
FileListsText : String;
V : Variant;
begin
FileListsText := '';
if Clipboard.HasFormat(CF_HDROP) then
begin
FormatEtcIn.cfFormat := CF_HDROP;
FormatEtcIn.ptd := nil;
FormatEtcIn.dwAspect := DVASPECT_CONTENT;
FormatEtcIn.lindex := -1;
FormatEtcIn.tymed := TYMED_HGLOBAL;
if ActiveX.OleGetClipboard(DataObject) = 0 then
try
V := DataObject.GetData(FormatEtcIn , medium);
if Not VarIsClear(V) then
begin
nFiles := ShellAPI.DragQueryFile(medium.hGlobal
, $FFFFFFFF, nil, 0);
for i := 0 to nFiles-1 do
begin
DragQueryFile(medium.hGlobal , i, Buf, SizeOf(Buf)-1);
if (i=0) then
FileListsText := Buf
else
FileListsText := FileListsText + #13#10+ Buf;
end;
end;
finally
DataObject._Release;
end;
end;
Memo1.Text := FileListsText;
end;
コピー、カット、情報がどこにあるのかまだわからないので
探し中。
米MSDN
OleGetClipboard
http://msdn.microsoft.com/library/en-us/com/html/c5e7badb-339b-48d5-8c9a-3950e2ffe6bf.asp
OleSetClipboard
http://msdn.microsoft.com/library/en-us/com/html/741def10-d2b5-4395-8049-1eba2e29b0e8.asp
日MSDNには情報ないようなので
このへんで訳すといいです
http://www.excite.co.jp/world/english/web/
DelphiについているPlatform SDKヘルプ(英語だけど)にも乗っています
遊び疲れて、あきたので 撤退します
では、ほかのかた ヨロピコ(;_;)/~~~
ここもやくにたちます
http://sapporo.cool.ne.jp/tanomi/qanda/a056.html
ここにもあった
http://sapporo.cool.ne.jp/tanomi/qanda/a055.html
こちらをどうぞ。
貼り付けのほうは 自分で
http://sapporo.cool.ne.jp/tanomi/qanda/a056.html
を 解読してください
http://sapporo.cool.ne.jp/tanomi/qanda/a055.html
は ↓みたいな感じです。
procedure TForm1.Button2Click(Sender: TObject);
var
MyHandle : THandle;
hDrop : Pointer;
nFiles , i : Integer;
Buf : array[0..MAX_PATH+500] of Char;
FileListsText : String;
dwEffect : Word;
CF_DROPEFFECT : UINT;
begin
if Clipboard.HasFormat(CF_HDROP) then
begin
MyHandle := Clipboard.GetAsHandle(CF_HDROP);
if MyHandle <>0 then hDrop := Windows.GlobalLock(MyHandle);
if hDrop<>nil then
try
nFiles := DragQueryFile(Integer(hDrop) , $FFFFFFFF, nil, 0);
for i := 0 to nFiles-1 do
begin
DragQueryFile(Integer(hDrop) , i, Buf, SizeOf(Buf)-1);
if (i=0) then
FileListsText := Buf
else
FileListsText := FileListsText + #13#10+ Buf;
end;
finally
if MyHandle <>0 then GlobalUnlock(MyHandle);
end;
end;
CF_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
if Clipboard.HasFormat(CF_DROPEFFECT) then
begin
MyHandle := Clipboard.GetAsHandle(CF_DROPEFFECT);
if MyHandle <>0 then
begin
hDrop := Windows.GlobalLock(MyHandle);
try
dwEffect := PWord(hDrop)^;
finally
if MyHandle <>0 then GlobalUnlock(MyHandle);
end;
end;
end;
if (dwEffect and DROPEFFECT_COPY)>0 then
begin
//コピー
Memo1.Lines.Add('コピー');
end;
if (dwEffect and DROPEFFECT_MOVE)>0 then
begin
//切り取り
Memo1.Lines.Add('切り取り');
end;
if (dwEffect and DROPEFFECT_LINK)>0 then
begin
//ショートカット
Memo1.Lines.Add('ショートカット');
end;
Memo1.Lines.Add(FileListsText);
end;
おはよぉーーー♪
完成♪
ちょっと使ってミソ
// ****************************************************
// Exploror_ClipbrdDrops
//
// エクスプローラーの貼り付け、切り取り は
// クリップボードとやりとりしているので、
// そこからデータをもらってくる関数です。
// ファイルの名前と動作を取得します。
// 移動などの操作は、別に記述する必要があります。
// ****************************************************
unit Exploror_ClipbrdDrops;
interface
uses Windows , Classes ,SysUtils
,ShlObj,Clipbrd ,ShellAPI;
function ClipboardFromFiles(var AFlag:Word) : string;
// 使用例:
// S := ClipboardFromFiles(AFlag);
// if (AFlag and DROPEFFECT_COPY)>0 then ...
function FilesToClipboard( Handle:HWND; AFiles : string; Flag:Word) : boolean;
// 使用例:
// ClipboardFromFiles(Handle,'C:\WINDOWS\シャボン.bmp', DROPEFFECT_LINK);
// ClipboardFromFiles(Handle, Memo1.Text , DROPEFFECT_COPY);
// ClipboardFromFiles(Handle, Memo1.Text , DROPEFFECT_COPY or DROPEFFECT_LINK);
{ AFlag 複数の場合は or でつなげる。
DROPEFFECT_COPY
DROPEFFECT_MOVE
DROPEFFECT_LINK
}
implementation
function ClipboardFromFiles(var AFlag:Word) : string;
var
MyHandle : THandle;
hDrop : Pointer;
nFiles , i : Integer;
Buf : array[0..MAX_PATH+500] of Char;
FileListsText : String;
dwEffect : Word;
CF_DROPEFFECT : UINT;
begin
Result := '';
AFlag := 0;
if Not (Clipboard.HasFormat(CF_HDROP)) then Exit;
MyHandle := Clipboard.GetAsHandle(CF_HDROP);
if MyHandle <> 0 then hDrop := Windows.GlobalLock(MyHandle);
if hDrop <> nil then
try
nFiles := DragQueryFile(Integer(hDrop) , $FFFFFFFF, nil, 0);
for i := 0 to nFiles-1 do
begin
DragQueryFile(Integer(hDrop) , i, Buf, SizeOf(Buf)-1);
if (i=0) then
FileListsText := Buf
else
FileListsText := FileListsText + #13#10+ Buf;
end;
Result := FileListsText;
finally
if MyHandle <>0 then GlobalUnlock(MyHandle);
end;
CF_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
if Clipboard.HasFormat(CF_DROPEFFECT) then
begin
MyHandle := Clipboard.GetAsHandle(CF_DROPEFFECT);
if MyHandle <>0 then
begin
hDrop := Windows.GlobalLock(MyHandle);
try
dwEffect := PWord(hDrop)^;
finally
if MyHandle <>0 then GlobalUnlock(MyHandle);
end;
end;
end;
AFlag := dwEffect;
end;
function FilesToClipboard( Handle:HWND; AFiles : string; Flag:Word) : boolean;
var
StrList : TStringList;
i , TotalBufSize : integer;
Word_Pointer : PWord;
dfs : DROPFILES;
hDrop : HGLOBAL;
pDrop : PChar;
hDropEffect : HGLOBAL;
CF_DROPEFFECT : UINT;
MemError : Boolean;
begin
Result := False; MemError := False;
//CF_HDROPを作成
FillChar(dfs,sizeof(DROPFILES),#0);
StrList := TStringList.Create;
if (Length(AFiles)>0) then
try // ここから下は 1 個以上でないと中に入れない♪
StrList.Text := AFiles;
dfs.pFiles := sizeof(dfs);
// PChar (* Char) なので、最後のnullも足す
// 総テキスト バッファのサイズ計算。
for i:= 0 to StrList.Count-1 do
if i=0 then
TotalBufSize := Length(StrList.Strings[i])+1
else
Inc(TotalBufSize, Length(StrList.Strings[i])+1);
Inc(TotalBufSize); // 文字列ポインタの最後のnull用 ** Char
// メモリを確保
hDrop := GlobalAlloc(GHND, sizeof(DROPFILES)
+ TotalBufSize);
// GHND = GMEM_MOVEABLE or MEM_ZEROINIT
// nullで初期化指定なので、ポンポン放り込むだけ♪
pDrop := GlobalLock(hDrop);
if (hDrop<>0) then
try
try
// メモリを丸ごとコピー
System.Move(dfs , pDrop^ , sizeof(DROPFILES));
// 文字列配列ポインタの最初へ移動
pDrop := Ptr(Integer(pDrop) + sizeof(DROPFILES));
for i := 0 to StrList.Count-1 do
begin
StrCopy(pDrop , PChar(StrList.Strings[i]));
// ポインタを次の文字列の先頭に移す
pDrop := Ptr(Integer(pDrop)+(Length(StrList.Strings[i])+1));
end;
except
MemError := True;
end;
finally
GlobalUnlock(hDrop);
end;
//Preferred DropEffectを作成
try
hDropEffect := GlobalAlloc(GHND, sizeof(DWORD));
Word_Pointer := GlobalLock(hDropEffect);
Word_Pointer^ := Flag;
GlobalUnlock(hDropEffect);
except
MemError := True;
end;
//クリップボードにデーターをセット
if Not(MemError) then
CF_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
if Not(MemError) then
if Not(OpenClipboard(Handle)) then
begin
// ロックされていてクリップボードが使えないので
// 操作の取り消し
MemError := True;
end
else
try
EmptyClipboard();
MemError := False; // 必要ないけど念のため
SetClipboardData(CF_HDROP, hDrop);
SetClipboardData(CF_DROPEFFECT, hDropEffect);
Result := True;
finally
CloseClipboard();
end;
if MemError then
begin // メモリ操作で違反を起こしたので解放して終了
if hDrop>0 then GlobalFree(hDrop);
if hDropEffect>0 then GlobalFree(hDropEffect);
end
finally
StrList.Free;
end;
end;
end.
使い方
procedure TForm1.Button3Click(Sender: TObject);
begin
FilesToClipboard(Handle,Memo1.Lines.Text,DROPEFFECT_COPY)
end;
procedure TForm1.Button2Click(Sender: TObject);
var
dwEffect : Word;
begin
Memo1.Text := ClipboardFromFiles(dwEffect);
Memo2.Clear;
if (dwEffect and DROPEFFECT_COPY)>0 then
begin
//コピー
Memo2.Lines.Add('コピー');
end;
if (dwEffect and DROPEFFECT_MOVE)>0 then
begin
//切り取り
Memo2.Lines.Add('切り取り');
end;
if (dwEffect and DROPEFFECT_LINK)>0 then
begin
//ショートカット
Memo2.Lines.Add('ショートカット');
end;
end;
1さん、ソースつきでわかりやすい解説ありがとうございました。
1さんのソースと教えてくれたサイトのおかげで解決しました。
ツイート | ![]() |