XbpBrowse Suchfunktion

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

XbpBrowse Suchfunktion

Beitrag von Benz »

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?!
georg
Der Entwickler von "Deep Thought"
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

Beitrag von georg »

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:

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
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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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: XbpBrowse Suchfunktion

Beitrag von Rolf Ramacher »

oder meinst du so etwas

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.)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: XbpBrowse Suchfunktion

Beitrag von Rudolf »

Hallo,
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
Benz
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 440
Registriert: Mo, 30. Mai 2011 15:06
Danksagung erhalten: 1 Mal

Re: XbpBrowse Suchfunktion

Beitrag von Benz »

@ 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 :D

@Rudolf: gibt es das auch ohne eXpress++ ? Ich besitz eXpress++ nämlich nicht. :D bzw. welche Komponenten sind denn dabei von eXpress++ ?
Würde es auch ohne eXpress++ funktionieren?
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: XbpBrowse Suchfunktion

Beitrag von Rudolf »

Hallo,
eigentlich ist nur der Aufruf über KEYBLOCK von eXpress++, sollte sich also leicht anpassen lassen
Grüße
Rudolf
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

Benz hat geschrieben:Hi, hat schonmal jemand eine Suchfunktion für Browse gemacht?
das "schönste" Demo dazu finde ich ist J.A. Diego Kerejeta Antwort mit dem Attachment "Highlight.zip" siehe Thread
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
Antworten