Drag And
Drop operace lze přirovnat
k operacím Vyříznout Vložit (nebo Kopírovat a Vložit - Cut, Copy,
Paste), kdy se místo klávesnice používá myš. V obou případech máme
zdroj (ze kterého kopírujeme nebo jej vyjímáme) a cíl (do kterého vkládáme).
Během těchto operací je kopie dat spravována v paměti.
Metody Cut
And Paste používají schránku (Clipboard),zatímco Drag And Drop používá
objekt DataObject - který je ve svém důsledku pouze privátní
schránkou.
Podívejme
se nyní na sekvenci událostí při typické operaci Drag And Drop:
-
Přetažení
je inicializováno voláním metody OLEDrag při události MouseMove
zdrojového prvku. Vyvolá se událost OLEStartDrag pro prvek a
vytvoří se instance objektu DataObject
-
Pro událost
OLEStartDrag musí být nastaveny argumenty AllowedEffects.
Tyto argumenty říkají cíli, zda jsou data kopírována nebo přesouvána.
Při té samé události musí být zavolána metoda SetData pro DataObject.
Ta uloží kopii dat do paměti.
-
Událost
OLEDragDrop je vyvolána na cílovém prvku, když uživatel
uvolní tlačítko myši nad cílovým prvkem. Vyvolá se metoda GetFormat
objektu DataObject pro ověření, zda formát dat je vhodný pro
cílový prvek, a pokud ano, tak metoda GetData cílového prvku
načte data. Aby bylo možné data do prvku vložit, musí být
vlastnost OLEDropMode cílového prvku nastavena na 1-Manual.
Pokud povolíte OLEDropMode a neotestujete si formát dat, můžete
se potka s moc ošklivými věcmi.
-
Jakmile
je Drop operace dokončena, je vyvolána událost OLECompleteDrag.
Pokud jsou data přesouvána, musí zde být kód pro smazání zdroje.
Existují
ještě tři další události, které mohou být využity, pokud potřebujete
fajnovější kontrolu nad Drag And Drop procesem:
-
Cílový
prvek vyvolá událost OLEDragOver kdykoliv se přetahovaná položka
ocitne nad ním. Tato událost může být použita například pro
zobrazení uživatelského kurzoru nebo pro modifikaci argumentů AllowedEffect.
-
Zdrojová
prvek vyvolá událost OLEGiveFeedback kdykoliv se přetahovaná
položka ocitne nad cílovým prvkem. I tato událost může být použita
například pro zobrazení uživatelského kurzoru nebo pro modifikaci
argumentů AllowedEffect.
-
V okamžiku,
kdy cílový prvek vyvolá událost OLEDragDrop vyvolá se událost
OLESetData zdrojového prvku. Pokud se přetahuje větší množství
dat, tak mohou být do objektu DataObject uložena pomocí této
události namísto události OLEStartDrag.
To je tak v
kostce vše. V nejjednodušších případech lze povolit přetažení pouze
třemi řádkami kódu a puštění pomocí jedné řádky.
|