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

Как сделать Drag-n-Drop из чужого приложения?

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

Code:
{
The following example demonstrates the Drag&Drop machanism from an external
application (Wordpad, Microsoft,..) to a TMemo in your own application.
}
 
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 ubernehmen aus einer
                     anderen Anwendung (wie zum Beispiel WordPad)
                     ubernehmen.
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
   // 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
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.

Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php

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

Основная форма Основная форма TForm1 наследуется от TForm и implements интерфейс IDropTarget. Это необходимо для принятия операций drag and drop.

DragEnter, DragOver, DragLeave, Drop Эти методы должны быть реализованы при реализации интерфейса IDropTarget:

  • DragEnter: Вызывается, когда перетаскиваемый элемент enters окно приложения. Возвращает соответствующий иконку.
  • DragOver: Вызывается, когда перетаскиваемый элемент перемещается над окном приложения. Возвращает соответствующий иконку.
  • DragLeave: Вызывается, когда перетаскиваемый элемент только что покинул окно приложения.
  • Drop: Перетаскиваемый элемент был выпущен на этом приложении.

FormCreate, FormDestroy Эти события вызываются, когда форма создается и уничтожается:

  • FormCreate: Инициализирует библиотеки OLE и регистрирует форму как валидный целевой объект для операций drag and drop. Также запускает WordPad для тестирования.
  • FormDestroy: Отменяет DragDrop, чтобы указать, что операции drag and drop больше не принимаются, и OleUninitialize, чтобы завершить использование функций OLE.

Implementation IDropTarget Интерфейс IDropTarget реализуется путем предоставления реализации для вышеуказанных методов.

_AddRef, _Release Эти методы являются дубликатами, необходимыми для реализации интерфейса IUnknown, который является базовым интерфейсом для объектов COM. В этом случае они просто возвращают 1, указывая, что счетчик ссылок не изменился.

Drop Method Метод Drop вызывается, когда перетаскиваемый элемент выпущен на приложении. Он: 1. Проверяет, является ли указатель на IDataObject валидным. 2. Получает данные из IDataObject с помощью метода GetData. 3. Закрывает глобальный паметный handle для получения указателя на данные. 4. Заменяет текст в компоненте TMemo на dropped данные. 5. Открывает и освобождает глобальный паметный handle.

Как использовать Чтобы использовать этот код, создайте новый проект Delphi и добавьте вышеуказанные единицы в список используемых. Затем создайте форму и добавьте компонент TMemo к ней. Скомпилируйте и запустите приложение. Вы должны быть able drag and drop текста из внешней приложения (например, Microsoft WordPad) в свой компонент TMemo.

Как сделать Drag-n-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 10:44:18/0.012159824371338/0