After you change the width of a TXBrowse column (by dragging with the mouse) when the currently highlighted row gets redisplayed, it displays the wrong record.
Using FW 8.10/xHarbour
Regards,
James
After you change the width of a TXBrowse column (by dragging with the mouse) when the currently highlighted row gets redisplayed, it displays the wrong record.
Using FW 8.10/xHarbour
Regards,
James
I do not experience this problem
Apparently it only happens when using a database object.
James
Mr James
I have tested with TDataBase class of FWH. It works fine for me. I am not getting the problem you mentioned.
I would suggest you to revisit the navigation codeblocks assigned by you and in particular the bSkip block.
#include "fivewin.ch"
#include "xbrowse.ch"
function main()
local oWnd,oBrw,oCust,oCol
use customer
database oCust
define window oWnd
oBrw := TXBrowse():New( oWnd )
oCol := oBrw:AddCol()
oCol:cHeader := "First"
oCol:bStrData := { || oCust:first }
oCol := oBrw:AddCol()
oCol:cHeader := "Last"
oCol:bStrData := { || oCust:last }
oBrw:CreateFromCode()
oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW
oBrw:bSkip:= {| nRecs | oCust:skipper( nRecs ) }
oWnd:oClient:= oBrw
activate window oWnd
return niloBrw:bGoTop := {|| oCust:GoTop() }
oBrw:bGoBottom := {|| oCust:GoBottom() }
oBrw:bSkip := {| n | oCust:Skipper( iif( n == nil,1,n) )}, ;
oBrw:bBof := {|| oCust:Bof() }
oBrw:bEof := {|| oCust:Eof() }
oBrw:bBookMark := {| n | iif( n == nil,(oCust:RecNo()),(oCust:GoTo(n)) ) }
oBrw:bKeyNo :=oBrw:bBookMark
oBrw:bKeyCount := {|| oCust:RecCount()}I have added a new method SetODbf with the above assignments in my personal extended version of xBrowse. You can also include the assignments in your TData class.
::bBookMark := {| n | iif( n == nil,;
( cAlias )->( RecNo() ),;
( cAlias )->( DbGoto( n );
) ) }Ok, I found the problem. TDatabase:goto() reloads the buffer after the dbgoto() call. When I change the line to this it works:
oBrw:bBookMark := {| n | iif( n == nil,;
( oCust:cAlias )->( RecNo() ),;
( oCust:cAlias )->( DbGoto( n ), oCust:load();
) ) }
Thus the two codeblocks that must be assigned are bSkip and bBookMark.
Regards,
James
Defaults assigned through SetRDD might not have worked because defaults do not let your TData class to read the data into the buffer.
SetRDD method gets executed invariably. At times this may give unexpected results if a different alias is selected when the browse is created. It is always safe to assign all the codeblocks and not allow SetRDD to assign any defaults
Yes thats what I expected. Our postings crossed
bKeyNo also
METHOD SetoDBF( oDBF ) CLASS TXBrowse
::cAlias := oDBF:cAlias
::bSkip := {| n | oDBF:skipper( n ) }
::bGoTop := {|| oDBF:GoTop() }
::bGoBottom := {|| oDBF:GoBottom() }
::bBof := {|| oDBF:Bof() }
::bEof := {|| oDBF:Eof() }
::bBookMark := {| n | iif( n == nil,(oDBF:RecNo()),(oDBF:GoTo( n )) ) }
::bKeyNo := ::bBookMark
::bKeyCount := {|| oDBF:RecCount()}
return nilMETHOD SetoDbf( oDbf ) CLASS TXBrowse
DEFAULT ::bGoTop := {|| oDbf:GoTop() },;
::bGoBottom := {|| oDbf:GoBottom() },;
::bSkip := {| n | oDbf:Skipper( iif( n == nil,1,n) )}, ;
::bBof := {|| oDbf:Bof() },;
::bEof := {|| oDbf:Eof() },;
::bBookMark := {| n | iif( n == nil,;
(oDbf:RecNo()),;
(oDbf:GoTo(n)) ) },;
::bKeyNo :=::bBookMark,;
::bKeyCount := {|| oDbf:RecCount()}
::nDataType := DATATYPE_ODBF // if FWH agrees only
::oDbf := oDbf
RETURN SelfI suggest not to assign alias, so that this method can serve any Data Class, whether the underlying data source is RDD or not.
For example, i use classes for arrays, text (sdf), ado ( wrapper class for recordset) and any other heterogenous data.
Better this method is generic as long as the Class provides the methods of goTop, goBottom, Skipper, bookmark. recno and goto