ListBox suchen per Tastatureingabe

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
__WEY
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 25
Registriert: Do, 11. Sep 2008 9:01

ListBox suchen per Tastatureingabe

Beitrag von __WEY »

Hallo Leute!

Wenn man bei einer Listbox mit der Tastatur nach entsprechenden Einträgen sucht, habe ich immer das Problem, dass er bei jedem eingegebenen Buchstaben wieder von neuem beginnt zu suchen und nicht die einzelnen Buchstaben aneinander reiht.

Beispiel: Meine Listbox hat 3 Einträge:

Anna
Hubert
Silke
Norbert

Wenn ich jetzt mit der Tastatur A eingebe, markiert dieser 'Anna', was gut ist. Gebe ich jetzt aber gleich darauf noch n ein, bleibt dieser nicht bei Anna, sondern jupt zu Norbert.

Kann man dies irgendwie umgehen, dass er nach der eingegebenen Zeichenkette sucht?

Grüsse aus der Schweiz

WEY
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: ListBox suchen per Tastatureingabe

Beitrag von AUGE_OHR »

__WEY hat geschrieben:Wenn man bei einer Listbox mit der Tastatur nach entsprechenden Einträgen sucht, habe ich immer das Problem, dass er bei jedem eingegebenen Buchstaben wieder von neuem beginnt zu suchen und nicht die einzelnen Buchstaben aneinander reiht.
das macht jede Listbox unter Windows so.
__WEY hat geschrieben:Kann man dies irgendwie umgehen, dass er nach der eingegebenen Zeichenkette sucht?
jedes Xbpart hat den Callback ":keyboard" mit dem du dir sowas selbst "bauen" kannst.
gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: ListBox suchen per Tastatureingabe

Beitrag von Martin Altmann »

Moin,
das musst Du in Deinem keyhandler bewerkstelligen!
Wann immer eine normale Taste gedrückt wird, musst Du den bisher gemerkten Ausdruck um das Zeichen ergänzen und suchen.
Ansonsten musst Du auch berücksichtigen, dass bei einer Bewegung mit dem Cursor hoch/runter bzw. anderen Tasen (wie Pos1/Ende, Bild hoch/runter) der Suchstring zurückgesetzt wird

Viele Grüße,
Martin

Jimmy war schneller...
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: ListBox suchen per Tastatureingabe

Beitrag von hschmidt »

Hallo WEY,

ich habe so etwas mal für die Combobox umgesetzt - ich denke, bei der Listbox muß das so ähnlich laufen:

Code: Alles auswählen

// abgeleitete ComboBoxklasse zur Realisierung einer speziellen
// Keyboard-Behandlung
//
CLASS xComboBox FROM xbpComboBox

    EXPORTED:

    VAR keyBuffer
    VAR aItems

    METHOD init
    METHOD keyboard
    METHOD killInputFocus
    METHOD addItem
    METHOD delItem
    METHOD insItem
    METHOD searchItem
    METHOD getTopItemContent

ENDCLASS

// Init-Methode
//
METHOD xComboBox:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)

    ::xbpComboBox:Init(oParent, oOwner, aPos, aSize, aPP, lVisible)


    ::keyBuffer := ""
    ::bufferlength := 5
    ::aItems := {}

RETURN self

// addItem überladen, um aItems mit zu pflegen
//
METHOD xComboBox:addItem (cItem)

    AADD(::aItems, cItem)

RETURN ::xbpComboBox:addItem(cItem)


// insItem überladen, um aItems mit zu pflegen
//
METHOD xComboBox:insItem (nPos, cItem)

    AINS(::aItems, nPos, cItem)

RETURN ::xbpComboBox:insItem(nPos,cItem)


// delItem überladen, um aItems mit zu pflegen
//
METHOD xComboBox:delItem (nPos)

    ADEL(::aItems, nPos)

RETURN ::xbpComboBox:delItem(nPos)


// gibt direkt den Inhalt des TopItems aus
//
METHOD xComboBox:getTopItemContent ()

    LOCAL nPos := ::getTopItem ()

RETURN ::getItem(nPos)



// sucht einen Suchbegriff im aItems-array
// und gibt die Position im Array zurück
// wird nichts gefunden, ist der Rückgabewert 0
//
METHOD xComboBox:searchItem (cSearch)

    LOCAL nLen := LEN(TRIM(::keyBuffer))

RETURN ASCAN(::aItems,{|a|LEFT(a,nLen) == cSearch})


// abgeleitete KeyBoard-Methode, damit in Comboboxen die Markierung
// der Eingabe folgt
//
METHOD xComboBox:keyBoard (nKey)

    LOCAL nPos  := 0
    LOCAL i     := 0
    LOCAL iMax  := ::numItems()
    LOCAL aPos  := {}

    // Buchstabentasten
    IF nKey  >= 32 .AND. nKey <= 255

        // Listbox aufklappen
        ::listboxfocus(.T.)

        // Taste an Puffer anhängen..
        ::keyBuffer += Chr(nKey)


        // ...und Puffer mit dem Inhalt der Listbox vergleichen
        nPos := ::searchItem (UPPER(::keyBuffer))

        // wenn Puffer und Listboxelement übereinstimmen,
        // das Element zum TopItem machen
        IF nPos > 0
            ::setTopItem(nPos)
            aPos := {nPos}
            // setData mit 2.Parameter .T. markiert den entsprechenden Eintrag der Listbox
            ::xbpListBox:setData(aPos,.T.)
        ELSE

            // keine Entsprechung gefunden: mit Key vergleichen
            ::keyBuffer := Chr(nKey)

            // ...und Puffer mit dem Inhalt der Listbox vergleichen
            nPos := ::searchItem (UPPER(::keyBuffer))

            IF nPos > 0
                ::setTopItem(nPos)
                aPos := {nPos}
                // setData mit 2.Parameter .T. markiert den entsprechenden Eintrag der Listbox
                ::xbpListBox:setData(aPos,.T.)
            ELSE
                // keine Entsprechung gefunden: Puffer leeren
                ::keyBuffer := ""
            ENDIF

        ENDIF

        RETURN self

    ENDIF

RETURN ::xbpComboBox:keyBoard(nKey)


// wenn die Combobox den Fokus verliert,
// wird der KeyBoard-Suchpuffer geleert
//
METHOD xComboBox:killInputFocus( )

    // Keyboardpuffer wieder leeren
    ::keyBuffer := ""

RETURN ::xbpComboBox:killInputFocus()

Ich hoffe, es hilft...

Hans
__WEY
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 25
Registriert: Do, 11. Sep 2008 9:01

Re: ListBox suchen per Tastatureingabe

Beitrag von __WEY »

HEY HAMMER! IHR SEID MIR ECHT WAHRE HELDEN!

Vielen Dank, es hat nun hingehauen, dank euren hilfreichen Tipps und Erklärungen!

Thanks!

WEY
Antworten