Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Переслать данные в другую программу методом Drag-and-Drop

Delphi , Синтаксис , Drag and Drop

Переслать данные в другую программу методом Drag-and-Drop

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

// Autor: Hagen Reddmann

         uses
   ShellAPI;

 function MakeDrop(const FileNames: array of string): THandle;
 // Creates a hDrop Object 
// erzeugt ein hDrop Object 
var
   I, Size: Integer;
   Data: PDragInfoA;
   P: PChar;
 begin
   // Calculate memory size needed 
  // berechne notwendig Speichergro?e 
  Size := SizeOf(TDragInfoA) + 1;
   for I := 0 to High(FileNames) do
     Inc(Size, Length(FileNames[I]) + 1);
   // allocate the memory 
  // alloziere den speicher 
  Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
   if Result <> 0 then
   begin
     Data := GlobalLock(Result);
     if Data <> nil then
       try
         // fill up with data 
        // fulle daten 
        Data.uSize := SizeOf(TDragInfoA);
         P  := PChar(@Data.grfKeyState) + 4;
         Data.lpFileList := P;
         // filenames at the at of the header (separated with #0) 
        // am ende des headers nun die filenamen getrennt mit #0 
        for I := 0 to High(FileNames) do
         begin
           Size := Length(FileNames[I]);
           Move(Pointer(FileNames[I])^, P^, Size);
           Inc(P, Size + 1);
         end;
       finally
         GlobalUnlock(Result);
       end
     else
     begin
       GlobalFree(Result);
       Result := 0;
     end;
   end;
 end;

 function MyEnum(Wnd: hWnd; Res: PInteger): Bool; stdcall;
 // search for a edit control with classname 'TEditControl' 
// suche ein child fenster mit klassennamen 'TEditControl' 
var
   N: string;
 begin
   SetLength(N, MAX_PATH);
   SetLength(N, GetClassName(Wnd, Pointer(N), Length(N)));
   Result := AnsiCompareText('TEditControl', N) <> 0;
   if not Result then Res^ := Wnd;
 end;

 // Example: Open msdos.sys in Delphi's Editor window 
// Beispiel: msdos.sys im Delphi Editor offnen 
procedure TForm1.Button1Click(Sender: TObject);
 var
   Wnd: HWnd;
   Drop: hDrop;
 begin
   // search for Delphi's Editor 
  // suche Delphis Editor Fenster 
  EnumChildWindows(FindWindow('TEditWindow', nil), @MyEnum, Integer(@Wnd));
   if IsWindow(Wnd) then
   begin
     // Delphi's Editor found. Open msdos.sys 
    // Delphis editor gefunden, also offne msdos.sys 
    Drop := MakeDrop(['c:\msdos.sys']);
     if Drop <> 0 then PostMessage(Wnd, wm_DropFiles, Drop, 0);
     // Free the memory? 
    // Speicher wieder freigeben? 
    GlobalFree(Drop);
   end;
 end;

Программный код на Delphi демонстрирует реализацию функциональности Drag-and-Drop в приложении Windows. Цель - передача данных из одного программного обеспечения в другое путем перетаскивания файлов или других типов данных.

Вот разбивка кода:

  1. Функция MakeDrop создает объект hDrop, который представляет собой данные для перетаскивания.
  2. Она рассчитывает размер памяти, необходимый для хранения имен файлов, и выделяет память с помощью GlobalAlloc.
  3. Функция заполняет выделенную память данными:
    • Она устанавливает поле uSize структуры TDragInfoA в размер всего блока памяти.
    • Она устанавливает поле lpFileList в указатель на имена файлов, хранящихся в блоке памяти, разделенных символами \0.
  4. Функция MyEnum используется для поиска редактора с классом 'TEditControl'. Это, вероятно, используется для поиска окна редактора Delphi.
  5. В обработчике события кнопки Button1Click, код ищет окно редактора Delphi с помощью EnumChildWindows и, если найдено, открывает файл msdos.sys.
  6. Функция MakeDrop создает объект данных для перетаскивания с именем файла 'c:\msdos.sys' и отправляет сообщение WM_DROPFILES в окно редактора Delphi.
  7. Наконец, код освобождает выделенную память с помощью GlobalFree.

Альтернативное решение - использовать компонент TDragDrop в Delphi, который предоставляет более простой способ реализации функциональности Drag-and-Drop без необходимости создания и управления объектом данных для перетаскивания.

Вот упрощенная версия кода с использованием TDragDrop:

procedure TForm1.Button1Click(Sender: TObject);
begin
  DragDrop.Create(Self, 'c:\msdos.sys');
end;

Код создает компонент TDragDrop и устанавливает его источник файла в 'c:\msdos.sys'. Когда кнопка нажата, компонент начнет операцию перетаскивания.

Пересылка данных из программы в другую программу методом Drag-and-Drop: пример кода на Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Drag and Drop ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-21 09:37:17/0.0036571025848389/0