Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
свр
0 / 0 / 1
Регистрация: 25.10.2010
Сообщений: 24
1

Перемещение файлов с помощью DragQueryFile

24.09.2011, 10:13. Просмотров 2127. Ответов 7
Метки нет (Все метки)

Здравствуйте. Я хочу обрабатывать выбор пунктов меню "копировать" и "вырезать" стандартного проводника в своей программе. То есть, после того, как в обычном проводнике пользователь выбрал пункт "копировать" (но не выбирал пункт "вставить"), и после нажатия какой-нибудь кнопки в моем приложении, он узнал, какие файлы он скопировал. Это я делаю с помощью процедуры DragQueryFile. А как узнать, скопированы были файлы или вырезаны?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2011, 10:13
Ответы с готовыми решениями:

Перемещение файлов
Нужна программа которая по нажатию кнопки берет файл например (C:\Documents and...

Перемещение файлов
Здравствуйте, не могу домыслить как переместить несколько файлов в созданнную...

Перемещение файлов.
Допустим в листбокс1 у меня список файлов. Эти файлы находятся рядом с...

Перемещение файлов
Здравствуйте! подскажите что не так? if not...

Перемещение найденых файлов
Как переписать цикл чтобы сохранил все найденные файлы одним кликом? unit...

7
AndyZorg
Заблокирован
24.09.2011, 11:41 2
Курите Clipboard. Вот код
DropEffect
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
   ClipFormat,hn,dt: Cardinal;
   szBuffer: array[0..511] of Char;
   FormatID: string;
   pMem: Pointer;
 begin
   if not OpenClipboard(Handle) then Exit;
   try
     ClipFormat := EnumClipboardFormats(0);
     while (ClipFormat <> 0) do begin
       GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer));
       FormatID := string(szBuffer);
       if SameText(FormatID,'Preferred DropEffect') then begin
         hn := GetClipboardData(ClipFormat);
         pMem := GlobalLock(hn);
         Move(pMem^,dt,4);// <- теперь в dt тип операции
         GlobalUnlock(hn);
         Break;
       end;
       ClipFormat := EnumClipboardFormats(ClipFormat);
     end;
  finally
     CloseClipboard;
   end;
end;
а типы операций вот:
DROPEFFECT_NONE 0 Drop target cannot accept the data.
DROPEFFECT_COPY 1 Drop results in a copy. The original data is untouched by the drag source.
DROPEFFECT_MOVE 2 Drag source should remove the data.
DROPEFFECT_LINK 4 Drag source should create a link to the original data.
DROPEFFECT_SCROLL 0x80000000 Scrolling is about to start or is currently occurring in the target. This value is used in addition to the other values.

Надеюсь помог
0
свр
0 / 0 / 1
Регистрация: 25.10.2010
Сообщений: 24
24.09.2011, 21:09  [ТС] 3
Да, работает. Спасибо. Только почему-то константы DROPEFFECT_NONE и т.д. не определяются...

И еще, как в своей программе сделать то же самое? То есть, добавить в своей программе файлы на копирование или вырезание, чтобы системный проводник это понял?
0
AndyZorg
Заблокирован
25.09.2011, 05:35 4
Цитата Сообщение от свр Посмотреть сообщение
И еще, как в своей программе сделать то же самое? То есть, добавить в своей программе файлы на копирование или вырезание, чтобы системный проводник это понял?
Помещать в клипбоард правильные параметры Если читаете ангельский - то на МСДН, если нет, то ждите, пока кто-нить соизволит почитать и Вам тут написать. Сам я сейчас не могу - уезжаю... Если до вечера никто не поможет - вечерком гляну.
0
свр
0 / 0 / 1
Регистрация: 25.10.2010
Сообщений: 24
27.09.2011, 20:27  [ТС] 5
Что по поводу последнего вопроса?
И еще вопрос - как сэмулировать перетаскивание элементов из приложения в проводник? Обратно-то я умею, а туда - нет
0
AndyZorg
Заблокирован
27.09.2011, 20:33 6
Если есть возможность выложить Ваш код - выложите. Или сделайте приложение, которое только занимается перетаскиванием Попробую Вам помочь.
0
свр
0 / 0 / 1
Регистрация: 25.10.2010
Сообщений: 24
28.09.2011, 20:08  [ТС] 7
Завтра вечером выложу. Или, может, еще сам поищу

Добавлено через 21 час 39 минут
Вот так я получаю файлы из буфера и при перетаскивании
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
procedure TForm2.dropFiles(var Message: TWMDropFiles; delete: boolean);
var
   buffer: array [0..MAX_PATH] of Char;
   i, numFiles: Integer;
   path: String;
   ClipFormat,hn,dt: Cardinal;
   szBuffer: array[0..511] of Char;
   FormatID: string;
   pMem: Pointer;
begin
   Clipboard.Open;
  try
    path:=path1;
       numFiles := DragQueryFile(Message.Drop, $FFFFFFFF, nil, 0);
      for i := 0 to numfiles - 1 do begin
         buffer[0] := #0;
         DragQueryFile(Message.Drop, i, buffer, SizeOf(buffer));
         if not PasteFile(buffer, path) then begin
           MessageDlg('Ошибка', MtError, [mbOk], 0);
         end;
         //Удаление
         if delete then begin
            deleteFileOrFolder(buffer);
         end;
      end;
  finally
     Clipboard.Close;
  end;
end;
 
procedure TForm2.GetFilesFromClpbrd();
var
   f: THandle;
   buffer: array [0..MAX_PATH] of Char;
   i, numFiles: Integer;
   path: String;
   delete: boolean;
   ClipFormat,hn,dt: Cardinal;
   szBuffer: array[0..511] of Char;
   FormatID: string;
   pMem: Pointer;
begin
  if not Clipboard.HasFormat(CF_HDROP) then begin
    Exit;
  end;
   Clipboard.Open;
   try
     ClipFormat := EnumClipboardFormats(0);
     while (ClipFormat <> 0) do begin
       GetClipboardFormatName(ClipFormat, szBuffer, SizeOf(szBuffer));
       FormatID := string(szBuffer);
       if SameText(FormatID,'Preferred DropEffect') then begin
         hn := GetClipboardData(ClipFormat);
         pMem := GlobalLock(hn);
         Move(pMem^,dt,4);
         if dt and 1 <>0 then begin //Копирование
            delete:=false;
         end else if dt and 2<>0 then begin
           delete:=true;
         end else begin
            MessageDlg('Неизвестная операция', MtError, [mbOk], 0);
            Edit1.Text:=intToStr(dt);
            Exit();
         end;
         GlobalUnlock(hn);
         Break;
       end;
       ClipFormat := EnumClipboardFormats(ClipFormat);
     end;
  finally
   end;
 
  if not Clipboard.HasFormat(CF_HDROP) then begin
    MessageDlg('Неизвестная операция', MtError, [mbOk], 0);
    Exit();
  end;
  try
    path:=path1;
     f := Clipboard.GetAsHandle(CF_HDROP);
    if f <> 0 then begin
       numFiles := DragQueryFile(f, $FFFFFFFF, nil, 0);
      for i := 0 to numfiles - 1 do begin
         buffer[0] := #0;
         DragQueryFile(f, i, buffer, SizeOf(buffer));
         if not PasteFile(buffer, path) then begin
           MessageDlg('Ошибка', MtError, [mbOk], 0);
         end;
         //Удаление
         if delete then begin
          deleteFileOrFolder(buffer);
         end;
      end;
    end;
  finally
     Clipboard.Close;
  end;
end;
 Комментарий модератора 
Используйте специальные теги форматирования кода!
0
свр
0 / 0 / 1
Регистрация: 25.10.2010
Сообщений: 24
08.10.2011, 23:51  [ТС] 8
Кажется, нашел ответ на свой вопрос
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function CopyFilesToClipboard(FileList: String; isMoveFiles: Boolean): boolean;
var
  DropFiles: PDropFiles;
  hGlobal: THandle;
  iLen: Integer;
  f: Cardinal;
  d: PCardinal;
begin
  Result := False;
   FileList := FileList + #0#0;
  try
    Clipboard.Clear;
    Clipboard.Open;
 
    iLen := 2*Length(FileList) * SizeOf(char);
    hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen);
    Win32Check(hGlobal <> 0);
    DropFiles := GlobalLock(hGlobal);
    DropFiles^.pFiles := SizeOf(TDropFiles);
 
 
    DropFiles^.fWide := true;
 
    Move(FileList[1], (PansiChar(DropFiles) + SizeOf(TDropFiles))^, iLen);
    SetClipboardData(CF_HDROP, hGlobal);
    GlobalUnlock(hGlobal);
 
    if isMoveFiles then begin
      f := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
      hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, sizeof(dword));
      d := PCardinal(GlobalLock(hGlobal));
      d^ := 2;
      SetClipboardData(f, hGlobal);
      GlobalUnlock(hGlobal);
     end;
     Result := true;
  finally
    Clipboard.Close;
 end;
end;
Не знаете еще, как перетаскивать файлы из listView-а в проводник?
0
08.10.2011, 23:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2011, 23:51

Перемещение файлов в архив
Подскажите пожалуйста, возможно ли переместить командой MoveFile переместить(а...

Перемещение файлов | Delphi
Есть программа Которая при открытии переносится на другую папку и запускается...

Перемещение файлов, создание каталога
здравствуй, подскажите почему не могу создать папку for i:=0 to colcentr-1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru