Seite 1 von 1

DCBROWSE und Schnellsuche [Gelöst]

Verfasst: So, 19. Feb 2017 18:00
von Peter Schweizer
Hallo Gemeinde,
in meinem alten Clipper-Prg hatte ich eine Funktion die in einem TBrowse ein Seek suche auslöste, sobald im Browser ein Taste gedrückt wurden.
Also z.B. Taste: B gedrückt und Seek 'B' ausgeführt.

Nun würde ich sowas auch in DCBROWSE einbauen, und habe im DCBROWSE einen Handler BrowSuch_Handler angegeben, aber die Handler Fkt wird nicht aufgerufen.
Gehe ich prinzipiell richtig vor oder habt ihr eine andere Idee umsowas zu machen ?

Gruß Peter

Code: Alles auswählen

  
 @ 0.5,02 DCBROWSE oBrowse;
		ALIAS cAlias;
		SIZE 83,19;
		FIT;
		PRESENTATION DC_BrowPres();
		CURSORMODE XBPBRW_CURSOR_ROW;
		HANDLER BrowSuch_Handler ;
		DATALINK {|| bearb_txt(oDlg), DC_GetRefresh(Getlist), SetAppFocus(oBrowse)}

Re: DCBROWSE und Schnellsuche

Verfasst: So, 19. Feb 2017 19:03
von Tom
Es gibt ein fertiges Dc_BrowseAutoSeek (oder ähnlich, schau mal in die Docs und Beispiele), davon abgesehen gehört der Handlerblock m.E. ins DCREAD (sonst ist er nur wirksam, wenndas Browse den Fokus hat).

Re: DCBROWSE und Schnellsuche

Verfasst: So, 19. Feb 2017 19:46
von Wolfgang Ciriack
Ich benutze das in einem eigenen Suchfeld z.B. so (je nach Sortierung des Browse ist der Index anders):

Code: Alles auswählen

local bSeekBlock:={|a| iif( thi->(indexord())=1, thi->(dc_dbseek(padleft(alltrim(a),7),.T.)), ;
                        iif( thi->(indexord())=2, thi->(dc_dbseek(val(padright(alltrim(a),7,"0")),.T.)), ;
                         iif( thi->(indexord())=3, thi->(dc_dbseek(padleft(alltrim(a),3),.T.)), ;
                          iif( thi->(indexord())=4, thi->(dc_dbseek(a,.T.)), ;
                           iif( thi->(indexord())=5, thi->(dc_dbseek(tstr2dtos(a),.T.)), ;
                            iif( thi->(indexord())=7 .or. thi->(indexord())=8, thi->(dc_dbseek(upper(a),.T.)), .T.)))))),.T.}

@...DCGET Suchstr ....... KEYBLOCK {|a,b,o|  dc_browseAutoSeek(a,o,oBrowse,,,,,,bSeekBlock,,.T.),NIL) } ;

Re: DCBROWSE und Schnellsuche

Verfasst: So, 19. Feb 2017 20:00
von Peter Schweizer
Hallo Tom,
ich wollte den Handler extra im DCBROWSE ansiedeln , da ich noch andere DCGETS im Dialog habe.

Warum dem Handler aber gar nicht erst aufgerufen wird ( altd() gleich am anfang der Handlerfkt) ist mir schleierhaft. Oder gibt es da im
Debug-Modus Einschränkungen ?

Gruß Peter

Meine Handlerfkt prinzipiell:

Code: Alles auswählen

STATIC FUNCTION BrowSuch_Handler ( nEvent, mp1, mp2, oXbp, oDialog, GetList, aApp )
	STATIC cSuch := ''
altd()
	IF nEvent = xbeP_Keyboard
		cChar := Chr(mp1)
         	SEEK cSuch+cChar
		IF Found()
			cSuch +=cChar
		ENDIF
		......           
	ENDIF
RETURN DCGUI_NONE


Re: DCBROWSE und Schnellsuche

Verfasst: So, 19. Feb 2017 21:37
von AUGE_OHR
Peter Schweizer hat geschrieben:

Code: Alles auswählen

STATIC FUNCTION BrowSuch_Handler ( nEvent, mp1, mp2, oXbp, oDialog, GetList, aApp )
	STATIC cSuch := ''
	IF nEvent = xbeP_Keyboard
ich bin kein Express++ Experte aber gewöhnlich hängt man sich in den o:Keyboard Slot d.h. nKey ist ein INKEY Wert und kein Event

Code: Alles auswählen

FUNCTION DC_BrowseAutoSeek( nKey, oGet, oBrowse, xData, nColumn, ;
                            bcPrefix, bFormat, nDelay, bSeek, nPointer, ;
                            lClearGet )

Re: DCBROWSE und Schnellsuche

Verfasst: Mo, 20. Feb 2017 9:49
von Peter Schweizer
Mir ist schon klar das ich über ein seperate GET und DC_BrowseAutoSeek() das machen könnte,
aber der Hintergrund ist der, das sobald der DCBROWSE den Focus hat, ich diese Schnellsuchfkt realisieren möchte (ohne das der Benutzer den Fokus in ein seperates GET setzen muß).

Sobald ich also ein Zeichen über die Tastatur eingebe soll die Suchfkt starten.
War die Suchaktion erfolgreich, will ich dieses Zeichen zusätzlich in einer STATIC Variablen cStatic speichern, so daß bei einem erneuten Tastendruck
im DCBROWSE die Suchfkt auf seek cStatic + <aktueller Tastendruck> abläuft.
Auf diese Art und Weise konnte ich mich, in meinem alten Clipper-Prg, sehr schnell zu einem gewünschen Datensatz bewegen.

Gruß Peter

Re: DCBROWSE und Schnellsuche

Verfasst: Mo, 20. Feb 2017 10:13
von Tom
Hallo, Peter.

In der Funktion vermisse ich oBrowse:RefreshAll() und ggf. oBrowse:ForceStable(), da sich ansonsten die Anzeige nicht aktualisiert - nur das Suchen allein bewirkt ja optisch nichts.

Ich verwende grundsätzlich Handlerblöcke im DCREAD und prüfe da bei ganz ähnlichen Funktionen, ob das Browse im Fokus ist. Wenn das dann der Fall ist, verfahre ich entsprechend. Einen Handler direkt am Browse habe ich noch nie verwendet. Müsste ich mal ausprobieren.

Re: DCBROWSE und Schnellsuche [Gelöst]

Verfasst: Mo, 20. Feb 2017 17:41
von Peter Schweizer
Hallo Tom,

habe wie vorgeschlagen den Handler in den DCREAD Befehl mit eingebaut, und tatsächlich es geht !

Vielen Dank.

Gruß Peter