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

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

Для тестирования вот такой код набросался (по найденным советам).
Код: 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
23.08.2016, 10:41
    #39296014
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Drag and drop (файлы из проводника на форму) не работает
Devillio,

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

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



См. здесь
...
Рейтинг: 0 / 0
23.08.2016, 10:51
    #39296037
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Drag and drop (файлы из проводника на форму) не работает
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
23.08.2016, 10:55
    #39296047
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Drag and drop (файлы из проводника на форму) не работает
Прикрепляю "проект" )
...
Рейтинг: 0 / 0
23.08.2016, 10:56
    #39296049
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Drag and drop (файлы из проводника на форму) не работает
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
23.08.2016, 11:11
    #39296070
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Drag and drop (файлы из проводника на форму) не работает
Если не заморачиваться, можно взять
The Drag and Drop Component Suite for Delphi

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

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

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

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

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

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

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

из user32.dll


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


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