DCBROWSE und Schnellsuche [Gelöst]

Moderator: Moderatoren

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

DCBROWSE und Schnellsuche [Gelöst]

Beitrag von Peter Schweizer » So, 19. Feb 2017 18:00

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)}
Zuletzt geändert von Peter Schweizer am Mo, 20. Feb 2017 17:43, insgesamt 1-mal geändert.

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

Re: DCBROWSE und Schnellsuche

Beitrag von Tom » So, 19. Feb 2017 19:03

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).
Herzlich,
Tom

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2424
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: DCBROWSE und Schnellsuche

Beitrag von Wolfgang Ciriack » So, 19. Feb 2017 19:46

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) } ;
Viele Grüße
Wolfgang

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

Re: DCBROWSE und Schnellsuche

Beitrag von Peter Schweizer » So, 19. Feb 2017 20:00

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


Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 11427
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: DCBROWSE und Schnellsuche

Beitrag von AUGE_OHR » So, 19. Feb 2017 21:37

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 )
gruss by OHR
Jimmy

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

Re: DCBROWSE und Schnellsuche

Beitrag von Peter Schweizer » Mo, 20. Feb 2017 9:49

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

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

Re: DCBROWSE und Schnellsuche

Beitrag von Tom » Mo, 20. Feb 2017 10:13

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.
Herzlich,
Tom

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

Re: DCBROWSE und Schnellsuche [Gelöst]

Beitrag von Peter Schweizer » Mo, 20. Feb 2017 17:41

Hallo Tom,

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

Vielen Dank.

Gruß Peter

Antworten