XbpBrowse Suchfunktion
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
XbpBrowse Suchfunktion
Hi, hat schonmal jemand eine Suchfunktion für Browse gemacht?
Fürs erst würde mir etwas "einfaches" reichen. Hab mir das so vorgestellt:
Man sortiert nach einer Spalte (z.B. Name) (das habe ich schon programmiert. Über einen Button kann man das Aufrufen, das Fenster wird neugeladen, das Browse wird neu angezeigt mit einem anderen .NTX-Schlüssel.)
Jetzt habe ich eine Textbox darüber eingefügt und würde gerne sobald da eine Eingabe gemacht wird anfangen zu suchen und zwar nur in der Spalte nach der sortiert wurde.
Heißt es müssen ja Zeilen weggelassen werden, die durch das Suchraster fallen. Hat jemand eine Idee, wie das zu machen ist?
Das Browse wird ja aus Spalten aufgebaut und nicht aus Zeilen. Folglich muss ich in jeder Spalte ja das gleiche weglassen wie in der Suchspalte und nur immer den Datensatz anzeigen, der in der Suchspalte im Suchraster liegt.
Nur wie kann ich das bewerkstelligen?!
Fürs erst würde mir etwas "einfaches" reichen. Hab mir das so vorgestellt:
Man sortiert nach einer Spalte (z.B. Name) (das habe ich schon programmiert. Über einen Button kann man das Aufrufen, das Fenster wird neugeladen, das Browse wird neu angezeigt mit einem anderen .NTX-Schlüssel.)
Jetzt habe ich eine Textbox darüber eingefügt und würde gerne sobald da eine Eingabe gemacht wird anfangen zu suchen und zwar nur in der Spalte nach der sortiert wurde.
Heißt es müssen ja Zeilen weggelassen werden, die durch das Suchraster fallen. Hat jemand eine Idee, wie das zu machen ist?
Das Browse wird ja aus Spalten aufgebaut und nicht aus Zeilen. Folglich muss ich in jeder Spalte ja das gleiche weglassen wie in der Suchspalte und nur immer den Datensatz anzeigen, der in der Suchspalte im Suchraster liegt.
Nur wie kann ich das bewerkstelligen?!
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2824
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 95 Mal
- Danksagung erhalten: 13 Mal
Re: XbpBrowse Suchfunktion
Hallo, Wolfgang -
also, ein Browse besteht aus Zeilen (!), die mit Datensätzen korrespondieren, und das Browse-Objekt entscheidet darüber, welche Informationen in den Spalten angezeigt werden.
Grundsätzlich realisiere ich Browses in einem eigenen Thread, dadurch hat jeder Browse auch seinen eigenen Event-Loop. Mein Programm reagiert auf das Drücken der Enter-Taste, und das sieht im Loop dann etwa so aus:
Für mich entscheidend ist erst einmal das Event xbeP_Keyboard. Wenn dieses Event auftritt, steht in mp1, welche Taste gedrückt wurde. Wie bereits geschrieben, reagiere ich auf Enter, also wird gegen xbeK_ENTER geprüft. (Zum weiteren Code in diesem Fall: es gibt je Spalte ein Eingabefeld, so dass ich prüfe, ob das Event in einem dieser Felder erzeugt wurde. Die entsprechende Objekte stehen im Array aEntries.)
Die Funktion Browse-Filter übernimmt dann die weitere Arbeit, die erhält das Event, einen Verweis auf die geöffnete Tabelle (in diesem Fall eine MySQL-Server-Tabelle), das Browse-Objekt (für den Refresh), sowie die Liste der Eingabefelder, da mehrere Filter gesetzt werden können.
Wichtig: wenn Enter gedrückt würde, aber nicht in einem der Eingabefelder, wird im ELSE-Zweig das :handleEvent() ausgeführt, da hier irgendetwas anderes passieren soll (z.B. wenn in einer Browse-Zeile Enter gedrückt wird, um diese zur Bearbeitung zu öffnen).
Dann gibt es bei mir noch die Möglichkeit, über F5 den Browse zu aktualisieren (Netzwerkbetrieb, d.h. ein Dritter kann parallel Daten geändert haben. Das oHist:refresh() ist eine Funktion der MySQL-Klasse von Hector.
Wichtig ist immer, dass Du für den Fall, dass keine Deiner Routinen zuständig ist, immer einen ELSE oder OTHERWISE Zweig hast, der sich um das Tastatur-Event kümmert. Andernfalls zeigt Dein Browse manchmal ein sehr seltsames Verhalten.
also, ein Browse besteht aus Zeilen (!), die mit Datensätzen korrespondieren, und das Browse-Objekt entscheidet darüber, welche Informationen in den Spalten angezeigt werden.
Grundsätzlich realisiere ich Browses in einem eigenen Thread, dadurch hat jeder Browse auch seinen eigenen Event-Loop. Mein Programm reagiert auf das Drücken der Enter-Taste, und das sieht im Loop dann etwa so aus:
Code: Alles auswählen
nEvent := xbe_None
WHILE nEvent <> xbeP_Close
nEvent := AppEvent(@mp1, @mp2, @oXbp)
DO CASE
CASE nEvent = xbeP_Keyboard
DO CASE
CASE mp1 = xbeK_ENTER
IF AScan(aEntries, oXbp) > 0
BrowseFilter(xbeK_ENTER, oHist, oBro, aEntries)
//
ELSE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDIF
CASE mp1 = xbeK_F5
oHist:refresh()
oBro:refreshAll()
OTHERWISE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDCASE
OTHERWISE
oXbp:handleEvent(nEvent, mp1, mp2)
ENDCASE
END
Die Funktion Browse-Filter übernimmt dann die weitere Arbeit, die erhält das Event, einen Verweis auf die geöffnete Tabelle (in diesem Fall eine MySQL-Server-Tabelle), das Browse-Objekt (für den Refresh), sowie die Liste der Eingabefelder, da mehrere Filter gesetzt werden können.
Wichtig: wenn Enter gedrückt würde, aber nicht in einem der Eingabefelder, wird im ELSE-Zweig das :handleEvent() ausgeführt, da hier irgendetwas anderes passieren soll (z.B. wenn in einer Browse-Zeile Enter gedrückt wird, um diese zur Bearbeitung zu öffnen).
Dann gibt es bei mir noch die Möglichkeit, über F5 den Browse zu aktualisieren (Netzwerkbetrieb, d.h. ein Dritter kann parallel Daten geändert haben. Das oHist:refresh() ist eine Funktion der MySQL-Klasse von Hector.
Wichtig ist immer, dass Du für den Fall, dass keine Deiner Routinen zuständig ist, immer einen ELSE oder OTHERWISE Zweig hast, der sich um das Tastatur-Event kümmert. Andernfalls zeigt Dein Browse manchmal ein sehr seltsames Verhalten.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- Rolf Ramacher
- Der Entwickler von "Deep Thought"
- Beiträge: 1930
- Registriert: Do, 09. Nov 2006 10:33
- Wohnort: Bergheim
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: XbpBrowse Suchfunktion
oder meinst du so etwas
hier ein sle-feld in dem das Suchkriterium eingegeben wird.
hier die Func. Browse-search
hier ein sle-feld in dem das Suchkriterium eingegeben wird.
Code: Alles auswählen
oSleSuche := xbpSle():new(oDlg,,{280, 450},{140,20},,.F.)
oSleSuche:keyboard := {|nKey,mp2,obj| browseSearch(obj, oBrowse, cArtnr)}
oSleSuche:create()
oSleSuche:Show()
hier die Func. Browse-search
Code: Alles auswählen
FUNCTION browseSearch(oSle, oBrowse, cIndex)
LOCAL cValue := oSle:editBuffer()
DO CASE
CASE Type(IndexKey()) = "C"
* alles okay
CASE Type(IndexKey()) = "N"
cValue := Val(cValue)
CASE Type(IndexKey()) = "D"
cValue := CtoD(cValue)
* usw.
ENDCASE
Set Softseek on
Dbseek(cValue, .T., cIndex)
oBrowse:refreshAll()
Set Softseek Off
RETURN(.T.)
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: XbpBrowse Suchfunktion
Hallo,
das ist meine Funktion für inkrementelle Suche mit eXpress++
Grüße
Rudolf
das ist meine Funktion für inkrementelle Suche mit eXpress++
Grüße
Rudolf
Code: Alles auswählen
@ 30,1 DCSAY "Name" GET cF_Username PICTURE "@S15" SAYSIZE 0 PARENT aoTabStatic[nTab] KEYBLOCK {|a,b,o|user->(_xsearchitem(a,b,o,oBrowse1,@cF_Username,"NAME"))}
FUNCTION _xsearchitem( a, b, o, oBrowse,cSeek,xOrder,cType,cPrefix,nDelay,lDebug)
******************************************************************
LOCAL lSoftSeek := Set(_SET_SOFTSEEK,.t.),cBuffer := alltrim(o:EditBuffer())
local lWild := "*" $ cBuffer .or. "?" $ cBuffer
local snSeconds := Seconds(),nEvent,mp1,mp2,nKey := o:lastkey,nDelay := 0
local lClearBuffer := .t.
default cType to valtype(cSeek)
default cPrefix to ""
default lDebug to .f.
IF a = xbeK_UP
oBrowse:up()
ELSEIF a = xbeK_DOWN
oBrowse:down()
ELSEIF a = xbeK_PGUP
oBrowse:pageup()
ELSEIF a = xbeK_PGDN
oBrowse:pagedown()
ELSEIF a = xbeK_END
oBrowse:gobottom()
ELSEIF a = xbeK_HOME
oBrowse:gotop()
ELSE
IF nDelay > 0
DO WHILE Seconds() - snSeconds < nDelay .AND. nKey < 60000 .AND. nKey # xbeK_ENTER
nEvent := AppEvent(@mp1,@mp2,@oXbp,.1)
IF Valtype(oXbp) == 'O'
oXbp:handleEvent(nEvent,mp1,mp2)
ENDIF
ENDDO
ENDIF
setorder(xOrder)
dc_clrscope()
if cType = "C"
cBuffer := cPrefix + cBuffer
if "UPPER(" $ upper(indexkey())
cBuffer := upper(cBuffer)
endif
if lWild
ordwildSEEK(cBuffer)
else
SEEK(cBuffer)
endif
elseif cType = "N"
SEEK(val(cBuffer))
elseif cType = "D"
if !empty(ctod(cBuffer))
cBuffer := dtos(ctod(cBuffer))
SEEK(cBuffer)
else
return NIL
endif
else
SEEK(cBuffer)
endif
lClearBuffer := .f.
ENDIF
IF lClearBuffer
if cType = "N"
cSeek := 0
elseif cType = "C"
cSeek := Space(50)
elseif cType = "D"
cSeek := ctod("")
else
cSeek := space(20)
endif
o:Get:home()
o:setData()
ENDIF
oBrowse:refreshall()
Set(_SET_SOFTSEEK,lSoftSeek)
RETURN nil
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
-
- Rekursionen-Architekt
- Beiträge: 440
- Registriert: Mo, 30. Mai 2011 15:06
- Danksagung erhalten: 1 Mal
Re: XbpBrowse Suchfunktion
@ Rolf funktioniert super mit dem SLE, genau so habe ich mir das vorgestellt!
Wenn es jetzt nur nicht zwischen Groß- und Kleinschreibung unterscheiden würde
@Rudolf: gibt es das auch ohne eXpress++ ? Ich besitz eXpress++ nämlich nicht. bzw. welche Komponenten sind denn dabei von eXpress++ ?
Würde es auch ohne eXpress++ funktionieren?
Wenn es jetzt nur nicht zwischen Groß- und Kleinschreibung unterscheiden würde
@Rudolf: gibt es das auch ohne eXpress++ ? Ich besitz eXpress++ nämlich nicht. bzw. welche Komponenten sind denn dabei von eXpress++ ?
Würde es auch ohne eXpress++ funktionieren?
- Rudolf
- Programmier-Gott
- Beiträge: 1418
- Registriert: Mo, 02. Jan 2006 23:03
- Wohnort: Salzburg/Österreich
- Kontaktdaten:
Re: XbpBrowse Suchfunktion
Hallo,
eigentlich ist nur der Aufruf über KEYBLOCK von eXpress++, sollte sich also leicht anpassen lassen
Grüße
Rudolf
eigentlich ist nur der Aufruf über KEYBLOCK von eXpress++, sollte sich also leicht anpassen lassen
Grüße
Rudolf
Rudolf Reinthaler
http://www.formcommander.net
http://www.formcommander.net
- AUGE_OHR
- Marvin
- Beiträge: 12906
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 45 Mal
Re: XbpBrowse Suchfunktion
das "schönste" Demo dazu finde ich ist J.A. Diego Kerejeta Antwort mit dem Attachment "Highlight.zip" siehe ThreadBenz hat geschrieben:Hi, hat schonmal jemand eine Suchfunktion für Browse gemacht?
http://www.xbaseforum.de/viewtopic.php? ... hlight.zip
es war das "erste" Ownerdraw Browse (o:customDrawCell) Demo und "färbt" den gefundenen Teil im String "ein".
bin mir nicht mehr sicher ob das "original" mit DbSeek() oder OrdWildSeek() arbeitet womit man auch einen "Teil"
von einem String optisch hervorheben könnte.
gruss by OHR
Jimmy
Jimmy