XbpBrowse: Zeile direkt positionieren
Moderator: Moderatoren
Re: XbpBrowse: Zeile direkt positionieren
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
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 (214.78 KiB) 2931 mal betrachtet
Re: XbpBrowse: Zeile direkt positionieren
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
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
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
: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
- AUGE_OHR
- 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
hm ... ich "sehe" noch mehr !Roland Gentner hat geschrieben:1) In der ersten Zeile blau markierte Felder übrig. Je nach Fenstergröße mehr oder weniger viele (siehe Bild).
in Zeile 1 ist ein XBPBRW_CURSOR_CELL aber in der Mitte hast du ein XBPBRW_CURSOR_ROW ... hm
im Help File steht das du es "von Hand" synchronisieren musst.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.
Wenn du die RowPos eingestellt hast dann muss du "von Hand" ein o:refreshAll() ausführen
hm ... wie willst du ohne o:show() feststellen wie viele "sichtbare" Zeilen du hast ?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.
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)
Das der Browser noch re-positioniert fällt dann weniger auf ... könnte ja zur Animation gehören
gruss by OHR
Jimmy
Jimmy
Re: XbpBrowse: Zeile direkt positionieren
Hallo Jimmy
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
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.hm ... wie willst du ohne o:show() feststellen wie viele "sichtbare" Zeilen du hast ?
Das würde sicher die ersten paar Mal ablenken. Aber im Geschäftsbetrieb hätte ich da schnell ärgerAnimation...
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
- AUGE_OHR
- 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
na ja ... wenn man das Browse noch nicht sieht nützt einem o:deHilite / o:Hilite nicht viel.Roland Gentner hat geschrieben:den Cursor unsichtbar machen mit :deHilite geht auch erst nach dem :show().
auch wenn der Workaround optisch hilft ist dafür eigentlich nicht dafür gedacht.Roland Gentner hat geschrieben:Code: Alles auswählen
o:CursorMode := XBPBRW_CURSOR_NONE ... o:CursorMode := XBPBRW_CURSOR_ROW
über wie viele Felder reden wir ?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.
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. 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
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
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 )
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 ) )
gruss by OHR
Jimmy
Jimmy