Ahhoz hogy a külső drag&drop kapcsolatot létre tudjuk hozni, módosítanunk kell alkalmazásunk Form-jának a deklarációját.
TForm1 = class(TForm, IDropTarget )
Ezután a drag&drop megvalósításához implementálnunk kell az alábbi metódusokat.
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: HResul; stdcall;
function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint; var dwEffect: Longint): HResult; stdcall;
A fenti metódusok implementálásával vezérelhetjük a drag@drop funkciót. Ahhoz hogy alkalmazásunk kívülről adatokat tudjon fogadni, meg kell tennünk még egy lépést. Regisztrálnunk kell alkalmazásunk drag&drop funkcióját a rendszerben.
OleInitialize(Nil);
OleCheck(RegisterDragDrop(Handle,Self));
Ezt a regisztrációt, alkalmazásunk bezárásakor meg is kell szüntetnünk.
RevokeDragDrop(Handle);
OleUninitialize;
A Drop metódus kerül végrehajtásra, amikor egy megadott szövegrészt átemelünk alkalmazásunkba.
A metódus dataObj tagja tartalmazza az áthelyezendő adatokat. Meg kell győződnünk arról, hogy létezik-e egyáltalán adat.
if (dataObj=Nil) then
Exit;
Ahhoz hogy a dataObj tartalmából ki tudjuk olvasni a szöveget, két típusra van szükségünk: TFORMATETC és TSTGMEDIUM.
A TFORMATETC struktúrában beállítjuk a lekérdezendő adat típusát, amelyet a GetData függvény segítségével elhelyezünk egy TSTGMEDIUM struktúrában.
with f do begin
cfFormat:=CF_TEXT;
ptd:=Nil;
dwAspect:=DVASPECT_CONTENT;
lindex:=-1;
tymed:=TYMED_HGLOBAL;
end;
OleCheck(dataObj.GetData(f,s));
Egy Pointer segítségével azonosítjuk a memóriában az adatterületet, majd kiolvassuk onnan a szöveget.
Data:=GlobalLock(s.hGlobal);
Memo1.Text:=Data;
Végül felszabadítjuk a Pointert.
GlobalUnlock(s.hGlobal);
ReleaseStgMedium(s);