
A mellékelt példaprogram megnyitása előtt a DroppedURLs.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Amikor a felhasználó fájlokat dob Drag&Drop-pal a Form-ra, akkor a Form kap egy WM_DROPFILES üzenetet. Ezt az üzenetet csak akkor kapja meg, ha a DragAcceptFiles függvénnyel beállítjuk, hogy a Form képes fájlokat Drag&Drop-pal fogadni. A Form-hoz érkező üzenetek fogadásához szükség lesz egy TWndMethod típusú eljárásra is, amire átirányítjuk a Form eseménykezelő eljárását. Mindkét feladatot a komponens konstruktorában hajtjuk végre:
FOldWndProc: TWndMethod;
...
FOldWndProc:=(AOwner as TForm).WindowProc;
(Owner as TForm).WindowProc:=WndProc;
DragAcceptFiles((Owner as TForm).Handle, true);
Az eredeti eseménykezelő eljárást eltároljuk az FOldWndProc változóban, hiszen erre még szükségünk lesz. Az új eljárás a WndProc lesz, amiben csak a nekünk fontos üzeneteket dolgozzuk fel, a többit rábízzuk az eredeti eljárásra:
Ha a WM_DROPFILES üzenet érkezik, akkor meghívjuk a GetDroppedFiles eljárást. Ennek paramétere TWMDropFiles típusú, így az eredetileg TMessage típusú paramétert egy egyszerű konverzióval adjuk át:
GetDroppedFiles(TWMDropFiles(Message));
A GetDroppedFiles eljárás legelején ellenőrizzük a ClearPreviousList property értékét. Ha ez igaz, akkor az előző Drag&Drop eredménylistáját töröljük. Az eredménylistát, vagyis az .url fájlokban tárolt hivatkozásokat az URL nevű TStringList típusú property-ben tároljuk.
Ezután lekérdezzük a Form-ra dobott fájlok számát. Ezt a DragQueryFile függvénnyel tudjuk megtenni, de ezt fogjuk felhasználni az egyes fájlok nevének lekérdezéséhez is. A függvény részletes leírása a következő:

DragQueryFile
function DragQueryFile(
Drop: HDROP;
FileIndex: UINT;
FileName: PChar;
cb: UINT
): UINT;
A függvény az ablakra dobott fájlok számának és nevének lekérdezésére szolgál.
Paraméterek
Drop: HDROP
Ezt az azonosítót a TWMDropFiles típusú paraméterben kapjuk meg. Ennek Drop mezőjét kell itt megadni, ami azonosítja azt a struktúrát, amelyben az ablakra húzott fájlok nevei vannak tárolva.
FileIndex: UINT
Ha a $FFFFFFFF értéket adjuk meg, akkor a függvény visszatérési értéke a fájlok száma lesz. Ha 0-t, vagy 0-nál nagyobb értéket adunk meg, akkor a megadott sorszámú fájl nevét írja be a FileName paraméterben megadott bufferbe.
FileName: PChar
Annak a buffernek a pointere, amelybe a fájlnevet várjuk. Ha a fájlok számát kérdezzük le (lásd FileIndex paraméter), akkor megadhatunk nil-t is.
cb: UINT
A buffer maximális hossza.
Visszatérési érték
Ha a fájlok számát kérdeztük le, akkor a fájlok száma lesz a visszatérési értéke, ellenkező esetben a lekérdezett fájlnév hossza (nem számítja bele a lezáró #0 karaktert).
Ezzel a függvénnyel tehát a fájlok számát és nevét kérdezhetjük le. Nekünk azonban nem elég a fájl neve, mert mi a hivatkozást szeretnénk az URL property-be felvenni. Szerencsére erre is egyszerű megoldás kínálkozik, mivel az .url fájlok szerkezete az .ini fájlokéhoz hasonló, tehát a TIniFile osztályon keresztül kényelmesen olvasható és írható. Mielőtt megnyitnánk a fájlt, ellenőrizni kell a kiterjesztését is, hiszen nem biztos, hogy .url fájlokat húzott a felhasználó a Form-ra.
Az .url fájlokban az InternetShortcut szekcióban van egy URL nevű érték, ami a hivatkozást tartalmazza. Ezt a hivatkozást olvassuk ki a fájlból és hozzáadjuk az URL property tartalmához.
Ha az összes fájlt feldolgoztuk, akkor a DragFinish függvénnyel lezárjuk a műveletet. Ennek paraméterként a TWMDropFiles típusú paraméter Drop mezőjének értékét kell megadni.
Végül generálunk egy OnDroppedURLs eseményt.