Как мне заставить IDropTarget работать с моим Drop Handler в Delphi? - PullRequest
2 голосов
/ 01 сентября 2010

Я связал расширение файла с моей программой Delphi 2009.Я использовал метод вызова командной строки, чтобы передать имя файла в мою программу Delphi, чтобы его можно было открыть.

Однако я обнаружил, что при выборе нескольких файлов и одновременном нажатии на них все файлы открываются в отдельном экземпляре моей программы. Я спросил об этом , и, очевидно, решение состоит в том, чтобы использовать один из двух других методов Windows: DDE или IDropTarget .

Но DDE устарела и MSDNрекомендует метод IDropTarget.Также Ларс Труидженс в своем ответе мне говорит, что IDropTarget мог бы подойти лучше, если я уже использую возможности перетаскивания, которыми я являюсь.

В настоящее время это мой обработчик сброса:

private
  procedure WMDropFiles(var WinMsg: TMessage);
            message wm_DropFiles;

procedure TLogoAppForm.FormShow(Sender: TObject);
begin
  DragAcceptFiles(Handle, true);
end;

procedure TLogoAppForm.WMDropFiles(var WinMsg: TMessage);
// From Delphi 3 - User Interface Design, pg 170
const
  BufSize = 255;
var
  TempStr : array[0..BufSize] of Char;
  NumDroppedFiles, I: integer;
  Filenames: TStringList;
begin
  NumDroppedFiles := DragQueryFile(TWMDropFiles(WinMsg).Drop, $ffffffff, nil, 0);
  if NumDroppedFiles >= 1 then begin
    Filenames := TStringList.Create;
    for I := 0 to NumDroppedFiles - 1 do begin
      DragQueryFile(TWMDropFiles(WinMsg).Drop, I, TempStr, BufSize);
      Filenames.Add(TempStr);
    end;
    OpenFiles(Filenames, '');
    Filenames.Free;
  end;
  DragFinish(TWMDropFiles(WinMsg).Drop);
  WinMsg.Result := 0;
end;

Теперь он принимает один или несколько файлов и открывает их по мере необходимости.Это очень старый код из книги по Delphi 3, но он все еще работает.

Я не могу найти какую-либо документацию о том, как реализовать IDropHandler в Delphi, и, в частности, о том, как заставить его работать собработчик удаления (выше), который я использую.

Может кто-нибудь сказать мне, как использовать IDropHandler, чтобы щелчок по выбранным файлам с моим расширением файла передавал их моему обработчику удаления, и моя программа могла открывать все файлынажали?

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Эта страница содержит пример реализации IDropTarget в Delphi. Здесь - еще один из Jedi Code Formatter.Но эта библиотека может быть даже лучше.Помимо прочего, он позволяет перетаскивать данные из проводника Windows и поэтому уже поддерживает IDropTarget в классе TDropHandler.

1 голос
/ 01 сентября 2010

Используйте мастера Delphi для добавления стандартного объекта COM-сервера вне процесса в ваш проект, пусть он реализует интерфейс IDropHandler (код статьи написан на C ++, но многие концепции могут быть также применяется к коду Delphi, и некоторые из них уже реализованы VCL для вас), а затем переопределяют его виртуальный метод UpdateRegistry (), чтобы добавить пару дополнительных ключей реестра (см. нижнюю часть вышеупомянутой статьи), которые необходимы чтобы ваш объект IDropHandler работал с двойным щелчком и операцией всплывающего меню в проводнике Windows.

Затем измените код своего приложения, чтобы использовать RegisterDragDrop () вместо DragAcceptFiles (), чтобы пользователи могли по-прежнему перетаскивать файлы в окно вашего приложения через экземпляр вашего класса на основе IDropTarget.

Внутри ваших реализаций методов IDropHandler вы можете затем запросить переданный интерфейс IDataObject, чтобы выяснить, может ли он предоставить свои данные в формате HDROP, и если это так, то вы можете передать их существующему обработчику сообщений WM_DROPFILES (который является старая, а также устаревшая, кстати, так что вы должны рассмотреть ее удаление).

Звучит как большая работа, но как только ты действительно в нее попадаешь, это совсем немного. Недавно я реализовал поддержку IDropTarget в одном из моих приложений C ++ Builder VCL, и это не заняло много времени, чтобы все заработало.

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

...