Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.048 c
2-1212434898
Jeqa
2008-06-02 23:28
2008.06.29
учет


3-1200909327
MZ
2008-01-21 12:55
2008.06.29
запрос


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


2-1212430785
S@shka
2008-06-02 22:19
2008.06.29
Как реализуется подобная вещь...


15-1211201253
mary
2008-05-19 16:47
2008.06.29
Delphi_округление чисел





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