Steuerung des arraypointers in dcbrowse

Moderator: Moderatoren

Antworten
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Steuerung des arraypointers in dcbrowse

Beitrag 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
Gruss Peter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Steuerung des arraypointers in dcbrowse

Beitrag von Tom »

Da gibt es Beispiele für. Setz mal oBrowse:ArrayElement auf den Indexwert des gefundenen Eintrags.
Herzlich,
Tom
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Re: Steuerung des arraypointers in dcbrowse

Beitrag 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
Gruss Peter
Antworten