powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Drag and drop (файлы из проводника на форму) не работает
12 сообщений из 12, страница 1 из 1
Drag and drop (файлы из проводника на форму) не работает
    #39295990
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Помогите разобраться, пожалуйста.
Мне нужно, чтобы список файлов из проводника можно было перетащить на форму.
Очень много информации на просторах, в принципе, везде одинаковой.

Для тестирования вот такой код набросался (по найденным советам).
Код: pascal
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.
uses ...ShellAPI;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  protected
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses DragDropFiles;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  DragAcceptFiles(Self.Handle, False);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
  I: Integer;
  Catcher: TFileCatcher;

  S: String;
begin
  inherited; //<- вот сюда не заходит (тут debug breakpoint)
  Catcher := TFileCatcher.Create(Msg.Drop);
  try
    for I := 0 to Pred(Catcher.FileCount) do
    begin
      S := S + Catcher.Files[i];
      Memo1.Lines.Add(Catcher.Files[i]);
    end;
  finally
    Catcher.Free;
  end;
  Msg.Result := 0;
  MessageDlg(S, mtInformation, [mbok], 0);
end;

end.



Почему в процедуру TForm1.WMDropFiles не заходит выполнение, когда отпускаю кнопку мыши с висящими на ней файлами?

И сопутствующий вопрос (но это неважно): почему когда тащу файлы из эксплорера на форму, курсор меняется на драг-дроп "стрелку с плюсом", а если тащу из total commander - нет? (такая же фигня и, например, в TheBAT у меня - из проводника файлы в письмо тащутся, а из TC - нет)
Спасибо!

PS Delphi XE2, windows 10.
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296014
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

DragAcceptFiles() вынеси в CreateWnd() метод.
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296021
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

Что это?
Код: pascal
1.
uses DragDropFiles;



См. здесь
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296037
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitri Krizhanovski,
в основном, оттуда и брал. В DragDropFiles вынес описание класса TFileCatcher.

Но это не имеет значения; т.к. такое впечатление, что не доходит/не обрабатывается/не знаю что происходит с самим сообщением.
Как проверить - не знаю.

DarkMaster
Попробовал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    procedure CreateWnd; override;
...
procedure TForm1.CreateWnd;
begin
  inherited;
  DragAcceptFiles(Self.Handle, True);
end;


то же самое - указатель мыши меняется на "стрелку с +", но в процедуру не заходит, когда отпускаю кнопку.
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296047
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикрепляю "проект" )
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296049
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

Стоп, а зачем там вообще inherited? Такое должно работать:

Код: pascal
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.
procedure TFileListBox.WMDropFiles(var Msg: TWMDropFiles);
var
  rc: UINT;
  i, iBuffSize: integer;
  lpszFile: PChar;
  FL: TStringList;
  DropPoint: TPoint;
begin
  FL:=TStringList.Create;
  try
    // Get count dropped files
    rc := DragQueryFile(Msg.Drop,$FFFFFFFF,nil,0);
    for i := 0 to rc-1 do
    begin
      // Get buffer size
      iBuffSize := DragQueryFile(Msg.Drop,i,nil,0) + 1;
      GetMem(lpszFile,iBuffSize*SizeOf(Char));
      try
        // Get file name
        DragQueryFile(Msg.Drop,i,lpszFile,iBuffSize);
        FL.Append(string(lpszFile));
      finally
        FreeMem(lpszFile,iBuffSize*SizeOf(Char));
      end;
    end;
    // Get drop point
    DragQueryPoint(Msg.Drop,DropPoint);
    if Assigned(FOnDropFiles) then FOnDropFiles(Self,FL,DropPoint);
  finally
    DragFinish(Msg.Drop);
    FL.Free;
  end;
  Msg.Result := 0;
end;
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296070
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Если не заморачиваться, можно взять
The Drag and Drop Component Suite for Delphi

и сразу всё получится
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296092
Dmitri Krizhanovski
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioПрикрепляю "проект" )
Работает.

p.s. Убрал CreateWnd и раскомментировал procedure TForm1.FormCreate(Sender: TObject);
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296111
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitri Krizhanovski, странно, а у меня нет ((

http://rccs-volgograd.ru/sp/nodrag.avi (220 kb)

defecator, этот компонент на моей XE2 не собирается )) исправить не смог.

Да и тут все равно бы понять что не так - вот у Дмитрия же работает тот же код..
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296117
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
[quot Devillio]
defecator, этот компонент на моей XE2 не собирается )) исправить не смог./quot]
не надо ничего править, вот тут:
https://github.com/DelphiPraxis/The-Drag-and-Drop-Component-Suite-for-Delphi

всегда актуальная версия
...
Рейтинг: 0 / 0
Drag and drop (файлы из проводника на форму) не работает
    #39296128
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема в том, что оказывается иногда требуется "открывать" для приложения WM_DROPFILES. UAC и прочая ))

Решение нашел:
ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ALLOW);
ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ALLOW);
ChangeWindowMessageFilter ($0049, MSGFLT_ALLOW);

из user32.dll


Благодарю всех откликнувшихся!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Drag and drop (файлы из проводника на форму) не работает
    #39598644
IntruderLab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Devillio, есть подобный вопрос, не можешь помочь советом?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Drag and drop (файлы из проводника на форму) не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]