hi,
Tom hat geschrieben:
Eigentlich musst Du m.E. nur im posBlock-Navigationsblock das gefundene Arrayelement (Ordinalposition) setzen, mehr nicht.
mache ich doch
Code: Alles auswählen
aArray[ ARR_NO ] := nItem
EVAL(::browser:posBlock,::browser)
::Browser:refreshAll()
aber ein
EVAL() muss man schon machen damit der Codeblock auch ausgeführt wird.
Ich habe nun auch die "Länge" mit hinein genommen damit ich es für das inkrementelle "SEEK"
nutzen kann.
Code: Alles auswählen
METHOD XCMBrowse:DoSeek(cSeek)
LOCAL aArray := ::Browser:cargo
LOCAL nPosi := 0
LOCAL nItem := 1
LOCAL nLen := LEN(cSeek)
nPosi := AScan( aArray[ ARR_SRC ] ,;
{|x| SUBSTR(UPPER(x[F_NAME]),1,nLen) == SUBSTR(UPPER(cSeek),1,nLen)} )
IF nPosi > 0
nItem := AScan( aArray[ ARR_SORT ] , {|x| x == nPosi } )
IF nItem > 0
aArray[ ARR_NO ] := nItem
EVAL(::browser:posBlock,::browser)
::Browser:refreshAll()
ELSE
ENDIF
ELSE
ENDIF
RETURN nItem
damit hab ich nun folgende :Keyboard Methode
Code: Alles auswählen
METHOD XCMBrowse:Browkey(nKey,oXbp)
...
STATIC lInput := .F.
DO CASE
// search starten
CASE nKey >= xbeK_ALT_A .AND. nKey <= xbeK_ALT_Z
IF lInput
ELSE
lInput := .T.
IF nKey > 327648 // xbeK_ALT_A - A
::cSeekTXT := CHR( nKey - 327648)
ELSE
::cSeekTXT := CHR( nKey )
ENDIF
// Anzeige auf Statusbar
SBarMsg(::Browser,::cSeekTXT)
::Browser:dehilite()
::Browser:DoSeek(::cSeekTXT)
ENDIF
// weiter mit inkrementaler Suche
CASE lInput .AND. ( KEY2SEEK( nKey ) .OR. nKey == xbeK_SPACE )
::cSeekTXT += CHR( nKey )
IF LEN( ::cSeekTXT ) == 1
IF nKey > 90 .AND. nKey < 123
::cSeekTXT := UPPER( ::cSeekTXT )
ENDIF
ENDIF
// Anzeige auf Statusbar
SBarMsg(::Browser,::cSeekTXT)
::Browser:dehilite()
::Browser:DoSeek(::cSeekTXT)
// Abbruch Suche
CASE lInput .AND. nKey == xbeK_ESC
lInput := .F.
::cSeekTXT := ""
// Anzeige auf Statusbar
SBarMsg(::Browser,::cSeekTXT)
// Ende Suche
CASE nKey == xbeK_ENTER
IF lInput
lInput := .F.
::cSeekTXT := ""
// Anzeige auf Statusbar
SBarMsg(::Browser,::cSeekTXT)
ELSE
ChangeDirectory( oXbp )
// wichtig Tastatur und Events löschen sonst "doppelt"
CLEAR TYPEAHEAD
ENDIF
// wichtig hier mit NIL raus
RETURN NIL
CASE nKey == xbeK_ALT_1 ; SortFiles( oXbp, F_NAME )
die Funktion KEY2SEEK() hab ich nun für deutsch ausgelegt sodas man die für andere Sprachen
anpassen kann ( Chinesisch ? )
Code: Alles auswählen
FUNCTION KEY2SEEK( nKey )
LOCAL cChar, aCZ := { "a", "b", "c", "d", "e", "f", "g", "h", ;
"i", "j", "k", "l", "m", "n", "o", "p", ;
"q", "r", "s", "t", "u", "v", "w", "x", ;
"y", "z", "ä", "ö", "ü", "ß" }
IF VALTYPE( nKey ) == "N"
cChar := CHR( nKey )
ELSEIF VALTYPE( nKey ) == "C"
cChar := nKey
nKey := ASC( nKey )
ENDIF
RETURN ( nKey > 32 .AND. nKey < 127 ) .OR. ASCAN( aCZ, cChar ) > 0
so langsam wird das nun was mit dem
Xbase++
Control
Manager
- XCM1.JPG (132.18 KiB) 4863 mal betrachtet
wenn es jemanden interessiert der kann eine Demo mit *.DLL bekommen ...
eine LIB mit Source ist in Planung.