Page 1 of 2

Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 8:12 am
by Antonio Linares
Nuestro querido Paco García me envió un email hace unos dias pues descubrió un bug que ha estado en FiveWin desde su comienzo y que es la causa de que las dimensiones en píxeles en los diálogos no funcionen correctamente:

Code: Select all  Expand view
METHOD cToChar( cCtrlClass ) CLASS TControl

   local n := GetDlgBaseUnits()

   DEFAULT cCtrlClass := ::ClassName(),;
           ::cCaption := "",;
           ::nId      := ::GetNewId(),;
           ::nStyle   := nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP )

return cCtrl2Chr( Int( 2 * 8 * ::nTop    / nHiWord( n ) ),;
                  Int( 2 * 4 * ::nLeft   / nLoWord( n ) ),;
                  Int( 2 * 8 * ::nBottom / nHiWord( n ) ),;
                  Int( 2 * 4 * ::nRight  / nLoWord( n ) ),;
                  ::nId, ::nStyle, cCtrlClass, ::cCaption )


Esos "2" no son necesarios y esa es la razón por la que las dimensiones de los pixeles no son respetadas.

Le estoy muy agradecido a Paco por su gran ayuda al descubrir este bug que lleva desde el inicio de FiveWin.

Ahora tenemos que decidir que hacer. Hemos de mantener compatibilidad hacia atras, así que él me propuso una nueva claúsula:

In dialog.ch
Code: Select all  Expand view
#xcommand DEFINE DIALOG <oDlg> ;
             [ <resource: NAME, RESNAME, RESOURCE> <cResName> ] ;
             [ TITLE <cTitle> ] ;
             [ FROM <nTop>, <nLeft> TO <nBottom>, <nRight> ] ;
             [ SIZE <nWidth>, <nHeight> ] ;
             [ <lib: LIBRARY, DLL> <hResources> ] ;
             [ <vbx: VBX> ] ;
             [ STYLE <nStyle> ] ;
             [ <color: COLOR, COLORS> <nClrText> [,<nClrBack> ] ] ;
             [ BRUSH <oBrush> ] ;
             [ <of: WINDOW, DIALOG, OF> <oWnd> ] ;
             [ <pixel: PIXEL> ] ;
             [ ICON <oIco> ] ;
             [ FONT <oFont> ] ;
             [ <help: HELP, HELPID> <nHelpId> ] ;
             [ <transparent: TRANSPARENT> ] ;
             [ GRADIENT <aGradColors> ] ;
             [ <lTruePixel: TRUEPIXEL>  ] ;
       => ;
          <oDlg> = TDialog():New( <nTop>, <nLeft>, <nBottom>, <nRight>,;
                 <cTitle>, <cResName>, <hResources>, <.vbx.>, <nStyle>,;
                 <nClrText>, <nClrBack>, <oBrush>, <oWnd>, <.pixel.>,;
                 <oIco>, <oFont>, <nHelpId>, <nWidth>, <nHeight>, <.transparent.>,;
                 <aGradColors>, <.lTruePixel.> )
 


y en dialog.prg

Code: Select all  Expand view
Dialog.prg

   DATA   lTruePixel AS LOGICAL INIT .F.

   METHOD New( nTop, nLeft, nBottom, nRight, cCaption, cResName, hResources,;
               lVbx, nStyle, nClrText, nClrBack, oBrush, oWnd, lPixels,;
               oIco, oFont, nHelpId, nWidth, nHeight, lTransparent, aNewGradColors, lTruePixel ) CONSTRUCTOR

METHOD New( nTop, nLeft, nBottom, nRight, cCaption, cResName, hResources,;
            lVbx, nStyle, nClrText, nClrBack, oBrush, oWnd, lPixels,;
            oIco, oFont, nHelpId, nWidth, nHeight, lTransparent, aNewGradColors, lTruePixel ) CLASS TDialog

   DEFAULT hResources := GetResources(), lVbx := .f.,;
           nClrText   := GetSysColor( COLOR_BTNTEXT ), nClrBack := GetSysColor( COLOR_BTNFACE ),;
           lPixels    := .f., nTop := 0, nLeft := 0, nBottom := 10, nRight := 40,;
           nWidth     := 0, nHeight := 0, lTransparent := .f.,;
           nStyle     := nOR( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU ),;
           lTruePixel := .f.

   ::lTruePixel = lTruePixel
 


In control.prg
Code: Select all  Expand view

METHOD cToChar( cCtrlClass ) CLASS TControl

   local n := GetDlgBaseUnits()

   DEFAULT cCtrlClass := ::ClassName(),;
           ::cCaption := "",;
           ::nId      := ::GetNewId(),;
           ::nStyle   := nOR( WS_CHILD, WS_VISIBLE, WS_TABSTOP )

return cCtrl2Chr( Int( if(::oWnd:lTruePixel,1,2) * 8 * ::nTop    / nHiWord( n ) ),;
                  Int( if(::oWnd:lTruePixel,1,2) * 4 * ::nLeft   / nLoWord( n ) ),;
                  Int( if(::oWnd:lTruePixel,1,2) * 8 * ::nBottom / nHiWord( n ) ),;
                  Int( if(::oWnd:lTruePixel,1,2) * 4 * ::nRight  / nLoWord( n ) ),;
                  ::nId, ::nStyle, cCtrlClass, ::cCaption )
 


me gustaría conocer vuestras opiniones antes de proceder a implementarlo, gracias

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 8:58 am
by FiveWiDi
Me parece perfecto.
Por defecto existe la compatibilidad hacia atrás y a partir de ahora podemos hacer los diálogos 'correctamente'.

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 9:49 am
by fgondi
La solución parece que es la correcta.

Y con tiempo, nosotros ya iremos cambiando los valores de las ventanas.

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 1:02 pm
by jmartial
Antonio,

No entiendo muy bien cual es el cambio. ¿Por qué se multiplicaba por 2?

Y si se soluciona, que diferencia notaríamos, es decir, en qué influye exactamente.

Si pudieras poner un ejemplo, te lo agradecería.

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 1:10 pm
by hmpaquito
Buena caza ! Felicidades para Paco García....

¿ Sería este el motivo por el que las "sizes" para los controles hay que multiplicarlos por x 2 cuando se crean por codigo y no es en el ON INIT ? Hablo de cabeza... sí sé seguro que según ON INIT o no había que multiplicar x 2.

Por cierto... ¿ las pruebas del arreglo se han realizado con dialogos con controles creados por codigo en el ON INIT y antes del ON INIT ? A ver si va a ser necesario el x 2 en algun caso...

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 2:47 pm
by cnavarro
Antonio, me parece la solucion mas adecuada

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Fri Nov 07, 2014 7:27 pm
by D.Fernandez
Hola: Es posible que en dialog.prg este faltando la variable cVarName antes de lTruePixel?

Saludos

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Sat Nov 08, 2014 11:13 am
by colthop
Hola Antonio:

Yo opino que la solución más correcta es la que por defecto se tenga que poner los valores correctos y si le ponemos la clausula que comentas se ajuste a lo anterior, que creo que es lo que propones.

Creo que esto resuelve el problema que te planteaba por el 2009 en viewtopic.php?f=6&t=14561, y como sabes soy muy torpe, me podrías indicar si hago los cambios que dices en los tres archivos lo que resulta es que hay que corregir las coordenadas o no. O dicho de otra forma que cambios hay que introducir para que desde el principio se pongan las coordenadas correctas.

Un saludo

Y buen trabajo.

Carlos

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Sat Nov 08, 2014 2:07 pm
by mastintin
Yo estoy de acuerdo con colthop . Lo correcto sería que partir de ahora usáramos los diálogos correctamente y poner la cláusula si queremos compatibilidad.
para los desarrollos abandonados y compilados no tiene influencia y para los desarrollos a mantener se pone la cláusula en todos los diálogos fácilmente con cualquier editor , para lo nuevo se hace correctamente.

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Mon Nov 10, 2014 7:12 am
by Antonio Linares
Carlos,

No podemos romper compatibilidad hacia atras. Es una regla de oro :-)

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Mon Nov 10, 2014 8:52 am
by colthop
Hola Antonio:

Creo que no rompes compatibilidad hacia atrás si le das la posibilidad de dejarlo como está con una opción, además se producía un efecto cuando Refrescabas cualquier variable que te la mostraba con las dimensiones reales, por ejemplo yo ponía 10 de alto porque en realidad eran 20 y si esa variable no se refrescaba (:Refresh()) no pasaba nada pero si cambiaba su valor y la refrescabas quedaba a la mitad. Por eso mi comentario a favor de que el defecto sea lo correcto y con la posibilidad de hacer que te valga lo anterior. Por otra parte creo que no quedaría bien que en una explicación de una función se dijese que "Para poder ver las variables en su tamaño real tienen que dividir por 2 las dimensiones sino pongan la clausula X" o "Por defecto la clausula X se tiene que poner para mostrar las dimensiones reales, sino mostrará las dimensiones multiplicadas por 2".

Es una opinión, yo tuve que dejar de usar los DIALOG por eso y usar las WINDOWS que o tenían ese efecto.

Un saludo

Carlos

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Mon Nov 10, 2014 2:41 pm
by Antonio Linares
Carlos,

No descarto el que llegue a ser la opción correcta por defecto la que usemos.

Pero de momento, durante varias versiones lo mantendremos asi para no romper nada... :-)

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Tue Nov 11, 2014 3:00 pm
by D.Fernandez
Hola amigos:

Se usa asi ? oDlg:lTruePixel := .T.

Gracias.

Pregunto porque hice los cambios y no veo la diferencia.

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Tue Nov 11, 2014 7:38 pm
by Antonio Linares
Ruben,

Aún no está implementado. Lo incluiremos en el próximo build de FWH

Re: Un bug de hace mucho tiempo en FWH

PostPosted: Wed Nov 12, 2014 2:56 pm
by D.Fernandez
Gracias Maestro.

Saludos