Delphi - Állománynév írása TEdit-be Drag and Drop-al

forráskód letöltése
Adatbevitel során előfordulhat, hogy a felhasználótól egy alkönyvtárat, vagy esetleg egy állomány nevet kell bekérnünk teljes elérési útvonallal együtt. Ilyenkor, ha ezt kézzel kell begépelnie, akkor valószínűleg igen csak szid bennünket a nem túl felhasználó barát megoldástól.

Javul a helyzet, ha nyitunk egy kis ablakot, ahol böngészhet az alkönyvtárak és állományok között.

De még jobb lehet a helyzet, ha a Windows Intézőjéből egyszerűen csak megfogva az adott állományt vagy alkönyvtárat, Drag and Drop-al ráhúzhatja arra a beviteli mezőre (TEdit), ahová be kellene írnia a szükséges adatot, így például igen gyorsan végezhet az adatbevitellel, főleg ha egynél több mezőt is ki kell tölteni.

Mellékelt példában erre láthatunk megoldást. A megoldást a Windows WM_DROPFILES eseménye jelenti. Ez akkor jön létre, amikor a programunkra a felhasználó Drag and Drop-al akar valamit rádobni.

Ahhoz, hogy ilyen üzenetet kapjunk a Windows-tól, először is a program indulásakor közölnünk kell vele, hogy elfogadjuk az ilyen Drag and Drop-ot. Ezt a DragAcceptFiles függvényhívással tehetjük meg. Első paraméterként az ablak azonosítóját kell megadnunk, másodikként egy logikai értéket, hogy kérjük-e a WM_DROPFILES eseményt, vagy sem.

A WM_DROPFILES eseményt a WMDropFiles eljárást kezeli le.

Itt a DragQueryFile függvénnyel lekérdezzük a kapott állománynevet elérési útvonallal.

A DragQueryPoint függvényt használva egy TPoint típusú változóba lekérdezhetjük az egér aktuális koordinátáját. Erre azért van szükségünk, hogy el tudjuk dönteni, hogy melyik TEdit komponensbe is kell beírnunk a kapott állománynevet.

Ha meg van a koordináta, akkor ezt konvertálnunk kell a kliens koordináta rendszerből a képernyő koordinátára a ClientToScreen segítségével, mivel a FindDragTarget függvény ezzel a koordináta rendszerrel dolgozik. FindDragTarget-nek átadott egér pozíció alapján megkeresi, hogy melyik komponens is tartózkodik ezen a ponton. Ha nem talál ilyet, akkor nil-t ad vissza, különben pedig magát a komponenst, TControl típusban.

Ezt felhasználva az értékadás már egyszerű.