Aktivní objekt   otázka

VB.NET

Dobrý den, prohledal jsem fórum a odpověď jsem nenašel tak se předem omlouvám pokud neumím hledat. Potřebuji zjistit, který objekt je aktivní. Zkoušel jsem listview.activation, ale s tím jsem nepochodil. Potřebuji posouvat vybranou položku pomocí kláves v listview, ale pokud je aktivní tak se posunutí provede o 2, protože má jakési "interní" posouvání, proto chci zjišťovat zda je aktivní nebo ne. Mám visual studio 2008. Předem díky za odpovědi.

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

Jestli jsem správně pochopil, že aktivním objektem je myšlena vybraná položka v ListView, tak se zjistí takto:

listview.Items(listview.SelectedItems(0).Index)

SelectedItems má index 0, protože je to kolekce všech vybraných položek (tedy první vybraná). Pro znemožnění výběru více položek najednou slouží vlastnost MultiSelect (hodnota false).

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

Zdravím,

nevím jestli jsem správně pochopil Váš dotaz ale

každý objekt je aktivní, pokud mu dáte fokus nebo stačí nad objektem přejet myší a použít událost MouseMove.

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

Aktivním objektem myslím to, že mám třeba na formuláři listview, textbox a combobox a já mám označený listview a pracuji s ním. Když s ním pracuji tak to funguje běžně, že můžu v listview pohybovat šipkami mezi položkami aniž bych odchytával stisknutí klávesy a programoval to. Jenže já to potřebuji i když není aktivní aby se dalo pohybovat mezi položkami šipkou. Problém je v tom, že když to provedu když je aktivní listview tak se provede to běžný posunutí a mnou naprogramovaný, takže se vybraná položka posune o 2. Jediné co mě napadlo po každém kliknutí v programu dávat listview.select() aby byl listview pořád aktivní a tím by odpadlo odchytávání kláves. Omlouvám se za kostrbaté vysvětlování.

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

Dovoluji si upozornit, že takovéto chování aplikace je v rozporu s konvencemi GUI na Windows - komponenta by si sama neměla "krást" focus a klávesové ovládání komponent by mělo pracovat pouze v případě, že je komponenta vybraná. Přestože je možné toto zaběhnuté chování, na které je každý zvyklý a které každý očekává, měnit, není to dobrý nápad a většina uživatelů bude nadávat.

Pokud už tohle opravdu chcete dělat, tak zachytávejte událost KeyDown na formuláři (musíte mu nastavit vlastnost KeyPReview na True, aby se před vyvoláním KeyDown v komponentě, která je vybraná, tato událost vyvolala nejprve ve formuláři) a tam na ni zareagujte. Děkejte to ale opravdu s rozumem, měnit standardní chování komponent se má dělat pouze v opravdu opodstatněných případech (ještě jsem se s takovým nesetkal).

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

Mám pocit že se pán neptal jak to udělat ale jak udělat aby se to neposouvalo nadvakrát.

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

Takto:

Public Class Form1

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.Up
                If ListBox1.Focused = False Then
                    If ListBox1.SelectedIndex = 0 Then
                        ListBox1.SelectedIndex = ListBox1.Items.Count
                    Else
                        ListBox1.SelectedIndex = ListBox1.SelectedIndex - 1
                    End If
                End If
            Case Keys.Down
                If ListBox1.Focused = False Then
                    If ListBox1.SelectedIndex = ListBox1.Items.Count Then
                        ListBox1.SelectedIndex = 0
                    Else
                        ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
                    End If
                End If
        End Select
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.KeyPreview = True
    End Sub
End Class

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