Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.29;
Скачать: CL | DM;

Вниз

Как "вырезать" файл в 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 вся ветка

Текущий архив: 2008.06.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
15-1210944131
ekto
2008-05-16 17:22
2008.06.29
Оформление кода


15-1210745245
pasha_golub
2008-05-14 10:07
2008.06.29
Нарезалка DVD CD


15-1210658822
БарЛог
2008-05-13 10:07
2008.06.29
Домен зарегистрирован, не делегирован


2-1212160292
programmer90
2008-05-30 19:11
2008.06.29
Количество оперативной памяти в системе.


2-1212069255
Vlad Oshin
2008-05-29 17:54
2008.06.29
RTTI. Не понял что за результат





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский