Drag And Drop - Jak to pracuje

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.

Zpět Další

Autor: The Bozena