
A mellékelt példaprogram megnyitása előtt a DropData.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens használatához a TargetApplication property-ben annak az alkalmazásnak kell megadni az ablak nevét, mellyel el szeretnénk hitetni, hogy drag and drop történt. Ez a név az alábbi lehet:
| Alkalmazás neve |
TargetApplication property értéke |
| excel |
XLMain |
| word |
OpusApp |
| access |
OMain |
| powerpoint95 |
PP7FrameClass |
| powerpoint97 |
PP97FrameClass |
| notepad |
NOTEPAD |
| paintbrush |
pbParent |
| wordpad |
WordPadClass |
A DropFileName property-ben annak az állománynak a nevét, elérési útját kell megadnunk, melyet az adott alkalmazásra „dobunk”.
A komponens megvalósítása
A megoldás abban rejlik, hogy a kiválasztott alkalmazásnak küldünk egy WM_DROPFILES üzenetet. Az üzenet paramétereként egy TDragInfoA struktúrát adunk át, melyben leírhatjuk a szükséges adatokat.
Első lépésként arra van szükség, hogy a megadott alkalmazás főablakának az azonosítóját lekérdezzük. Ehhez a FindWindow függvényt használjuk. Ha a cél alkalmazás nem fut, akkor nem járunk eredménnyel.
procedure TDropData.Execute;
begin
wnd:=FindWindow(PChar(FTargetApplication), nil);
if IsWindow(wnd) then begin
Ha a lekérdezés sikeres, akkor a MakeDrop függvényünk meghívásával elkészítjük a TDragInfoA struktúrát, melyet a WM_DROPFILES üzenettel elküldünk a kiszemelt programnak.
drop:=MakeDrop(FDropFileName);
if drop<>0 then begin
PostMessage(wnd, WM_DROPFILES, drop, 0);
end;
GlobalFree(drop);
end;
end;
A TDragInfoA struktúra feltöltéséhez a GlobalAlloc-al foglalunk memóriaterületet, majd a GlobalLock hívással zároljuk is ezt addig, amíg adatokkal töltjük fel.
function TDropData.MakeDrop(FileName: string): THandle;
begin
size:=SizeOf(TDragInfoA)+1;
inc(size, Length(FileName)+1);
result:=GlobalAlloc(GHND or GMEM_SHARE, size);
if result<>0 then begin
data:=GlobalLock(result);
if data<>nil then begin
try
A struktúra uSize mezőjében adjuk meg a struktúra méretét. Az lpFileList mezőbe kerül a kiválasztott állományt.
data.uSize:=SizeOf(TDragInfoA);
p:=PChar(@Data.grfKeyState)+4;
data.lpFileList:=p;
size:=Length(FileName);
Move(Pointer(FileName)^, p^, size);
...
end;