ListView - zrušení označení   zodpovězená otázka

VB6/VBA

Dobrý den.

Pomozte, prosím! Zkusil jsem už všechno možné, ale jsem bezradný. Objekt ListView má velice nepříjemnou (pro mě nepochopitelnou) vlastnost, kdy při označení několika položek se nezruší označení položky, na kterou bylo naposledy kliknuto. Pro Vaši lepší představu jsem jednoduchou aplikaci vytvořil a umístil sem:

http://erasser.own.cz/listview.exe

(má jenom 20 kB)

Slibuji, že to není zavirované :). Po spuštění je automaticky označená první položka a pokud se pokusíte označit např. poslední tři řádky, první položka zůstane označená pořád. Toto jsem vyřešil ještě snadno:

ListView1.SelectedItem = Nothing

Jenže stejný problém nastává, jak jsem již zmínil, i po označení jednotlivé položky a následném označení několika (jiných) položek. Pak je moje metoda k ničemu, protože nemůžu přece rušit označení položky po kliknutí na ní. Tak jsem zkusil následující:

ListView1.SelectedItem.Selected = False
'nebo..
ListView1.ListItems.Item(1).Selected = False

Jak možná tušíte, tyto dvě akce neprovedli vůbec nic (viditelného). Objekt ListView má všechny vlastnosti původní, změnil jsem akorát MultiSelect = True. Ve všech typech zobrazení (Ikony, Seznam...) se to chová stejně.

Mám neblahé tušení, že na to budu muset jít přes subclassing, obdobně jako když jsem bojoval s uzamčením šířky sloupce. Takhle to ale sám dohromady nedám.. Za Vaše rady a náměty děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusil jste:

ListView1.SelectedIndices.Clear()

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ano, toto jsem se někde dočetl.. Ale VB mi ".SelectedIndices" vůbec nenabízí a když mu to vnutím - Syntax error. Takhle by to možná šlo ve VB.NET, ale VB6 niet... :/

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co vám vadí na tomto standardním chování komponenty ListView? Funguje to tak u všech seznamů, např. ListBox nebo TreeView. Nevím čeho konkrétně chcete dosáhnout, ale pokud nějak změníte toto chování, tak akorát nabouráte způsob vybírání položek, na který jsou všichni zvyklí. Poslední položka zůstává označena právě proto, aby bylo vidět že byla označena jako poslední a tudíž je vidět, kterou další položku vyberete stiskem šipky nahoru nebo dolu.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Ano, já s Vámi samozřejmě souhlasím, že po kliknutí na položku by ta položka měla zůstat označená. Ale pokud je takto označená např. druhá položka, tak po označení osmé, deváté a desáté by se označení té druhé přece mělo zrušit. Stejně jako pokud něco označíte ve Wordu, tak se Vám případné původní označení zruší (a tak je to ok). Ale objekt ListView další položky přioznačí, úplně stejně jako bych držel Ctrl (ale nedržím:). Kdyžtak si to vyzkoušejte na mé aplikaci, ať to sám vidíte.. :)

V praxi tedy (např. v tom mém prográmku) pokud budu chtít označit poslední tři položky, tak nejdřív musím kliknout na jednu z nich a pak je teprve můžu označit a to je dost uživatelsky nepříjemné. Běžné aplikace ve Windows se takto určitě nechovají.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím co máte na mysli. Váš ukázkový program se chová tak jak by měl - při klepnutí do seznamu se vybere patřičná položka, při podržení Ctrl se k výběru přidávají další položky. Je-li vybráno více položek, klepnutím na libovolnou se výběr všech ostatních položek zruší.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Vytvořil jsem jednoduchou ilustrativní animaci, tak snad z toho bude jasné, o co mi jde.

http://erasser.own.cz/listview.gif

Upozorňuji, že v té animaci NEDRŽÍM Ctrl pro přioznačování a to je právě ten problém, protože, jak si jistě všimnete, položka zůstává součástí označeného bloku (s čímž se osobně setkávám poprvé).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já chápu, že kliknutá položka musí nějakým způsobem zůstat aktivní, aby bylo uživateli zřejmé, odkud se vlastně bude stisknutím šipek pohybovat.. Ale kdyby se takto choval třeba Průzkumník ve Windows, tak by byl přece naprosto nepoužitelný :). Konkréně Průzkumník to řeší tak, že označení položky zruší, ale nechá si ji jen tak na oko ohraničenou (přičemž ale ta položka není součástí selekce a o to právě jde).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nevím, jak jste v kompilované ukázce to chování dokázal, mně se ListView chová jako Průzkumník jen s malým rozdílem: původně vybraná položka je po klepnutí mimo tečkovaně orámovaná, ale ne vybraná, po dokončení výběru i orámování zmizí.

Kam jste dal zrušení výběru? Asi do Looad. A co do MouseDown?

Private Sub ListView1_MouseDown(Button As Integer, _
     Shift As Integer, x As Single, y As Single)
  ListView1.SelectedItem = Nothing
End Sub

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je onoooooooo..!! :D

Už to fakčí tak jak máááá :D:D

Díííkyyyyyyy! :))

Akorát mi nejde do hlavy, jak se tatáž (tak jednoduchá) aplikace může na dvou PC chovat úplně jinak (možná rozdílné nastavení systému?).. Každopádně Váš fígl můj problém vyřešil! :) Ještě jednou díky! :-*

PS: Zkusil jsem to, co jste mi popsal Vy. Označit položku, kliknout vedle a hle! Položka by se měla odznačit a nechat kolem sebe ten tečkovaný rámeček (což dělá Vám), ale u mně se nestane vůbec nic a pro odznačení musím použít dvojklik! No každopádně váš kód řeší i toto ;). THX!

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback