Форум: "KOL";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизКак "вырезать" файл в Clipboard??? Найти похожие ветки
← →
MTsv DN © (2007-09-21 20:26) [0]Всем привет...
Собственно сабж. В сети нарыл как "скопировать" (вот код, может кому пригодиться):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;
А вот как сделать "вырезку" не знаю...уже "туплю"... Может кто уже сталкивался с этим... Помогите...
← →
ANTPro © (2007-09-21 21:03) [1]Запомнить вырезанные файлы и когда попросят вставить (перемещая)
← →
MTsv DN © (2007-09-21 21:42) [2]Э-э-э... Логично... То бишь вместо uShellCopy использовать МoveFile... Сэнкс... А то я уже совсем зарапортовался...
← →
MTsv DN © (2007-09-22 14:58) [3]Привет...
> Запомнить вырезанные файлы и когда попросят вставить (перемещая)
Вспомнил, почему мне этот вариант не понравился, когда всевозможные варианты рассматривал...
Он хорош в случае, если использовать только свой код (например, как я сейчас пишу обработку стандартных CTRL+C(V)(X))... Однако, если совмещать это со стандартным меню проводника (см. тему: http://delphimaster.net/view/11-1188808520/), то Windows не видит различия между "моим" "Копировать" и "Вставить". Поэтому, в принципе, вопрос остался ОТКРЫТЫМ!!! Как программно "Вырезать" файл в Clipboard, так как это делает Windows???
← →
ANTPro © (2007-09-22 17:56) [4]Вот что на гуглил:
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 18:18) [5]Респект... Буду разбираться...
← →
MTsv DN © (2007-09-24 18:31) [6]Лю-ю-юди-Челове-е-еки... хэлп ми. ...Все меня совсем шторит... Значится так, нашел у себя в закромах портированный non"ом исходник. Начал с ним разбираться и "завис"...ктрл+алт+дел не помогает (может надо поспать)...посмотрите, кто-нить http://ifolder.ru/3469048 , там все готово, почему не работает??? Вроде все result"ы := s_ok. А Wind"a не видит что в буфере, что-то есть...
← →
mdw © (2007-09-24 19:13) [7]Молодец, блин!;)) А 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 будет. Только не спрашивай почему.:)
← →
mdw © (2007-09-24 19:25) [8]Только OpenClipboard(FClipboardWindow) внутрь begin .. end двинуть нужно, поторопился я.
← →
MTsv DN © (2007-09-25 09:05) [9]О как... Все OLE-связки по нескольку раз проверил, а оказывается забыл буфер открыть... Респект за помощь...
← →
MTsv DN © (2007-09-25 19:16) [10]Ну, и в завершении, открытой мной, темы, код определения операции над файлами (Вырезать/Скопировать). Это дополнение к коду 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;
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c