Steuerung des arraypointers in dcbrowse

Moderator: Moderatoren

Antworten
Peter Schweizer
UDF-Programmierer
UDF-Programmierer
Beiträge: 81
Registriert: Do, 06. Apr 2006 10:51

Steuerung des arraypointers in dcbrowse

Beitrag von Peter Schweizer » So, 28. Jan 2018 20:31

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

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7333
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: Steuerung des arraypointers in dcbrowse

Beitrag von Tom » So, 28. Jan 2018 22:00

Da gibt es Beispiele für. Setz mal oBrowse:ArrayElement auf den Indexwert des gefundenen Eintrags.
Herzlich,
Tom

Peter Schweizer
UDF-Programmierer
UDF-Programmierer
Beiträge: 81
Registriert: Do, 06. Apr 2006 10:51

Re: Steuerung des arraypointers in dcbrowse

Beitrag von Peter Schweizer » Mo, 29. Jan 2018 13:11

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

Antworten