2002-02-05 15:13 UTC+0100 Maurilio Longo <maurilio.longo@libero.it>

* source/rtl/tbrowse.prg
     ! fixed columns width handling when there are frozen columns
     + columns' width get evaluated just before first TBrowse ::Stabilize()
     + little changes to optimize speed
   * source/rtl/tbcolumn.prg
     ! more clipper compatible (cannot set column width to nil)
This commit is contained in:
Maurilio Longo
2002-02-05 14:15:28 +00:00
parent adf1e5fa62
commit de6e92e634
3 changed files with 227 additions and 135 deletions

View File

@@ -9,10 +9,18 @@
*/
to call them from .hrb .
2002-02-07 20:48 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
* source/rdd/dbfntx/dbfntx1.c
* Some cleanup.
2002-02-06 22:42 UTC+0300 Alexander Kresin <alex@belacy.belgorod.su>
* source/rdd/dbfntx/dbfntx1.c
* Bug fixed, reported by jhncon <jhncon@yahoo.com.tw>
2002-02-06 08:34 UTC+0100 Maurilio Longo <maurilio.longo@libero.it>
* include/hbapiitm.h
* source/rtl/tbrowse.prg
! fixed ::aRedraw handling inside ::Stabilize()
2002-02-05 21:22 UTC+0100 Tomaz Zupan <tomaz.zupan@orpo.si>
* contrib/odbc/Makefile
* contrib/odbc/odbc.c

View File

@@ -66,8 +66,10 @@ CLASS TBColumn
DATA FootSep // Footing separator character
DATA HeadSep // Heading separator character
DATA Picture // Column picture string
DATA Width // Column display width
ACCESS Width INLINE ::nWidth // Column display width
ASSIGN Width(n) INLINE ::SetWidth(n)
// NOTE: 17/08/01 - <maurilio.longo@libero.it>
// It is not correct in my opinion that this instance variable be exported
DATA ColPos // Temporary column position on screen needed by TBrowse class
@@ -78,11 +80,16 @@ CLASS TBColumn
METHOD SetStyle()
#endif
HIDDEN: /* H I D D E N */
DATA nWidth
METHOD SetWidth(n)
ENDCLASS
METHOD New( cHeading, bBlock ) CLASS TBColumn
local cType, nTokenPos := 0, nL
local xRes, cType, nTokenPos := 0, nL
DEFAULT cHeading TO ""
@@ -90,46 +97,24 @@ METHOD New( cHeading, bBlock ) CLASS TBColumn
::FootSep := ""
::ColPos := 1
::Width := 0
::nWidth := nil
::Heading := cHeading
/* TOFIX: In Clipper the column widths are not determined at this point.
[vszakats] */
if ISBLOCK( bBlock )
::block := bBlock
cType := Valtype( Eval( bBlock ) )
do case
case cType == "N"
::Width := Len( Str( Eval( bBlock ) ) )
case cType == "L"
::Width := 1
case cType == "C"
::Width := Len( Eval( bBlock ) )
case cType == "D"
::Width := Len( DToC( Eval( bBlock ) ) )
otherwise
::Width := 0
endcase
cHeading += ";"
while (nL := Len(__StrTkPtr(@cHeading, @nTokenPos, ";"))) > 0
if nL > ::Width
::Width := nL
endif
enddo
endif
::block := bBlock
return Self
METHOD SetWidth(n) CLASS TBColumn
// From a TOFIX inside TBrowse.prg:
// "Also Clipper will not allow the user to assign a NIL to the :width variable."
if n <> nil
::nWidth := n
endif
return n
#ifdef HB_COMPAT_C53
METHOD SetStyle() CLASS TBColumn

View File

@@ -54,10 +54,11 @@
* The following parts are Copyright of the individual authors.
* www - http://www.harbour-project.org
*
* Copyright 2000, 2001 Maurilio Longo <maurilio.longo@libero.it>
* Copyright 2000, '01, '02 Maurilio Longo <maurilio.longo@libero.it>
* Cursor movement handling, stabilization loop, multi-line headers and footers support
* ::PageUp(), ::PageDown(), ::Down(), ::Up(), ::GoBottom(), ::GoTop(), ::Stabilize()
* ::GotoXY(), ::DispCell(), ::WriteMLineText(), ::RedrawHeaders()
* ::GotoXY(), ::DispCell(), ::WriteMLineText(), ::RedrawHeaders(),
* ::SetFrozenCols(), ::SetColumnWidth()
*
* Copyright 2001 Manu Exposito <maex14@dipusevilla.es>
* Activate data PICTURE DispCell(nColumn, nColor)
@@ -76,13 +77,6 @@
Determines the coordinates for the data area of a TBrowse object.
Xbase++ compatible method */
/* TOFIX: Clipper will determine the column width when the TBROWSE is displayed
at the first time. (while Harbour does that when adding the column)
Clipper will leave NIL in the :width variable until determined. Also
Clipper will not allow the user to assign a NIL to the :width
variable. Clipper will determine the width even when the caller
explicitly set the :width after adding the column. [vszakats] */
#include "common.ch"
#include "hbclass.ch"
#include "color.ch"
@@ -98,7 +92,6 @@ CLASS TBrowse
DATA colPos // Current cursor column position
DATA colSep // Column separator character
DATA footSep // Footing separator character
DATA freeze // Number of columns to freeze
DATA goBottomBlock // Code block executed by TBrowse:goBottom()
DATA goTopBlock // Code block executed by TBrowse:goTop()
DATA headSep // Heading separator character
@@ -119,6 +112,9 @@ CLASS TBrowse
DATA aKeys
#endif
ACCESS freeze INLINE ::nFrozenCols // Number of columns to freeze/frozen
ASSIGN freeze(nHowMany) INLINE ::SetFrozenCols(nHowMany)
METHOD New(nTop, nLeft, nBottom, nRight) // Constructor
METHOD Down() // Moves the cursor down one row
METHOD End() // Moves the cursor to the rightmost visible data column
@@ -136,30 +132,30 @@ CLASS TBrowse
METHOD Up() // Moves the cursor up one row
METHOD AddColumn( oCol )
METHOD ColCount() INLINE Len(::aColumns)
METHOD ColorRect() // Alters the color of a rectangular group of cells
METHOD DelColumn( nPos ) // Delete a column object from a browse
METHOD InsColumn( nPos, oCol ) INLINE; // Insert a column object in a browse
ASize( ::aColumns, ++::nColumns), AIns( ::aColumns, nPos ),;
::aColumns[ nPos ] := oCol, ::Configure( 2 ), oCol
METHOD GetColumn( nColumn ) INLINE; // Gets a specific TBColumn object
iif( 0 < nColumn .and. nColumn <= ::nColumns, ::aColumns[ nColumn ], NIL )
// NOTE: Shouldn't I return a copy of replaced column?
METHOD SetColumn( nColumn, oCol ) INLINE; // Replaces one TBColumn object with another
iif( 0 < nColumn .and. nColumn <= ::nColumns, ::aColumns[ nColumn ] := oCol, NIL ),;
::Configure( 2 ), oCol
METHOD ColWidth( nColumn ) INLINE; // Returns the display width of a particular column
iif( 0 < nColumn .and. nColumn <= Len( ::aColumns ), ::aColumns[ nColumn ]:Width, NIL )
iif( 0 < nColumn .and. nColumn <= ::nColumns, ::aColumns[ nColumn ]:Width, NIL )
METHOD ColCount() INLINE ::nColumns
METHOD ColorRect() // Alters the color of a rectangular group of cells
METHOD Configure( nMode ) // Reconfigures the internal settings of the TBrowse object
// nMode is an undocumented parameter in CA-Cl*pper
METHOD DeHilite() // Dehighlights the current cell
METHOD DelColumn( nPos ) // Delete a column object from a browse
METHOD ForceStable() // Performs a full stabilization
METHOD GetColumn( nColumn ) INLINE; // Gets a specific TBColumn object
iif( 0 < nColumn .and. nColumn <= Len( ::aColumns ), ::aColumns[ nColumn ], NIL )
METHOD ForceStable() // Performs a full stabilization
METHOD Hilite() // Highlights the current cell
METHOD InsColumn( nPos, oCol ) INLINE; // Insert a column object in a browse
ASize( ::aColumns, Len( ::aColumns ) + 1 ), AIns( ::aColumns, nPos ),;
::aColumns[ nPos ] := oCol, ::Configure( 2 ), oCol
METHOD Invalidate() // Forces entire redraw during next stabilization
METHOD RefreshAll() // Causes all data to be recalculated during the next stabilize
METHOD RefreshCurrent() INLINE; // Causes the current row to be refilled and repainted on next stabilize
::aRedraw[ ::RowPos ] := .T., ::stable := .F., Self
METHOD SetColumn( nColumn, oCol ) INLINE; // Replaces one TBColumn object with another
iif( 0 < nColumn .and. nColumn <= Len( ::aColumns ), ::aColumns[ nColumn ] := oCol, NIL ), oCol
METHOD Stabilize() // Performs incremental stabilization
#ifdef HB_COMPAT_C53
@@ -186,6 +182,8 @@ CLASS TBrowse
METHOD WriteMLineText(cStr, nPadLen, lHeader, cColor) // Writes a multi-line text where ";" is a line break, lHeader
// is .T. if it is a header and not a footer
METHOD SetFrozenCols(nHowMany) // Handles freezing of columns
METHOD SetColumnWidth(oCol) // Sets ::Width property of given column
DATA aRect // The rectangle specified with ColorRect()
DATA aRectColor // The color positions to use in the rectangle specified with ColorRect()
@@ -203,6 +201,11 @@ CLASS TBrowse
DATA nHeaderHeight // How many lines is highest Header/Footer and so how many lines of
DATA nFooterHeight // screen space I have to reserve
DATA nFrozenWidth // How many screen column are not available on the left side of TBrowse display
// > 0 only when there are frozen columns
DATA nFrozenCols // Number of frozen columns on left side of TBrowse
DATA nColumns // Number of columns added to TBrowse
DATA lNeverDisplayed // .T. if TBrowse has never been stabilize()d
ENDCLASS
@@ -218,7 +221,6 @@ METHOD New(nTop, nLeft, nBottom, nRight) CLASS TBrowse
::AutoLite := .T.
::leftVisible := 1
::ColPos := 1
::Freeze := 0
::HitBottom := .F.
::HitTop := .F.
::lHitTop := .F.
@@ -242,7 +244,10 @@ METHOD New(nTop, nLeft, nBottom, nRight) CLASS TBrowse
::nColsVisible := 0
::nHeaderHeight := 1
::nFooterHeight := 1
::nFrozenWidth := 0
::nFrozenCols := 0
::nColumns := 0
::lNeverDisplayed := .T.
::nTop := nTop
::nLeft := nLeft
@@ -278,7 +283,7 @@ METHOD Configure(nMode) CLASS TBrowse
::lRedrawFrame := .T.
// Are there column headers to paint ?
for n := 1 to Len(::aColumns)
for n := 1 to ::nColumns
if !Empty(::aColumns[n]:Heading)
::lHeaders := .T.
exit
@@ -286,19 +291,18 @@ METHOD Configure(nMode) CLASS TBrowse
next
// Are there column footers to paint ?
for n := 1 to Len(::aColumns)
for n := 1 to ::nColumns
if !Empty(::aColumns[n]:Footing)
::lFooters := .T.
exit
endif
next
::nHeaderHeight := 1
::nFooterHeight := 1
// Find out highest header and footer
for n := 1 to Len(::aColumns)
for n := 1 to ::nColumns
if ::lHeaders .AND. !Empty(::aColumns[n]:Heading)
nHeight := Len(::aColumns[n]:Heading) - Len(StrTran(::aColumns[n]:Heading, ";")) + 1
@@ -332,6 +336,11 @@ METHOD Configure(nMode) CLASS TBrowse
endif
::Invalidate()
// Force re-evaluation of space occupied by frozen columns
if ::freeze > 0
::SetFrozenCols(::freeze)
endif
return Self
@@ -339,14 +348,8 @@ return Self
// Adds a TBColumn object to the TBrowse object
METHOD AddColumn( oCol ) CLASS TBrowse
local nWidthMax := ::nRight - ::nLeft + 1 // Visible width of the browse
if oCol:Width > nWidthMax
// with values lower than -4 it SIGSEVs here and there :-(
oCol:Width := nWidthMax - 4
endif
AAdd( ::aColumns, oCol )
::nColumns++
::Configure( 2 )
return Self
@@ -358,13 +361,100 @@ METHOD DelColumn( nPos ) CLASS TBrowse
local n
ADel( ::aColumns, nPos )
ASize( ::aColumns, Len( ::aColumns ) - 1 )
ASize( ::aColumns, --::nColumns)
::Configure( 2 )
return oCol
METHOD SetFrozenCols(nHowMany) CLASS TBrowse
LOCAL nCol
LOCAL nWidth := ::nRight - ::nLeft + 1 // Visible width of the browse
::nFrozenCols := nHowMany
// Space inside TBrowse window reserved for frozen columns
::nFrozenWidth := 0
// If I've never displayed this TBrowse before I cannot calc occupied space since
// columns:width is not yet set, ::Stabilize() will call me later
if ! ::lNeverDisplayed
if nHowMany > 0
for nCol := 1 TO nHowMany
::nFrozenWidth += ::aColumns[ nCol ]:Width
if nCol < ::nColumns
::nFrozenWidth += iif( ::aColumns[ nCol + 1 ]:ColSep != NIL,;
Len( ::aColumns[ nCol + 1 ]:ColSep ),;
Len( ::ColSep ) )
endif
next
endif
for nCol := 1 to ::nColumns
if nHowMany > 0
// If there are columns which are larger than TBrowse display width minus
// frozen columns reserved space, shrihnk them to fit
if ::nFrozenWidth + ::aColumns[ nCol ]:Width > nWidth
::aColumns[ nCol ]:Width := nWidth - ::nFrozenWidth
endif
else
// Reset column widths
::SetColumnWidth(::aColumns[ nCol ])
endif
next
endif
return nHowMany
METHOD SetColumnWidth( oCol ) CLASS TBrowse
LOCAL xRes, cType, nTokenPos := 0, nL, cHeading
LOCAL nWidthMax := ::nRight - ::nLeft + 1 // Visible width of TBrowse
if ISBLOCK( oCol:block )
cType := Valtype(xRes := Eval( oCol:block ) )
do case
case cType == "N"
oCol:Width := Len( Str( xRes ) )
case cType == "L"
oCol:Width := 1
case cType == "C"
oCol:Width := Len( xRes )
case cType == "D"
oCol:Width := Len( DToC( xRes ) )
otherwise
oCol:Width := 0
endcase
cHeading := oCol:Heading + ";"
while (nL := Len(__StrTkPtr(@cHeading, @nTokenPos, ";"))) > 0
if nL > oCol:Width
oCol:Width := nL
endif
enddo
if oCol:Width > nWidthMax
// with values lower than -4 it SIGSEVs here and there :-(
oCol:Width := nWidthMax - 4
endif
else
// Needed !
oCol:Width := 0
endif
return Self
METHOD Down() CLASS TBrowse
::Moved()
@@ -445,7 +535,7 @@ METHOD _Right() CLASS TBrowse
if ::ColPos < ::rightVisible
::ColPos++
else
if ::ColPos < Len( ::aColumns )
if ::ColPos < ::nColumns
::rightVisible++
::leftVisible := ::LeftDetermine()
::ColPos++
@@ -466,7 +556,7 @@ METHOD _Left() CLASS TBrowse
if ::ColPos > ::leftVisible
::ColPos--
else
if ::ColPos <= Max(::leftVisible, ::Freeze) .AND. ::ColPos > 1
if ::ColPos <= Max(::leftVisible, ::nFrozenCols) .AND. ::ColPos > 1
while leftVis == ::leftVisible
::rightVisible--
::leftVisible := ::LeftDetermine()
@@ -483,34 +573,23 @@ return Self
METHOD LeftDetermine() CLASS TBrowse
local nWidthMax := ::nRight - ::nLeft + 1 // Visible width of the browse
local nWidth := 0
local nWidth := ::nFrozenWidth
local nCol
if ::Freeze > 0
for nCol := 1 TO ::Freeze
nWidth += ::aColumns[ nCol ]:Width
if nCol < Len( ::aColumns )
nWidth += iif( ::aColumns[ nCol + 1 ]:ColSep != NIL,;
Len( ::aColumns[ nCol + 1 ]:ColSep ),;
Len( ::ColSep ) )
endif
next
endif
for nCol := ::rightVisible to ::Freeze + 1 step -1
nCol := ::rightVisible
while nWidth < nWidthMax .and. nCol > ::nFrozenCols
nWidth += ::aColumns[ nCol ]:Width +;
iif( ::aColumns[ nCol ]:ColSep != NIL,;
Len( ::aColumns[ nCol ]:ColSep ),;
Len( ::ColSep ) )
if nWidth > nWidthMax
exit
iif( ::aColumns[ nCol ]:ColSep != NIL,;
Len( ::aColumns[ nCol ]:ColSep ),;
Len( ::ColSep ) )
if nWidth < nWidthMax
nCol--
endif
enddo
next
return nCol + 1
return Min(nCol + 1, ::nColumns)
METHOD PageDown() CLASS TBrowse
@@ -535,9 +614,9 @@ METHOD PanEnd() CLASS TBrowse
::Moved()
if ::ColPos < Len( ::aColumns )
if ::rightVisible < Len( ::aColumns )
::rightVisible := Len( ::aColumns )
if ::ColPos < ::nColumns
if ::rightVisible < ::nColumns
::rightVisible := ::nColumns
::leftVisible := ::LeftDetermine()
::ColPos := ::rightVisible
::lRedrawFrame := .T.
@@ -556,8 +635,8 @@ METHOD PanHome() CLASS TBrowse
::Moved()
if ::ColPos > 1
if ::leftVisible > ::Freeze + 1
::leftVisible := ::Freeze + 1
if ::leftVisible > ::nFrozenCols + 1
::leftVisible := ::nFrozenCols + 1
::ColPos := 1
::RefreshAll()
::lRedrawFrame := .T.
@@ -577,7 +656,7 @@ METHOD PanLeft() CLASS TBrowse
::Moved()
if ::leftVisible > ::Freeze + 1
if ::leftVisible > ::nFrozenCols + 1
while leftVis == ::leftVisible
::rightVisible--
::leftVisible := ::LeftDetermine()
@@ -596,7 +675,7 @@ METHOD PanRight() CLASS TBrowse
::Moved()
if ::rightVisible < Len( ::aColumns )
if ::rightVisible < ::nColumns
::rightVisible++
::leftVisible := ::LeftDetermine()
::ColPos := Min( ::leftVisible + n, ::rightVisible )
@@ -667,17 +746,17 @@ METHOD HowManyCol(nWidth) CLASS TBrowse
::nColsWidth := 0
::nColsVisible := 0
if ::Freeze > 0
if ::leftVisible <= ::Freeze
::leftVisible := ::Freeze + 1
if ::nFrozenCols > 0
if ::leftVisible <= ::nFrozenCols
::leftVisible := ::nFrozenCols + 1
endif
::nColsVisible := 0
while ::nColsVisible < ::Freeze
while ::nColsVisible < ::nFrozenCols
nToAdd := ::aColumns[ ::nColsVisible + 1 ]:Width
if ::nColsVisible >= 1 .and. ::nColsVisible < Len( ::aColumns )
if ::nColsVisible >= 1 .and. ::nColsVisible < ::nColumns
nToAdd += iif( ::aColumns[ ::nColsVisible + 1 ]:ColSep != NIL,;
Len( ::aColumns[ ::nColsVisible + 1 ]:ColSep ),;
Len( ::ColSep ) )
@@ -690,8 +769,10 @@ METHOD HowManyCol(nWidth) CLASS TBrowse
::nColsWidth += nToAdd
::nColsVisible++
enddo
if ::nColsWidth > nWidth
/* NOTE: Why do I change frozen columns here? */
::Freeze := 0
::nColsWidth := 0
endif
@@ -699,11 +780,11 @@ METHOD HowManyCol(nWidth) CLASS TBrowse
::nColsVisible := ::leftVisible - 1
while ::nColsVisible < Len( ::aColumns )
while ::nColsVisible < ::nColumns
nToAdd := ::aColumns[ ::nColsVisible + 1 ]:Width
if ::nColsVisible >= ::leftVisible .or. ::Freeze > 0
if ::nColsVisible >= ::leftVisible .or. ::nFrozenCols > 0
nToAdd += iif( ::aColumns[ ::nColsVisible + 1 ]:ColSep != NIL,;
Len( ::aColumns[ ::nColsVisible + 1 ]:ColSep ),;
Len( ::ColSep ) )
@@ -738,8 +819,8 @@ METHOD RedrawHeaders(nWidth) CLASS TBrowse
// Set cursor at first field start of description
DevPos(::nTop, ::nLeft + (( nWidth - ::nColsWidth ) / 2))
for n := iif(::Freeze > 0, 1, ::leftVisible) to ::rightVisible
if ::Freeze > 0 .and. n == ::Freeze + 1
for n := iif(::nFrozenCols > 0, 1, ::leftVisible) to ::rightVisible
if ::nFrozenCols > 0 .and. n == ::nFrozenCols + 1
n := ::leftVisible
endif
@@ -766,8 +847,8 @@ METHOD RedrawHeaders(nWidth) CLASS TBrowse
nTPos := nBPos := ::nLeft + (( nWidth - ::nColsWidth ) / 2 )
// Draw headin/footing column separator
for n := iif(::Freeze > 0, 1, ::leftVisible) to ::rightVisible
if ::Freeze > 0 .and. n == ::Freeze + 1
for n := iif(::nFrozenCols > 0, 1, ::leftVisible) to ::rightVisible
if ::nFrozenCols > 0 .and. n == ::nFrozenCols + 1
n := ::leftVisible
endif
@@ -795,8 +876,8 @@ METHOD RedrawHeaders(nWidth) CLASS TBrowse
// Set cursor at first field start of description
DevPos(::nBottom, ::nLeft + (( nWidth - ::nColsWidth ) / 2))
for n := iif( ::Freeze > 0, 1, ::leftVisible ) to ::rightVisible
if ::Freeze > 0 .and. n == ::Freeze + 1
for n := iif( ::nFrozenCols > 0, 1, ::leftVisible ) to ::rightVisible
if ::nFrozenCols > 0 .and. n == ::nFrozenCols + 1
n := ::leftVisible
endif
@@ -825,6 +906,22 @@ METHOD Stabilize() CLASS TBrowse
local nOldCursor // Current shape of cursor (which I remove before stabilization)
// I need to set columns width If TBrowse was never displayed before
if ::lNeverDisplayed
AEVal(::aColumns, {|oCol| ::SetColumnWidth(oCol)} )
// NOTE: It must be before call to ::SetFrozenCols() since this call
// tests this iVar value, and I set it to .F. since I'm going to display TBrowse
// for first time
::lNeverDisplayed := .F.
// Force re-evaluation of frozen space since I could not calc it before
// being columns width not set
if ::freeze > 0
::SetFrozenCols(::freeze)
endif
endif
nOldCursor := SetCursor(SC_NONE)
if ::lRedrawFrame
@@ -838,7 +935,7 @@ METHOD Stabilize() CLASS TBrowse
else
oStartCol := ::aColumns[ iif( ::rightVisible != 0, ::rightVisible, 1 ) ]
oEndCol := ::aColumns[ iif( ::Freeze > 0, 1, ::leftVisible ) ]
oEndCol := ::aColumns[ iif( ::nFrozenCols > 0, 1, ::leftVisible ) ]
::nColsWidth := iif( oStartCol != NIL, oStartCol:ColPos, 0 ) + ;
iif( oStartCol != NIL, oStartCol:Width, 0 ) - oEndCol:ColPos
@@ -872,7 +969,7 @@ METHOD Stabilize() CLASS TBrowse
elseif ::nRecsToSkip < 0
::lHitTop := .T.
else //::nRecsToSkip == 0
// else ::nRecsToSkip == 0
//
endif
@@ -919,13 +1016,15 @@ METHOD Stabilize() CLASS TBrowse
// I've scrolled on screen rows, now I need to scroll ::aRedraw array as well!
if nRecsSkipped > 0
for nRow := 2 to Len(::aRedraw)
/*for nRow := 2 to Len(::aRedraw)
::aRedraw[nRow - 1] := ::aRedraw[nRow]
next
next*/
ACopy(::aRedraw, ::aRedraw, 2,, 1)
else
for nRow := (Len(::aRedraw) - 1) to 1 step -1
/*for nRow := (Len(::aRedraw) - 1) to 1 step -1
::aRedraw[nRow + 1] := ::aRedraw[nRow]
next
next*/
ACopy(::aRedraw, ::aRedraw, 1, Len(::aRedraw) - 1, 2)
endif
::aRedraw[::nNewRowPos] := .T.
@@ -969,9 +1068,9 @@ METHOD Stabilize() CLASS TBrowse
DispOutAt(::nTop + nRow + iif(::lHeaders, ::nHeaderHeight, 0) + iif(Empty(::HeadSep), 0, 1) - 1, ::nLeft,;
Space( ( nWidth - ::nColsWidth ) / 2 ), ::ColorSpec )
for n := iif( ::Freeze > 0, 1, ::leftVisible ) to ::rightVisible
for n := iif( ::nFrozenCols > 0, 1, ::leftVisible ) to ::rightVisible
if ::Freeze > 0 .and. n == ::Freeze + 1
if ::nFrozenCols > 0 .and. n == ::nFrozenCols + 1
n := ::leftVisible
endif
@@ -1238,12 +1337,12 @@ METHOD MGotoYX(nRow, nCol) CLASS TBrowse
// Now move to column under nCol
nColsLen := 0
// NOTE: I don't think it is correct, have to look up docs
nI := iif(::Freeze > 0, ::Freeze, ::leftVisible)
nI := iif(::nFrozenCols > 0, ::nFrozenCols, ::leftVisible)
while nColsLen < nCol .AND. nI < ::rightVisible
nColsLen += ::aColumns[nI]:Width
if nI >= 1 .AND. nI < Len( ::aColumns )
if nI >= 1 .AND. nI < ::nColumns
nColsLen += iif(::aColumns[nI]:ColSep != NIL, Len(::aColumns[nI]:ColSep), Len(::ColSep))
endif