![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как "вырезать" файл в Clipboard???
MTsv DN © (2007-09-21 20:26:00)Всем привет...
Собственно сабж. В сети нарыл как "скопировать" (вот код, может кому пригодиться):
procedure CopyFilesToClipboard(FileList: String);
var
DropFiles: PDropFiles;
hGlobal: THandle;
iLen: Integer;
begin
iLen := Length(FileList);
hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen);
if (hGlobal = 0) then
begin
// Error!!!
Exit;
end;
DropFiles := GlobalLock(hGlobal);
DropFiles^.pFiles := SizeOf(TDropFiles);
Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
GlobalUnlock(hGlobal);
if OpenClipboard(0) then
begin
SetClipboardData(CF_HDROP, hGlobal);
CloseClipboard;
end;
end;
Файлы/Каталоги должны разделяться "#0", на конце стоять "#0#0".
И, кое-где подсмотрев, написал "Вставить":
procedure PasteFilesFromClipboard(PathTo: KOLString);
var
DropFiles: PDropFiles;
hGlobal: THandle;
i, Count : Integer;
PathFrom : PChar;
begin
if OpenClipboard(0) then
begin
hGlobal := GetClipboardData(CF_HDROP);
DropFiles := GlobalLock(hGlobal);
if DropFiles <> nil then
begin
Count := DragQueryFile(hGlobal, DWORD(-1), nil, 0);
PathFrom := CoTaskMemAlloc(MAX_PATH);
for i := 0 to Count - 1 do
begin
DragQueryFile(hGlobal, i, PathFrom, MAX_PATH);
GlobalUnlock(hGlobal);
uShellCopy(Form.Handle, PathFrom, PathTo);
end;
CloseClipboard;
end;
end;
end;
А вот как сделать "вырезку" не знаю...уже "туплю"... Может кто уже сталкивался с этим... Помогите...
MTsv DN (2007-09-25 19:16:00) [1]Ну, и в завершении, открытой мной, темы, код определения операции над файлами (Вырезать/Скопировать). Это дополнение к коду non'а. Сделал одной функцией для себя, но думаю разобраться не составит труда:
procedure PasteFilesFromClipboard(PathTo: KOLString);
var
IsFilesCut : boolean;
hGlobal: THandle;
i, Count : Integer;
PathFrom : PKOLChar;
Medium : TSTGMedium;
Format : TFormatETC;
D : IDataObject;
gl : ^DWORD;
begin
IsFilesCut := false;
if IsClipboardFormatAvailable(CF_PREFERREDDROPEFFECT) then
begin
if OleGetClipboard(D) = S_OK then
begin
Format.cfFormat := CF_PREFERREDDROPEFFECT;
Format.ptd := nil;
Format.dwAspect := DVASPECT_CONTENT;
Format.lindex := -1;
Format.tymed := TYMED_HGLOBAL;
ZeroMemory(@Medium, SizeOF(Medium));
if D.GetData(Format, Medium) = S_OK then
begin
gl := GlobalLock(medium.hGlobal);
if ((gl^ and DROPEFFECT_COPY) = DROPEFFECT_COPY) then
IsFilesCut := false;
if gl^ = DROPEFFECT_MOVE then
IsFilesCut := true;
GlobalUnlock(medium.hGlobal);
ReleaseStgMedium(medium);
end;
end;
end;
if OpenClipboard(0) then
begin
hGlobal := GetClipboardData(CF_HDROP);
CloseClipboard;
DropFiles := GlobalLock(hGlobal);
if DropFiles <> nil then
begin
Count := DragQueryFile(hGlobal, DWORD(-1), nil, 0);
PathFrom := CoTaskMemAlloc(MAX_PATH);
for i := 0 to Count - 1 do
begin
DragQueryFile(hGlobal, i, PathFrom, MAX_PATH);
frmMain.ShellCopy(frmMain.Form.Handle, PathFrom, PathTo, IsFilesCut);
end;
end;
GlobalUnlock(hGlobal);
GlobalFree(hGlobal);
end;
end;
MTsv DN (2007-09-25 09:05:00) [2]О как... Все OLE-связки по нескольку раз проверил, а оказывается забыл буфер открыть... Респект за помощь...
mdw (2007-09-24 19:25:00) [3]Только OpenClipboard(FClipboardWindow) внутрь begin .. end двинуть нужно, поторопился я.
mdw (2007-09-24 19:13:00) [4]Молодец, блин!;)) А clipboard кто откырывать будет?
procedure TClipboard.Open(WHandle:THandle);
begin
FWHandle:=WHandle;
if FOpenRefCount = 0 then
begin
FClipboardWindow := WHandle;
if FClipboardWindow =0 then exit;
end;
OpenClipboard(FClipboardWindow);
Inc(FOpenRefCount);
end;
Хотя по поводу передачи туда FClipboardWindow спорно. Не всегда срабатывает, надежнее 0 будет. Только не спрашивай почему.:)
MTsv DN (2007-09-24 18:31:00) [5]Лю-ю-юди-Челове-е-еки... хэлп ми. ...Все меня совсем шторит... Значится так, нашел у себя в закромах портированный non'ом исходник. Начал с ним разбираться и "завис"...ктрл+алт+дел не помогает (может надо поспать)...посмотрите, кто-нить http://ifolder.ru/3469048, там все готово, почему не работает??? Вроде все result'ы := s_ok. А Wind'a не видит что в буфере, что-то есть...
MTsv DN (2007-09-22 18:18:00) [6]Респект... Буду разбираться...
ANTPro (2007-09-22 17:56:00) [7]Вот что на гуглил:
http://www.codeguru.com/cpp/w-p/clipboard/comments.php/c2997/?thread=39378
Кстати в MSDN не cut, а delete-on-paste :)
Тебе нужен CFSTR_PREFERREDDROPEFFECT насколько я понял MSDN.
MTsv DN (2007-09-22 14:58:00) [8]Привет...
> Запомнить вырезанные файлы и когда попросят вставить (перемещая)
Вспомнил, почему мне этот вариант не понравился, когда всевозможные варианты рассматривал...
Он хорош в случае, если использовать только свой код (например, как я сейчас пишу обработку стандартных CTRL+C(V)(X))... Однако, если совмещать это со стандартным меню проводника (см. тему: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1188808520&n=10), то Windows не видит различия между "моим" "Копировать" и "Вставить". Поэтому, в принципе, вопрос остался ОТКРЫТЫМ!!! Как программно "Вырезать" файл в Clipboard, так как это делает Windows???
MTsv DN (2007-09-21 21:42:00) [9]Э-э-э... Логично... То бишь вместо uShellCopy использовать МoveFile... Сэнкс... А то я уже совсем зарапортовался...
ANTPro (2007-09-21 21:03:00) [10]Запомнить вырезанные файлы и когда попросят вставить (перемещая)