Seite 1 von 1

Steuerung des arraypointers in dcbrowse

Verfasst: So, 28. Jan 2018 20:31
von Peter Schweizer
Hallo Gemeinde,

ich versuche gerade über ein dcbrowse und einen dcread handler eine schnellsuche innerhalb eines Arrays zu realisieren.
Der Browser hat Focus. Betätige ich nun eine Taste, so soll der Handler das Array durchsuchen und wenn gefunden den Cursor auf den
entsprechenden Eintrag setzen.
Der Handler wird aufgerufen und er findet auch das gesuchte Arrayelement, jedoch gelingt es mir nicht den Browse-Cursor auf die entsprechende zeile zu setzen.

Code: Alles auswählen

...
	*aData[1] enthält das Browse Objekt
	aData[2] := 1   // enthält Pointer des dcbrowse
	aData[3] := ''   // Suchstr
	aData[4] := aDrWahl     // Array das durchsucht wird		
	* -------------------------------------------------------------------------
	@ 01,01 DCBROWSE aData[1];   // = Object
			DATA aData[4] ;		//aDrWahl ;
			SIZE 47.3,nBrowLen;
			TABSTOP;
			POINTER aData[2];	//  nPointer;
			DATALINK {|| setAppFocus(oStart), PostAppEvent(xbeK_ENTER) }

			DCBROWSECOL ELEMENT 1 HEADER 'Auswahl' PARENT aData[1] WIDTH 28
......
	DCREAD GUI TITLE cKopf;
		PARENT @oDlg;
 		APPWINDOW oRoot;
		OPTIONS GetOptions;
		FIT	;
 	 	CLEAREVENTS ;
		HANDLER BrowSuch_Handler REFERENCE aData ;
		SETFOCUS @aData[1]
.....
STATIC FUNCTION BrowSuch_Handler ( nEvent, mp1, mp2, oXbp, oDialog, GetList, aData )
	LOCAL oBrowse := aData[1]
	LOCAL lRet := FALSE
	LOCAL cKey
	LOCAL nAryPos
	*-------------------------------------
	IF nEvent = xbeP_Keyboard .AND.  oXbp:isDerivedFrom('XbpBrowse') .AND.  (oBrowse == SetAppFocus() ) 
	*--------------------------------
		cKey := UPPER( chr(mp1)) // Suchzeichen in Gross wandeln
		aData[3] := cKey
		*--------------------------------
		nAryPos:= ASCAN(aData[4],{|a| LEFT( alltrim( a[1]),1)=cKey })
		IF nAryPos > 0
*			info('Key: '+cKey+' gefunden auf Pos'+ STR(nAryPos))
			aData[2] := nAryPos   // neue Browse-Cursor Position setzten
    		       oBrowse:refreshAll()
			oBrowse:ForceStable()
*			DC_GetRefresh(Getlist)
			SetAppFocus( aData[1]  )
		ENDIF
	ENDIF
RETURN DCGUI_NONE
Hat jemand eine Idee was ich falsch mache ?

Gruß Peter

Re: Steuerung des arraypointers in dcbrowse

Verfasst: So, 28. Jan 2018 22:00
von Tom
Da gibt es Beispiele für. Setz mal oBrowse:ArrayElement auf den Indexwert des gefundenen Eintrags.

Re: Steuerung des arraypointers in dcbrowse

Verfasst: Mo, 29. Jan 2018 13:11
von Peter Schweizer
Hallo Tom,
dank für Deinen Hinweis.
So funktioniert es prinzipiell, jedoch tritt ein unerwünschter Effekt auf.

Der einegebene Such-Key wird gefunden und anschließend scrollt der Browser so, daß das Suchergebniss als 1.te Position im Browser-Dialog sichtbar ist, alle davor befindlichen Einträge sind noch oben weggescrollt.

Besser wäre natürlich, sollte sich das Suchergebniss im angezeigten Browser-Dialog-Bereich befinden, wenn nur der Anzeige-Cursor sich verschieben würde.
Ich hab mal mit oBrowse:rowPos versucht, war aber nicht erfolgreich.

Dazu vielleicht noch eine Idee ?

Peter