Page 1 of 1

BUG xBrowse - Antonio olhe isso por favor !

PostPosted: Sat Apr 21, 2007 12:30 pm
by AOKISANTOS
Antonio,

Utilizando o código abaixo:

uBrw := TXBrowse():New( oDlp )

bStruc :={{"","Sim",0,CTOD(""),CTOD(""),0}}

uBrw:SetArray( bStruc )

uBrw:aCols[1]:cHeader := "Parcela"
ubrw:aCols[1]:nWidth := 50
uBrw:aCols[1]:cEditPicture := "999"
uBrw:aCols[1]:bClrEdit := uBrw:bClrStd
uBrw:aCols[1]:bOnPostEdit := {|o,x| bStruc[ uBrw:nArrayAt, 1 ] := x }

uBrw:aCols[2]:cHeader := "Recebida"
ubrw:aCols[2]:nWidth := 60
uBrw:aCols[2]:nDataStrAlign := AL_LEFT
uBrw:aCols[2]:nHeadStrAlign := AL_LEFT
uBrw:aCols[2]:nEditType := EDIT_LISTBOX
uBrw:aCols[2]:aEditListTxt := {"Sim", "Não"}
uBrw:aCols[2]:bOnPostEdit := {|o,x| bStruc[ uBrw:nArrayAt, 2 ] := x }
uBrw:aCols[2]:aEditListBound := {"Sim", "Não"}
uBrw:aCols[2]:bClrEdit := uBrw:bClrStd

uBrw:aCols[3]:cHeader := "Valor"
ubrw:aCols[3]:nWidth := 70
uBrw:aCols[3]:cEditPicture := "@E 999,999.99"
uBrw:aCols[3]:nDataStrAlign := AL_RIGHT
uBrw:aCols[3]:nHeadStrAlign := AL_RIGHT
uBrw:aCols[3]:bOnPostEdit := {|o,x| bStruc[uBrw:nArrayAt, 3 ] := x }
uBrw:aCols[3]:nEditType := EDIT_GET
uBrw:aCols[3]:bStrData := {|| TRANS(bStruc[uBrw:nArrayAt, 3 ] ,"@E 999,999.99")}

uBrw:aCols[4]:cHeader := padc("Vencimento",11)
ubrw:aCols[4]:nWidth := 80
uBrw:aCols[4]:nDataStrAlign := AL_CENTER
uBrw:aCols[4]:nHeadStrAlign := AL_CENTER
uBrw:aCols[4]:bOnPostEdit := {|o,x| bStruc[ uBrw:nArrayAt, 4 ] := x }
uBrw:aCols[4]:nEditType := EDIT_GET

uBrw:aCols[5]:cHeader := padc("Data Pgto",11)
ubrw:aCols[5]:nWidth := 80
uBrw:aCols[5]:nDataStrAlign := AL_CENTER
uBrw:aCols[5]:nHeadStrAlign := AL_CENTER
uBrw:aCols[5]:bOnPostEdit := {|o,x| bStruc[ uBrw:nArrayAt, 5 ] := x }
uBrw:aCols[5]:nEditType := EDIT_GET

uBrw:aCols[6]:cHeader := "Valor Pgto"
ubrw:aCols[6]:nWidth := 70
uBrw:aCols[6]:cEditPicture := "@E 999,999.99"
uBrw:aCols[6]:nDataStrAlign := AL_RIGHT
uBrw:aCols[6]:nHeadStrAlign := AL_RIGHT
uBrw:aCols[6]:bOnPostEdit := {|o,x| bStruc[ uBrw:nArrayAt, 6 ] := x}
uBrw:aCols[6]:nEditType := EDIT_GET
uBrw:aCols[6]:bStrData := {|| TRANS(bStruc[uBrw:nArrayAt, 6 ],"@E 999,999.99")}

uBrw:nMarqueeStyle := MARQSTYLE_HIGHLCELL
uBrw:nColDividerStyle := LINESTYLE_DARKGRAY
uBrw:lColDividerComplete := .t.
uBrw:nFooterLines := 2
uBrw:lFooter := .t.
uBrw:aCols[ 1 ]:cFooter := "Total:"

uBrw:bClrStd := { ||{ RGB(0,0,0), iif( uBrw:nArrayAt % 2 == 0, RGB(234,255,234) , RGB(255,255,255) ) } }
uBrw:nFreeze := 6
uBrw:lHScroll := .f.
uBrw:lVScroll := .f.
uBrw:lFastEdit := .T. //ENTER cod barras
uBrw:CreateFromResource( 101 )

***********************************************************
STATIC FUNCTION CRIA_TITULOS(cocond,iniciemis,tivalor,uBrw)
***********************************************************
LOCAL X,vvaltotal:=0,calcv:=0,ultparc

select condicoes
dbsetorder(1)
if dbseek(cocond)
bStruc:={}
calcv :=round(tivalor/condicoes->co_parc,2)
Select TabCondicoes
dbsetorder(1)
dbseek(str(cocond,4,0))
do while TabCondicoes->pg_codi==cocond .and. TabCondicoes->(! eof())
iniciemis+=TabCondicoes->pg_praz
AADD(bStruc,{TabCondicoes->pg_nupa,"Sim",calcv,iniciemis,ctod(""),0})
TabCondicoes->(dbskip())
enddo
IF LEN(bStruc)>0
vvaltotal:=0
ultparc :=len(bStruc)
FOR X:=1 TO (LEN(bStruc)-1)
vvaltotal+=round(bStruc[x][3],2)
NEXT
bStruc[ultparc][3]:=round(tivalor-vvaltotal,2)
else
bStruc :={{"","Sim",0,CTOD(""),CTOD(""),0}}
ENDIF
uBrw:aArrayData := aClone( bStruc )
uBrw:refresh()
endif
RETURN(.T.)



Esta acontecendo o seguinte, vamos supor que o meu array tenha uns 100 registros, e, eu queira corre-los para baixo. aperto a seta para baixo e os registros começam a correr, porém, os dados de todas colunas(menos a ultima) assumem valores estranhos ex:

http://img255.imageshack.us/img255/1310/seta1cb3.jpg

E se a seta for para cima, ai o BUG é ao contrário, ou seja, todas as linhas ficam certas menos a ultima. ex:

http://img150.imageshack.us/img150/7351/seta2fz5.jpg

using fwh 7.01

AOKISANTOS

:cry:

PostPosted: Sun Apr 22, 2007 6:07 pm
by Ramón Avendaño
Hola AOKISANTOS:

El problema que planteas me tiene desconcertado, no por que se produzca, ya que es un error que conocía, sino porque tal como defines xBrouse en un recurso y sin borde, no debería producirse, salvo que hayas alterado el código original del xbrouse.prg. (y creo que sí)

En principio este problema se produce por un mal cálculo del la altura del xbrouse cuando esta definido el control con borde (WS_BORDER), por recursos, (.RC) y se utiliza con Footer, en estos casos hay una discordancia entre el pintado (::Paint()) y el scroll de la función XBrwScroll() que es el bug que tú indicas y además pinta mal el Footer (que como veras en los JPGs que adjuntas , esta cortado, le falta las últimas líneas de pixels)

Temporalmente la solución, y estoy trabajando en corregir este problema y otros, es cambiar en el código de xBrowse.prg para que METHOD BrwHeight() devuelva 2 ó 4 pixels menos, algo así como:

METHOD BrwHeight() INLINE ( ::nHeight - 2 - iif( ::lHScroll, GetSysMetrics( SM_CYHSCROLL ), 0 ) )

ó

METHOD BrwHeight() INLINE ( ::nHeight - 4 - iif( ::lHScroll, GetSysMetrics( SM_CYHSCROLL ), 0 ) )


Y también hay un bug en el METHOD GoUp() que te puede afectar cuando la altura de la cabecera y la de las líneas de datos son diferentes, donde pone:

::EraseData( ( Int(nHeight/::nRowHeight) + 1 )* ::nRowHeight )

Debería poner:

::EraseData( Int(nHeight/::nRowHeight) * ::nRowHeight + ::HeaderHeight() )



Un saludo,

Ramón Avendaño.