Delphi - Drag and Drop MS Office alkalmazásokból

forráskód letöltése
Ebben a példában annak lehetőségét vizsgáljuk, hogy miként ruházhatjuk fel alkalmazásunkat olyan tulajdonságokkal, mely lehetővé teszi azt, hogy például egy MS Word alkalmazásból egy kijelölt szöveget Drag and Drop módszerrel átmásoljuk programunkba.

Természetesen nemcsak MS Word alkalmazás lehet a forrás, hanem bármi olyan, ami képes arra, hogy Drag and Drop-al szöveget másolhassunk belőle (pl.: MS Internet Explorer). A megoldás megvalósításához az IDropTarget nevű interfészt kell implementálnunk az alkalmazásunkba. Ehhez létrehozunk egy TDropTarget nevű objektumot.

A programunk indulásakor az OnCreate eseménynél inicializálnunk kell az OLE Library-t az OleInitialize függvény hívásával. Szükséges ez ahhoz, hogy regisztrálni tudjuk programunk ablakát, hogy az képes Drag and Drop-ot fogadni más alkalmazásból.

A regisztráláshoz a RegisterDragDrop függvényt használhatjuk. Itt meg kell adnunk alkalmazásunk ablakának azonosítóját (Handle), valamint létre kell hoznunk, és át kell adnunk azt az objektumot, mely implementálja az IDropTarget interfészt.

A programunk futásának végén, az OnDestory eseménynél a RevokeDragDrop-al megszüntetjük a RegisterDragDrop általi regisztrációt. Majd az OleUninitialize hívásával lezárjuk az OLE Library-t.

Nézzük, hogy is hozható létre a TDropTarget objektum.

Olyan constructor-t hoztunk létre, melynek segítségével az objektum létrehozásakor átadhatjuk azt a Form-ot, melyen a Drag and Drop-ot használni szeretnénk. Ezt itt csak eltároljuk egy FForm nevű változóba, későbbi felhasználás végett.

Az implementált IDropTarget interfész négy metódust tartalmaz. A DragOver akkor kerül meghívásra, mikor egy Drag and Drop művelettel az adott Form felett jár a felhasználó az egérrel. Ekkor a pt paraméterből megtudhatjuk az egér koordinátáját, képernyő koordinátában.

A DragEnter eljárás akkor kerül meghívásra, mikor a Drag and Drop művelettel az egér belép a From területére, míg a DragLeave, akkor mikor az egér elhagyja azt.

A Drag and Drop művelet befejezéseként kerül meghívásra a Drop függvény. Ez is csak akkor, ha a felhasználó az adott Form felett engedte el az egér gombját.

Ekkor a kapott szöveg meghatározása az alábbiak szerint történhet:
Az EnumFormatEtc függvény hívással egy IEnumFormatEtc típusú változóba lekérdezzük a kapott adatokat.
Utána egy ciklussal megkeressük ezek között a szöveg típusú adatot és tároljuk egy TFormatEtc típusban.
Ezt, a GetData hívásával a TFormatEtc formátumból TStgMedium típusú változóba kérdezzük le az adatokat.
Végül a GlobalLock-al meg tudjuk határozni annak a sztringnek a címét, mely a kérdéses szöveget tárolja.
Ezt már csak ki kell írnunk, mondjuk egy TLabel-ra, melyet arra a pozícióra igazítunk, ahol a felhasználó elengedte az egeret.
Kiírás után még fel kell szabadítanunk a lefoglalt objektumokat.