Akce přetažení je standardní akcí v počítačových rozhraních. V případě seznamových polí je pro přesun několika položek současně nutné stisknout klávesu „Alt“. Nebo spíše „byla“, protože počínaje verzí 4D v19 R7 to již není vůbec nutné!
MOŽNOSTI SEZNAMOVÝCH POLÍ Přetahování
Uživatelsky přívětivější rozhraní
Tato operace vyžadovala z technických a historických důvodů stisknutí klávesy „Alt“ na klávesnici, aby bylo možné přesunout několik prvků současně. Tato povinnost je nyní minulostí. Jedná se o uživatelsky přívětivé vylepšení, protože toto nové chování je velmi blízké chování, které používají systémy MacOS nebo Windows pro správu souborů a složek. Uživatelé nebudou zmateni a tato akce bude velmi přirozená!
Co kdyby…
Pokud jsou uživatelé stávajících aplikací zvyklí při přetahování stisknout klávesu alt, není se čeho obávat. Přetahování bude fungovat úplně stejně. Klávesa alt bude ignorována, pokud nenaprogramujete něco, co by ji bralo v úvahu pro nějaký jiný účel (například: pokud je klávesa alt stisknutá, kopíruje se místo pouhého přesunu).
První závěr
Nové chování je uživatelsky přívětivější, protože napodobuje operační systémy a většina aplikací funguje. Zde bychom mohli skončit, ale využijme této příležitosti a připomeňme si některé zásady fungování seznamových polí, jejich vlastnosti a události, které lze zpracovávat. Pokud vás to zajímá, pojďme dál!
Režimy výběru. Výběr více položek. a události
Tři možné režimy výběru
Seznamové boxy mají tři režimy výběru, které jsou určeny vlastností seznamu vlastností.
- Žádný
- Jeden
- Vícenásobný
Dva možné režimy výběru více položek.
Výběr několika prvků je možný pomocí klávesnice.
- Podržením klávesy Shift můžete vytvořit souvislý výběr (např.: Od „Chloe“ po „Mike“).
- Podržením klávesy Ctrl (v systému MacOS klávesyCmd ) můžete vytvořit nespojitý výběr(např.: „Albert“ a „John“ a „Mike“ a „Peter“).
Tři události
Při „přetahování“ lze spravovat tři události.
- on beginning drag over
- on drag over
- on drop
Důležitá poznámka: Tyto události se spustí pouze v případě, že nastavení akcí pro přetahování a upouštění je nastaveno na vlastní.
1 – První z nich (on beginning drag over) se spustí, když se začne přetahovat v seznamu „zdroj“. V tomto okamžiku je třeba připravit „další krok“, tj. podívat se, co je vybráno, a nějakým způsobem to uložit. Může to být například uvnitř schránky nebo ve formulářové proměnné. Všimněte si, že tato událost se spouští pouze jednou.
If (Form event code=On Begin Drag Over)
$drag:=New object
// (…) put what you need in Form.drag object
// put the object in a BLOB
VARIABLE TO BLOB($drag; $blob)
// and send the object to the PasteBoard with any signature (xxxx)
APPEND DATA TO PASTEBOARD("xxxx"; $blob)
End if
2 – Druhý (on drag over) se spustí při najetí na listbox, ale pouze pokud mu předcházelo přetažení na začátku nebo pokud lze na listbox pustit cokoli jiného.
Tuto událost není nutné brát v úvahu, ale je výhodná, protože umožňuje odmítnout případné „upuštění“, které by mohlo nastat později.
Jak to udělat? Stačí se podívat na obsah toho, co bude pravděpodobně upuštěno. Pokud vám nevadí, co může být upuštěno, vraťte 0 (nulu) v hodnotě $0. V opačném případě vraťte -1 (mínus jedna), pak bude upuštění odmítnuto (a nebude generována žádná událost „při upuštění“).
If (Form event code=On Drag Over)
If (Pasteboard data size("xxxx")<=0)
$0:=-1 //reject anything that does NOT contains what is expected
Else
$0:=0
End if
End if
3 – Konečně třetí (on the drop) je generována, jak napovídá její název, v okamžiku, kdy je skutečně provedeno „upuštění“ na „cílovém“ listboxu (který může být stejný jako zdrojový).
Od této chvíle můžete testovat, na které pozici byl drop proveden, a provádět potřebné operace v závislosti na obsahu, který má být dropnut. Nezapomeňte, že upuštění nemusí být nutně logickým důsledkem přetažení z jiného listboxu (nebo samotného listboxu). Může se jednat také o externí prvek, dokonce i mimo aplikaci, například soubor nebo složku z prostředí systému.
if(Form event code=On Drop)
// read pasteboard content
GET PASTEBOARD DATA("xxxx"; $blob)
BLOB TO VARIABLE($blob; $drag)
// do what you need to do with the object you got
(…)
end if
Závěr
Všechny tyto informace jsou obsaženy v ukázce HDI, kterou si můžete stáhnout a prohlédnout si její praktickou implementaci.
Šťastné kódování!