Aktualisierungsproblem von TListBox



  • Hallo zusammen,

    ich hoffe, ihr könnt mir helfen. Ich habe ein Verständnis- oder Funktionsproblem der TListBox oder auch des ähnlichen 3rd-Party-Items TsListBox im Borland-Builder 6.

    Wenn ich eine Komponente TListBox einbinde kann ich die Items über die vertikalen Pfeile (hoch/runter) auswählen. Diese ändern sich auch, aber die Komponente erhält den Focus dann nicht. Lasse ich mir den ItemIndex der Komponente ausgeben, erhalte ich den nicht-aktualisierten Wert. Erst, wenn ich in die Komponente hineinklicke, also manuell den Focus setze, funktioniert es. Sehr unschön, da das Verhalten absolut unerwartet ist.

    Bei der 3rd-party-Komponente gibt es eine Funktion OnVScroll, die auch aufgerufen wird, wenn man eben jene Pfeile anklickt, allerdings funktioniert hier auch ein SetFocus() nicht. Bei der Standardkomponente gibt es die Methode nicht - hier weiß ich gar nicht, welche On...-Methode beim Auswählen der Pfeiltasten angesteuert wird.

    Ist dieses Problem bekannt? Wer kann mir helfen?

    Vielen Dank,

    Oliver



  • Ein bewegen der Scrollbar wählt bei keinem Windows-Control irgendetwas aus.
    Wenn Du dieses Windows.Standardverhalten ändern möchtest, dann musst Du das selber implementieren.

    Ich wäre aber vorsichtig etwas zu implementieren das so in keinem anderen Windows-Programm funktioniert.



  • Hallo MichelRT,

    zunächst danke für deine Antwort.
    Vielleicht habe ich mich nicht gut ausgedrückt - oder ich verstehe dich nicht.
    Wenn ich 3 Items in einer ListBox habe und die Feldgröße so definiert habe, dass ich immer nur eine davon sehe (rein platztechnisch) kann ich sehr wohl durch Navigation mittels der Scrollbar (eigentlich ist es keine Scrollbar, oder? Es ist ja ein Teil der ListBox...) die Items anzeigen lassen. Das funktioniert ja auch.
    Nur "weiss" die Listbox nicht, welches Item gerade angezeigt wird.

    Technisch gesprochen müsste ich also sagen können, dass ich den ItemIndex um 1 erhöhe, wenn ich die "Pfeil-Runter-Taste der ListBox anklicke, bzw. den ItemIndex um eins senke, wenn ich das Gegenteil tue.

    Ich weiss jedoch nicht, wie ich das machen soll, da es kein Event gibt, welches auf das Nutzen der Pfeile reagiert.

    Ich habe als "Workaround" eine TComboBox genommen. Hier funktioniert es deshalb, weil ich immer manuell ein Element per Mouseklick auswählen muss. Das verhält sich daher erwartungsgemäß und der ItemIndex stimmt auch nach der Auswahl.

    Man kann das Problem also aus "gelöst" ansehen, wobei ich immer noch interessiert wäre, wie es mittels der TListBox funktionieren würde.

    Trotzdem danke,

    Oliver



  • Vielleicht hast du dich nicht gut ausgedrückt - oder ich verstehe dich nicht, aber ich glaube, du wirfst da grade zwei Sachen in einen Topf.
    Die Sichtbarkeit eines TListBox-Eintrags und die Auswahl sind zwei verschiedene Dinge, darum verstehe ich nicht so ganz, warum du einen Eintrag auswählen willst, wenn sich der sichtbare Ausschnitt verschiebt. Nehmen wir mal den Fall, dass du drei Einträge in einer TListBox hast, die TListBox aber so klein ist, dass nur ein Eintrag angezeigt werden kann. Anfangs ist Eintrag #1 sichtbar, der Benutzer klickt drauf und wählt ihn damit aus. Jetzt benutzt er den Scrollbar und scrollt nach unten, sodass der zweite Eintrag sichtbar und der erste nach oben rausgescrollt ist. Der erste Eintrag ist immer noch ausgewählt, wo kommt da der ItemIndex in´s Spiel?



  • Tatsächlich bin ich nicht von der Möglichkeit ausgegangen, dass man einen MultiSelect nutzen kann.

    Ich hielt es für einleuchtend, jetzt kann ich zumindest für beide Funktionsweisen für und wider finden. Danke für die Erklärung.

    Oliver.



  • Jetzt bin ich mir ganz sicher: Du hast dich nicht gut ausgedrückt.
    Ich habe immer noch keine Ahnung, was genau du eigentlich machen willst.



  • OliverK schrieb:

    ...Nur "weiss" die Listbox nicht, welches Item gerade angezeigt wird...
    Oliver

    Mit der Funktion ListBox->ItemAtPos kann man den Wert abfragen.
    Um das beim Klick auf die ScrollBar zu erreichen, ist das Abfangen der Message WM_VSCROLL der Komponente erforderlich.
    Die Position innerhalb ItemAtPos ist 0, 0 (oben links).


Anmelden zum Antworten