Seite 2 von 2

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: Sa, 21. Sep 2013 21:53
von DelUser01
Hallo Auge_Ohr

gerade habe ich es zu x-ten Mal mit Deiner Lösung probiert.
1) In der ersten Zeile blau markierte Felder übrig. Je nach Fenstergröße mehr oder weniger viele (siehe Bild).
2) Der oberste Record bleibt für oBrowse immer noch der aktuelle. Dieser wird auch beim Schließen des Browsers zurückgegeben und nicht der Mittlere. Das würde auch erklären warum der Markierungs-Fehler unter 1) passiert - für den Browser ist immer noch der oberste der aktuelle Record.
Das kann man auch in Doku von Alaska nachlesen dass das mit RowPos so nicht funktioniert.

ABER das ist auch so nicht die 100%ige Lösung, da ich hier auch zuerst :show() verwenden muss sieht der Benutzer dass die Markierung von der ersten Zeile auf die Mittlere springt. Das will ich ja auch wegbringen.

Gruß
Roland

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: Sa, 21. Sep 2013 22:11
von DelUser01
Noch eine Anmerkung:

den Cursor unsichtbar machen mit :deHilite geht auch erst nach dem :show().
Also damit kann man auch nicht verhindern dass die erste Zeile nicht als markiert angezeigt wird ("unperfekt").

Gruß
Roland

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: Sa, 21. Sep 2013 22:47
von DelUser01
für das Unterdrücken der Markierung habe ich gerade die Lösung gefunden:
:CursorMode := XBPBRW_CURSOR_NONE
Das funktioniert auch "mitohne" :show()
und nach der endgültigen Positionierung:
:CursorMode := XBPBRW_CURSOR_ROW

Aber wenn ich eine Tabelle mit vielen Zeilen anzeige merkt man dass das Programm eine gute Zeit braucht bis mit der xbeK_DOWN Loop die gewünschte Zeile erreicht und markiert ist.

Gruß
Roland

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: Sa, 21. Sep 2013 23:40
von AUGE_OHR
Roland Gentner hat geschrieben:1) In der ersten Zeile blau markierte Felder übrig. Je nach Fenstergröße mehr oder weniger viele (siehe Bild).
hm ... ich "sehe" noch mehr !
in Zeile 1 ist ein XBPBRW_CURSOR_CELL aber in der Mitte hast du ein XBPBRW_CURSOR_ROW ... hm
Roland Gentner hat geschrieben:2) Der oberste Record bleibt für oBrowse immer noch der aktuelle. Dieser wird auch beim Schließen des Browsers zurückgegeben und nicht der Mittlere. Das würde auch erklären warum der Markierungs-Fehler unter 1) passiert - für den Browser ist immer noch der oberste der aktuelle Record.
Das kann man auch in Doku von Alaska nachlesen dass das mit RowPos so nicht funktioniert.
im Help File steht das du es "von Hand" synchronisieren musst.
Wenn du die RowPos eingestellt hast dann muss du "von Hand" ein o:refreshAll() ausführen
Roland Gentner hat geschrieben:ABER das ist auch so nicht die 100%ige Lösung, da ich hier auch zuerst :show() verwenden muss sieht der Benutzer dass die Markierung von der ersten Zeile auf die Mittlere springt. Das will ich ja auch wegbringen.
hm ... wie willst du ohne o:show() feststellen wie viele "sichtbare" Zeilen du hast ?

vielleicht könntest du "tricksen" und den User ablenken ...

Code: Alles auswählen

DLLFUNCTION AnimateWindow(hwnd,dwTime,dwFlags) USING STDCALL FROM USER32.DLL

   CenterControl(oDlg)
*  oDlg:Show()

   hHwnd := oDlg:GetHwnd()
   AnimateWindow(hHwnd,200,AW_ACTIVATE+AW_SLIDE+AW_CENTER)
statt das Dialog Fenster, in dem das XbpBrowse ist, mit o:Show() anzuzeigen wählst du eine Animation.
Das der Browser noch re-positioniert fällt dann weniger auf ... könnte ja zur Animation gehören ;)

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: So, 22. Sep 2013 0:19
von DelUser01
Hallo Jimmy
hm ... wie willst du ohne o:show() feststellen wie viele "sichtbare" Zeilen du hast ?
das geht, :configure() aufrufen wenn alles eingestellt ist. Dann stimmen die Werte. Deshalb wundert es mich ja warum dann nicht auch die Positionierung vor den :show() geht.
Animation...
Das würde sicher die ersten paar Mal ablenken. Aber im Geschäftsbetrieb hätte ich da schnell ärger :lol:

Ich könnte mir vorstellen, dass die Belastung des Netzwerks und des PCs mit dem dauernden xbeK_DOWN nicht unwesentlich ist. Da ja abgesehen von der Positionierung der Cursor-Markierung vermutlich auch jedes Mal die Daten von der Platte gelesen werden???

Gruß
roland

Re: XbpBrowse: Zeile direkt positionieren

Verfasst: Mo, 23. Sep 2013 7:26
von AUGE_OHR
Roland Gentner hat geschrieben:den Cursor unsichtbar machen mit :deHilite geht auch erst nach dem :show().
na ja ... wenn man das Browse noch nicht sieht nützt einem o:deHilite / o:Hilite nicht viel.
Roland Gentner hat geschrieben:

Code: Alles auswählen

o:CursorMode := XBPBRW_CURSOR_NONE
...
o:CursorMode := XBPBRW_CURSOR_ROW
auch wenn der Workaround optisch hilft ist dafür eigentlich nicht dafür gedacht.
Roland Gentner hat geschrieben:Aber wenn ich eine Tabelle mit vielen Zeilen anzeige merkt man dass das Programm eine gute Zeit braucht bis mit der xbeK_DOWN Loop die gewünschte Zeile erreicht und markiert ist.
über wie viele Felder reden wir ?

die Event Queue mit xbeK_DOWN voll zu stopfen könnte Probleme geben. Ich sprach ja davon auch "danach" den Cursor in der Mitte zu halten.
DBBROWSE1.ZIP
(14.14 KiB) 206-mal heruntergeladen
wenn man also lange die xbeK_DOWN festhält, dann geht nicht nur die CPU % hoch, sondern irgendwann "verschluckt" er sich.der Grund bei der Demo ergibt sich aus diesem Code

Code: Alles auswählen

FUNCTION GuiBrowseDB( oParent, aPos, aSize )
...
   oBrowse:keyBoard := {| nKeyCode, uNIL, oSelf | BrowKey(nKeyCode, oSelf) }
   oBrowse:rowPos := INT( oBrowse:rowCount / 2 )
RETURN oBrowse

FUNCTION BrowKey(nKey, oBrowse)
   DO CASE
      CASE nKey = xbeK_DOWN      ; AllColDown(oBrowse)
      CASE nKey = xbeK_UP        ; AllColUp(oBrowse)
      CASE nKey = xbeK_PGDN      ; AllColPgDown(oBrowse)
      CASE nKey = xbeK_PGUP      ; AllColPgUp(oBrowse)
      CASE nKey = xbeK_CTRL_DOWN ; AllColPgDown(oBrowse)
      CASE nKey = xbeK_CTRL_UP   ; AllColPgUp(oBrowse)
   ENDCASE
RETURN NIL
Ich reagiere also auf einen Tastendruck und führe dann eine Function aus ... das kostet Zeit !

Es geht ja um die Navigation also um den xbeBRW_Navigate Event ( s.h. x:\ALASKA\XPPW32\Include\xbp.ch )
die möglichen interessanten MP1 Werte wären hier

Code: Alles auswählen

#define XBPBRW_Navigate_NextLine           1
#define XBPBRW_Navigate_PrevLine           2
#define XBPBRW_Navigate_NextPage           3
#define XBPBRW_Navigate_PrevPage           4
#define XBPBRW_Navigate_GoTop              5
#define XBPBRW_Navigate_GoBottom           6
das ganze muss man nun in eine XbpBrowse Class einsetzten

Code: Alles auswählen

   INLINE METHOD HandleEvent( nEvent, Mp1, Mp2 )
   *********************************************
      IF nEvent == xbeBRW_Navigate
         IF mp1 = XBPBRW_Navigate_PrevLine
            IF ::rowPos > 1
               mp1:= XBPBRW_Navigate_Skip
               mp2:= -::rowPos
            ENDIF
         ELSEIF mp1 = XBPBRW_Navigate_NextLine
            IF ::rowPos < ::rowCount
               mp1:= XBPBRW_Navigate_Skip
               mp2:= ::rowCount - ::rowPos
            ENDIF
         ENDIF
      ENDIF
   RETURN ::XbpBrowse:HandleEvent( nEvent, Mp1, Mp2 )
um den Cursor in der Mitte zu "malen"

Code: Alles auswählen

   INLINE METHOD HiliteColumns( nRow, lHilite, lHiliteBorder )
   ***********************************************************
   // override nRow
      nRow:= Int( ::rowCount / 2 )
   RETURN IIF( ::aColumns[ 1 ]:dataArea:getCell( nRow ) = nil,;
               self,;
               ::XbpBrowse:hiliteColumns( nRow, lHilite, lHiliteBorder ) )
und dann kommt so etwas dabei raus
FIXROW.ZIP
(10.5 KiB) 217-mal heruntergeladen