Главная страница
    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.039 c
15-1210717900
Житель_форума
2008-05-14 02:31
2008.06.29
Parser


2-1212412416
Ceil
2008-06-02 17:13
2008.06.29
Переименование


15-1208404328
brother
2008-04-17 07:52
2008.06.29
Совет по железу


2-1212587348
Михаил
2008-06-04 17:49
2008.06.29
Мне нужно сделать так чтобы моя форма была выше ..


10-1146918480
Dmitrij_K
2006-05-06 16:28
2008.06.29
IHTMLDocument2 получение всех ссылок





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский