Главная страница
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.5 MB
Время: 0.018 c
2-1212353489
Blue Dragon
2008-06-02 00:51
2008.06.29
Инвертировать Нумлок и Капслок


2-1212491944
ZENsan
2008-06-03 15:19
2008.06.29
Interface...


2-1212520908
Ильдар
2008-06-03 23:21
2008.06.29
Удаление каталога


15-1210793838
No_Dead
2008-05-14 23:37
2008.06.29
Перекрестные ссылки на сайте


15-1210851293
Marij
2008-05-15 15:34
2008.06.29
PageControl