FBROWSE "SEEK" / "GOTO" ?

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
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

FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

hi,

ich bastel am Beispiel FBROWSE und suche noch nach der Lösung für ein "SEEK" ?
hat das schon jemand ausgeknobelt ?

mit dem "GOTO" bin ich mir nicht sicher ob es "so richtig" ist ? ... es funktioniert aber :)

Code: Alles auswählen

::browser:posBlock      := {|obj| obj:cargo[ ARR_NO ]  }

METHOD XCMBrowse:CheckMark(aRowCol,oSelf)
LOCAL nRowPos  := aRowCol[1]
LOCAL nColPos  := aRowCol[2]
...
// click into Browse
::Browser:rowPos := nRowPos
cSeek := ::Browser:getData()[1]
IF ::DoSeek(cSeek)
    ::Browser:hilite()
...

METHOD XCMBrowse:DoSeek(cSeek)
// search for filename in Source Array
nPosi := AScan( aArray[ ARR_SRC ] ,;
                {|x| UPPER(cSeek) $ UPPER(x[F_NAME]) } )
IF nPosi > 0
   // search in "Index" for Item
   nItem := AScan( aArray[ ARR_SORT ] , {|x| x == nPosi } )
   IF nItem > 0
      // set "GOTO" Number 
      aArray[ ARR_NO ]  := nItem
      EVAL(::browser:posBlock,::browser)
      ::Browser:refreshAll()
   ENDIF
ENDIF
gruss by OHR
Jimmy
Sören
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 205
Registriert: Mo, 07. Aug 2006 10:18
Wohnort: Leipzig
Danksagung erhalten: 11 Mal

Re: FBROWSE "SEEK" / "GOTO" ?

Beitrag von Sören »

Hallo Jimmy,

ich glaube mich zu erinnern, dass ein:

Code: Alles auswählen

oBrowse:goToRecord( nItem )
das Gleiche bewirkt.

PosBlock-Evaluierung u. ::RefreshAll() sollten damit überflüssig sein.

Kann aber sein, dass meine Erinnerung mich trügt. Habe lange nichts mehr mit QuickBrowse gemacht.
Beste Grüße,
Sören
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

hi,
Sören hat geschrieben: ich glaube mich zu erinnern, dass ein:

Code: Alles auswählen

oBrowse:goToRecord( nItem )
das Gleiche bewirkt.
Die Methode :goToRecord() gibt es bei XbpQuickBrowse(), das FBrowse ist aber eine "normales"
XbpBrowse mit Array.
gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: FBROWSE "SEEK" / "GOTO" ?

Beitrag von Rolf Ramacher »

Hi Jimmy

ich habe so etwas beim normalen xbpbrowse - Vielleicht kannst du es gebrauchen.

Eingabe - SLE -Feld zum suchen:

Code: Alles auswählen

	oSleSuche := xbpSle():new(drawingArea,,{280, 320},{80,20},,.F.) 
	oSleSuche:keyboard := {|nKey,mp2,obj| browseSearch(obj, oBrowse, cArtnr)} 
	oSleSuche:create()
	oSleSuche:Show()
Die Suchfunction:

Code: Alles auswählen

FUNCTION browseSearch(oSle, oBrowse, cIndex) 
LOCAL cValue := oSle:editBuffer()

Set Softseek on
Dbseek(cValue, .T., cIndex) 
oBrowse:refreshAll() 
Set Softseek Off
RETURN(.T.)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

hi,
Rolf Ramacher hat geschrieben: ich habe so etwas beim normalen xbpbrowse - Vielleicht kannst du es gebrauchen.
Eingabe - SLE -Feld zum suchen:

Code: Alles auswählen

FUNCTION browseSearch(oSle, oBrowse, cIndex) 
LOCAL cValue := oSle:editBuffer()
Set Softseek on
Dbseek(cValue, .T., cIndex) 
oBrowse:refreshAll() 
Set Softseek Off
RETURN(.T.)
Das FBrowse Beispiel arbeitet mit Array. Dabei gibt es auch eine "Index" für die Sortierung.
Ein "SEEK" gibt es ja nun nicht für Array und ein "GOTO" müsste man simulieren indem man
die Position des Dateinamen im Directory() Array sucht, und dann die Position dann im "Index"
sucht um die Reihenfolge zu haben und die relative Position.
Das Beispiel oben zeigt was ich meine (und es funktioniert), aber ich frage mich ob man das
nicht "besser" machen könnte ?
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: FBROWSE "SEEK" / "GOTO" ?

Beitrag von Tom »

Eigentlich musst Du m.E. nur im posBlock-Navigationsblock das gefundene Arrayelement (Ordinalposition) setzen, mehr nicht.
Herzlich,
Tom
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

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
XCM1.JPG (132.18 KiB) 4864 mal betrachtet
wenn es jemanden interessiert der kann eine Demo mit *.DLL bekommen ...
eine LIB mit Source ist in Planung.
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von Martin Altmann »

Sieht schick aus :thumbright:

Viele Grüße,
Martin
: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.
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

hi
Martin Altmann hat geschrieben:Sieht schick aus :thumbright:
Das Menu ist Ownerdraw und der "orange" Leuchtbalken im XbpBrowse Header ist mit "visual
Style" von SL1 gemacht.

Der Snapshot zeigt nun noch keine XbpBrowse Owenerdraw Version, die ist leider "sehr" langsam.
... vielleicht wegen zu vielen Spielereien ... GraGradient für jede Columne / Cell ... Bitmap
gemischt mit Text (so wie bei einem Menu Item) ...

aber wie man sieht kann man "visual Style" auch "ohne" Ownerdraw benutzen was ich bisher
nicht so verstanden hatte ... ok eine Class braucht man wohl schon ?!
gruss by OHR
Jimmy
gf210957
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 101
Registriert: Mi, 21. Dez 2005 10:18

Re: FBROWSE "SEEK" / "GOTO" ?

Beitrag von gf210957 »

Hallo Jimmy,

das sieht wirklich schon sehr ansprechend aus.
Funktioniert das nur mit SL1 oder auch mit 331?

Gruß aus Albstadt

Günter Früholz
Gruß aus Albstadt

Günter Früholz
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: FBROWSE "SEEK" / "GOTO" ?

Beitrag von AUGE_OHR »

hi,
gf210957 hat geschrieben: Funktioniert das nur mit SL1 oder auch mit 331?
Ownerdraw wie das Menu kann ja auch schon v331, aber visual Style kommt erst mit der SL1.

Was ist visual Style ?

bislang kennen wir ja SetColorFG() /SetColorBG() bzw die Presentation Parameter. Nun bekommen
wir mit dem visual Style noch einen "Hintergrund". Wer schon mal ein Bitmap als "Hintergrund"
eingesetzt hat und "auf" dem Bitmap einen XbPart gelegt hat der kennt wohl die Probleme mit
Transparenz und :clipSiblings / :clipChildren.

Ich habe die Demo für beides ausgelegt damit ich vorführen kann welche Unterschiede es
zwischen der v331 und der SL1 gibt und was man machen muss(kann) damit unter SL1 die
Applikation wieder "so aussieht" wie unter v331 ohne das man UseVisualStyle := .F. setzten
muss.
gruss by OHR
Jimmy
Antworten