Seite 1 von 1

Tastendrücke beim browse()

Verfasst: Mi, 12. Feb 2014 11:11
von saul
Hallo,

Code: Alles auswählen

FUNCTION DbfSkipper( nWantSkip ) 
replace Tastendruck with ?????
  LOCAL nDidSkip := 0 
  DO CASE 
    CASE LastRec() == 0              // Keine Datensätze, 
replace Tastendruck with ?????
    CASE nWantSkip == 0 
         GOTO RecNo()                  // Datenpuffer auffrischen 
    CASE nWantSkip > 0               // Nach unten skippen 
replace Tastendruck with ?????
        DO WHILE nWantSkip > nDidSkip .AND. .NOT. Eof() 
          SKIP 
          IF Eof()                   // Dateiende überschritten 
            SKIP -1 
            EXIT 
          ENDIF 
          nDidSkip ++ 
        ENDDO 
      CASE nWantSkip < 0               // Nach oben skippen 
        DO WHILE nWantSkip < nDidSkip .AND. .NOT. Bof() 
replace Tastendruck with ?????
           SKIP -1 
           IF Bof()                   // Dateianfang erreicht 
              EXIT 
           ENDIF 
           nDidSkip -- 
         ENDDO 
      ENDCASE 
RETURN nDidSkip                     // So viel wurde geskipt 
zur Fehlersuche möchte ich gern jeweils abspeichern welcher Tastendruck zu welchem Ergebnissen führt. Leider führen Funktionen wie lastkeys() hier in der Skipfunktion vom Browse() nicht weiter. Wer hätte dazu eine Idee?

mfg
Wolfgang

Re: Tastendrücke beim browse()

Verfasst: Mi, 12. Feb 2014 11:31
von Jan
Hallo,

versuch doch mal, das in die Eventschleife einzubauen. Mach da einfach eine If-Abfrage, ob der aktuelle XBPart :isDerivedFrom("XbpBrowse") ist. Und wenn ja, wertest Du die Events aus.

Jan

Re: Tastendrücke beim browse()

Verfasst: Mi, 12. Feb 2014 12:56
von saul
Hi,
in der Eventschleife ist kein Problem. Das wäre dann meine nächste Tat wenn hier keiner eine Idee hat.
Aber in der skip Funktion wäre es für die Fehlerauswertung einfacher.

mfg
Wolfgang

Re: Tastendrücke beim browse()

Verfasst: Mi, 12. Feb 2014 12:59
von Tom
Schau Dir mal LastAppEvent() an.

Re: Tastendrücke beim browse()

Verfasst: Mi, 12. Feb 2014 13:21
von georg
Hallo, Wolfgang -


ist es ein reines GUI oder ein Hybrid-Programm?

Bei einem reinen GUI-Programm liefert LastAppEvent() als Ergebnis nur xbeK_Keyboard zurück, Du musst also @mp1 angeben, in diesem Parameter wird dann die entsprechende Taste zurückgemeldet.

Die Platzierung der Abfrage würde ich zu Beginn der skipper-Funktion setzen, da die :isDerivedFrom() Abfrage den Eventloop schon leicht ausbremsen kann.

Re: Tastendrücke beim browse()

Verfasst: Do, 13. Feb 2014 1:07
von AUGE_OHR
hi,
saul hat geschrieben:zur Fehlersuche möchte ich gern jeweils abspeichern welcher Tastendruck zu welchem Ergebnissen führt. Leider führen Funktionen wie lastkeys() hier in der Skipfunktion vom Browse() nicht weiter. Wer hätte dazu eine Idee?
siehst du auch im Kühlschrank nach ob das Licht brennt ... :badgrin:
wenn der "Skipper" nicht die Ergebnisse produziert die du haben möchtest liegt es NICHT am "Skipper" sondern an deinen Bedingungen ( Filter ).

den DbfSkipper() den du hier zeigst ist ein normaler "Skipper" welcher maximal "n" Sätze ( Anzahl ROWs ) anzeigt. da es keine Bedingungen gibt

Code: Alles auswählen

 oBrowse:skipBlock     := {|n| DbSkipper(n) }
ist "n" == ROWs

wenn du nun mit dem "Skipper" eine DBF mit Bedingungen (Filter) in DBU öffnest wirst du sehen wie er dir ( langsam) einen Treffer nach dem anderen anzeigt bis alle ROWs gefüllt sind. das "langsam", obwohl nur 1 * SKIP, kommt durch die Bedingung, tatsächlich muss er evtl. paar tausend Datensätze durchgehen bis der Filter einen Treffer meldet.

wenn du dir meinen bedingten "Skipper", mit bWhileCond ansiehst

Code: Alles auswählen

oBrowse:skipBlock     := {|x| GoNext(x, {|| (bBlock) } )
muss er "echt" weiter skippen also X * SKIP.

Es ist aber eine WHILE Condition und keine FOR Condition denn wenn du dir den Code ansiehst

Code: Alles auswählen

   IF EOF()
      SKIP -1
      nSkipped--
   ELSEIF BOF()
      GOTO RECNO()
      nSkipped++
   ELSEIF !EVAL(bWhileCond)
      SKIP -nDirection
      nSkipped += -nDirection
   ENDIF
   RETURN nSkipped
müsstet du merken das es sich bei EOF(), BOF() und !EVAL(bBlock) um "End-Bedingungen" handelt.
Es gilt also für einen WHILE "Skipper" die selbe Bedingung wie für eine Relation um (schnelle) richtige Ergebnisse zu bekommen.

wenn du einen "Voll-Text-Such-Browser" haben willst würde ich , per OrdWildSeek(), die Daten in ein Array sammeln und anzeigen.