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

Реализация Drag-and-Drop из внешнего приложения в ваше

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

Реализация Drag-and-Drop из внешнего приложения в ваше

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

{ 
  The following example demonstrates the Drag&Drop machanism from an external 
  application (Wordpad, Microsoft,..) to a TMemo in your own application. 

{ 
  Das folgende Beispiel demonstriert der Drag&Drop Maechanismus 
  aus externen Anwendungen (wie zum Beispiel WordPad oder Microsoft Word) 
  in ein TMemo des eigenen Delphi-Programms. 
 }

 unit TMemoDragDropFrm;

 { **************************************************************** 
  Source File Name :  TMemoDragDropFrm.pas 
  Typ              :  Hauptformular 
  Autor            :  Andreas Kosch 
  Compiler         :  Delphi 4.02 CSS 
  Betriebssystem   :  Windows 98 
  Beschreibung     :  Text via OLE Drag&Drop ьbernehmen aus einer 
                      anderen Anwendung (wie zum Beispiel WordPad) 
                      ьbernehmen. 
  16.01.2003: Test mit Delphi 7 und Microsoft Word XP unter Windowx XP 
 **************************************************************** }
  { Comments by Thomas Stutz }

 interface

 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, ComCtrls, ActiveX, ShlObj, ComObj, StdCtrls;

 type
   // TForm1's declaration indicates that it's a TForm and that 
  // it supports the IDropTarget interface: 

 { 

  IDropTarget 

  Any application wanting to accept drop operations must 
  implement the IDropTarget interface. 

  Methods of the IDropTarget interface: 

  DragEnter 
    Dragged item has just been moved into the application's window, 
    return the relevant icon. 

  DragOver 
    Dragged item is being moved over the application's window, 
    return the relevant icon. 

  DragLeave 
    Dragged item has just moved out of the application's window. 

  Drop 
    The dragged item has been dropped on this application. 

  }

   TForm1 = class(TForm, IDropTarget)
     Memo1: TMemo;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
   private
     { Private declarations }
     // IDropTarget 
    function DragEnter(const dataObj: IDataObject;
                        grfKeyState: Longint;
                        pt: TPoint;
                        var dwEffect: Longint): HResult; stdcall;
     function DragOver(grfKeyState: Longint;
                       pt: TPoint;
                       var dwEffect: Longint): HResult; stdcall;
     function DragLeave: HResult; stdcall;
     function Drop(const dataObj: IDataObject;
                   grfKeyState: Longint; pt: TPoint;
                   var dwEffect: Longint): HResult; stdcall;
    // IUnknown 
   // Ignore referance counting 
   function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;

   public
     { Public declarations }
   end;

 var
   Form1: TForm1;

 implementation

 {$R *.dfm}

 uses
   ShellAPI;


 // In the OnCreate event handler, two important methods are called. 
// First, OleInitalize is called. This initializes the OLE libraries and should always be 
// called before your application uses any OLE functions. 
// RegisterDragDrop registers the window as a valid drop target. 
// If this isn't called, the window will never receive any drop events. 


procedure TForm1.FormCreate(Sender: TObject);
 begin
   OleInitialize(nil);
   {Allow window to accept drop events}
   OleCheck(RegisterDragDrop(Handle, Self));
   { Execute Wordpad for testing }
   ShellExecute(Handle, 'open', 'wordpad', 'c:\Test.doc', nil, SW_SHOW);
 end;

 // OnDestroy does the exact opposite. It calls RevokeDropTarget to indicate that 
// drop events are no longer accepted. 
// It then calls OleUninitialize, since the application is finished using all OLE functions. 

procedure TForm1.FormDestroy(Sender: TObject);
 begin
   {Finished accepting drops}
   RevokeDragDrop(Handle);
   OleUninitialize;
 end;

 {-----------------------------------------------------------------}
 { IDropTarget-Implementierung                                     }
 {-----------------------------------------------------------------}
 function TForm1.DragEnter(const dataObj: IDataObject;
   grfKeyState: Longint;
   pt: TPoint;
   var dwEffect: Longint): HResult;
 begin
   dwEffect := DROPEFFECT_COPY;
   Result  := S_OK;
 end;

 function TForm1.DragOver(grfKeyState: Longint;
   pt: TPoint;
   var dwEffect: Longint): HResult;
 begin
   dwEffect := DROPEFFECT_COPY;
   Result := S_OK;
 end;

 function TForm1.DragLeave: HResult;
 begin
   Result := S_OK;
 end;

 function TForm1._AddRef: Integer;
 begin
    Result := 1;
 end;

 function TForm1._Release: Integer;
 begin
    Result := 1;
 end;

 function TForm1.Drop(const dataObj: IDataObject;
   grfKeyState: Longint;
   pt: TPoint;
   var dwEffect: Longint): HResult;
 var
   aFmtEtc: TFORMATETC;
   aStgMed: TSTGMEDIUM;
   pData: PChar;
 begin
   {Make certain the data rendering is available}
   if (dataObj = nil) then
     raise Exception.Create('IDataObject-Pointer is not valid!');
   with aFmtEtc do
   begin
     cfFormat := CF_TEXT;
     ptd := nil;
     dwAspect := DVASPECT_CONTENT;
     lindex := -1;
     tymed := TYMED_HGLOBAL;
   end;
   {Get the data}
   OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
   try
     {Lock the global memory handle to get a pointer to the data}
     pData := GlobalLock(aStgMed.hGlobal);
     { Replace Text }
     Memo1.Text := pData;
   finally
     {Finished with the pointer}
     GlobalUnlock(aStgMed.hGlobal);
     {Free the memory}
     ReleaseStgMedium(aStgMed);
   end;
   Result := S_OK;
 end;

 end.

Обзор Код на языке Delphi демонстрирует реализацию функциональности Drag-and-Drop из внешней приложения (например, WordPad, Microsoft Word) в контроле TMemo вашего собственного приложения.

Структура кода Код состоит из двух основных частей: объявления и реализации формы.

  1. Объявление формы (TForm1):
    • Форма объявляется как подкласс TForm и имплементирует интерфейс IDropTarget.
    • В приватной секции есть методы для обработки операций Drag-and-Drop (например, DragEnter, DragOver, Drop).
  2. Реализация:
    • Методы реализации формы.

Ключевые методы 1. FormCreate: Вызывается при создании формы, инициализирует библиотеки OLE и регистрирует окно как целевой для Drag-and-Drop. 2. FormDestroy: Вызывается при уничтожении формы, отменяет регистрацию целевого для Drag-and-Drop и дезинициализирует библиотеки OLE.

Имплементация IDropTarget Код имплементирует следующие методы: 1. DragEnter: Обрабатывает событие DragEnter, устанавливает эффект.drop в DROPEFFECT_ COPY и возвращает S_OK. 2. DragOver: Обрабатывает событие DragOver, устанавливает эффект.drop в DROPEFFECT_ COPY и возвращает S_OK. 3. DragLeave: Обрабатывает событие DragLeave и возвращает S_OK. 4. _AddRef и _Release: Реализует подсчет ссылок для интерфейса. 5. Drop: Обрабатывает событие Drop, извлекает данные (текст) и обновляет контрол TMemo текстом.

Извлечение данных В методе Drop код использует метод GetData для извлечения данных из IDataObject. Затем он блокирует глобальный handle памяти, чтобы получить указатель на данные, обновляет контрол TMemo текстом и finally освобождает память.

Замечания * Код использует библиотеки OLE (Object Linking and Embedding) для функциональности Drag-and-Drop. * Единица ShellAPI используется для запуска внешней приложения (WordPad) в методе FormCreate. * Функция RegisterDragDrop регистрирует окно как целевой для Drag-and-Drop, а функция RevokeDragDrop отменяет эту регистрацию. В целом, код предоставляет основную реализацию функциональности Drag-and-Drop из внешней приложения в контроле TMemo вашего собственного Delphi-приложения.

Реализация Drag-and-Drop из внешнего приложения в ваше собственное приложение с помощью IDropTarget интерфейса и реализации соответствующих методов.


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

Получайте свежие новости и обновления по 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:29:21/0.0038778781890869/0