XbpBrowse: Zeile direkt positionieren

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

DelUser01

Re: XbpBrowse: Zeile direkt positionieren

Beitrag 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
Dateianhänge
HardCopy0002.JPG
HardCopy0002.JPG (214.78 KiB) 2931 mal betrachtet
DelUser01

Re: XbpBrowse: Zeile direkt positionieren

Beitrag 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
DelUser01

Re: XbpBrowse: Zeile direkt positionieren

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse: Zeile direkt positionieren

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

Re: XbpBrowse: Zeile direkt positionieren

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: XbpBrowse: Zeile direkt positionieren

Beitrag 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) 205-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) 216-mal heruntergeladen
gruss by OHR
Jimmy
Antworten