bug con la clausula design

Re: bug con la clausula design

Postby mmercado » Sat Jul 19, 2008 4:43 pm

quique wrote:Antonio, como puedo corregir este bug, en el ejemplo que pongo da doble click en el combo box, despues da click en el say y veras que el combo desaparece
Hola Quique:

El problema no está muy fácil de resolver, pero como una solución rápida te propongo agregar el siguiente método a la clase TComboBox:
Code: Select all  Expand view  RUN
Method lDblClick( nRow, nCol, nKeyFlags ) CLASS TComboBox

   If ::lDrag
      ::lButtonDown( nRow, nCol, nKeyFlags )
   EndIf

Return Super:lDblClick( nRow, nCol, nKeyFlags )
Saludos.

Manuel Mercado
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby quique » Sun Jul 20, 2008 6:13 am

Gracias Manuel, tienes razón, el problema no es tan facil, por lo menos para los pobres mortales como yo, pero como comenté en mensajes un poco mas arriba, el problema no es solo con el combobox, son varios controles, de hecho, creo que son todos, aunque algunos no lo reflejan tanto como otros, por ejemplo el say, que de repente falla, de repente no, pero por fin ya encontré la manera de como "parcharlo" para que, por lo menos, no desaparezcan los controles, por lo menos en lo que Antonio resuelve el problema correctamente, aunque no es la solución porque no corrije el problema al 100% ni estética ni operativamente, pero al menos ya es aceptable, lo que no me gusta es que hay que modificar control.prg, y no me gusta modificar los fuentes de fivewin, porque con el paso del tiempo pasa lo que nos pasó cuando trabajaba en grupo SP, que quisimos actualizarnos a xharbour y la ultima versión de fivewin y practicamente tuve que reconstruir varias clases que por las modificaciones que tenían no podían ser actualizadas, prefiero crear mis propias clases heredadas de las de fivewin.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby mmercado » Sun Jul 20, 2008 11:50 am

quique wrote:lo que no me gusta es que hay que modificar control.prg, y no me gusta modificar los fuentes de fivewin, porque con el paso del tiempo pasa lo que nos pasó cuando trabajaba en grupo SP, que quisimos actualizarnos a xharbour y la ultima versión de fivewin y practicamente tuve que reconstruir varias clases que por las modificaciones que tenían no podían ser actualizadas, prefiero crear mis propias clases heredadas de las de fivewin.
Con xHarbour tenemos ahora la ventaja de los mandatos EXTEND y OVERRIDE que te permiten modificar una clase sin afectar su código original, aquí te pongo tu propio ejemplo mostrando lo que te digo:
Code: Select all  Expand view  RUN
#include "fivewin.ch"
proc main
local tComboBox1
DEFINE WINDOW oWnd FROM 116,168 TO 379,779 PIXEL TITLE  " Prueba 1"  STYLE 47120384

ModifyControl()

@ 20, 422 COMBOBOX tComboBox1 ITEMS { "tComboBox", "ComboBox" } of oWnd SIZE 90,21 PIXEL STYLE 1419841539  design
@ 77, 18 SAY  "Edad" PIXEL SIZE 44,15                 design   of oWnd
ACTIVATE WINDOW oWnd

Static Function ModifyControl()

   EXTEND CLASS TControl WITH METHOD lDblClick

Return Nil

Static Function lDblClick( nRow, nCol, nKeyFlags )

   Local Self := QSelf()

   If ::lDrag
      ::lButtonDown( nRow, nCol, nKeyFlags )
   EndIf

Return ::oWnd:lDblClick( nRow, nCol, nKeyFlags )
Saludos.

Manuel Mercado
User avatar
mmercado
 
Posts: 782
Joined: Wed Dec 19, 2007 7:50 am
Location: Salamanca, Gto., México

Postby Antonio Linares » Sun Jul 20, 2008 11:57 am

Quique,

Esta solución parece funcionar. El problema se originaba porque en el primer click del doble click, se capturaba el ratón y no se llegaba a enviar un LButtonUp() para completar el proceso.

En la clase TControl añade este método:

METHOD LDblClick( nRow, nCol, nFlags ) INLINE If( ::lDrag, ::LButtonUp( nRow, nCol, nFlags ), Super:LDblClick( nRow, nCol, nFlags ) )

Espero tus comentarios, gracias
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Sun Jul 20, 2008 3:26 pm

Manuel gracias por tu sugerencia, voy a revisar los comandos, aunque de hecho si aprovecho esa cualidad de xharbour, pero utilizo las funciones, me gusta mas utilizar comandos que funciones porque siento que es un poquito mas claro a la hora de revisar el código, si de por si no acostumbro poner comentarios, con funciones menos me ayudo :p

El problema que tengo para poder implementar eso, es que en control.prg se utilizan variables estaticas, y eso no ayuda al momento de querer modificar los métodos.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby quique » Sun Jul 20, 2008 3:36 pm

Antonio, eso no soluciona el problema

1. Ayuda a quitar que desaparezca el control, pero de todas maneras no pierde el foco hasta el segundo click en el say

2. Ya no funciona el doble click en el control

Te comento que fue lo que hice para reducir el problema, a ver si te ayuda con la solución real, tampoco quita el que no pierda el foco al primer click, pero no borra el control, y deja un recuadro pintado en el control.

Code: Select all  Expand view  RUN
   if ::lDrag           // 458
                        // 459
      ::setFocus()      // 460  metí esta línea
      ::HideDots()      // 461
      CursorCatch()     // 462

Code: Select all  Expand view  RUN
         if Empty( ::nMResize )         // 518
            IF nRow > 0 .AND. nCol > 0  // 519 metí esta línea
               ::Move( ::nTop + nRow - nMRow, ::nLeft + nCol - nMCol,,, .t. )   // 520
            ENDIF                       // 521 metí esta línea
         else                           // 522
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Mon Jul 21, 2008 12:55 am

Quique,

Este ejemplo aqui funciona correctamente, con el nuevo método. Por favor, pruébalo:
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local oWnd, lVal := .T.

   DEFINE WINDOW oWnd

   @ 2, 2 SAY "Test" OF oWnd SIZE 80, 20 DESIGN

   @ 8, 12 CHECKBOX lVal PROMPT "Another" OF oWnd SIZE 120, 40 DESIGN

   ACTIVATE WINDOW oWnd

return nil

Aqui tienes nuestro EXE construido, para que no haya diferencias:
http://rapidshare.com/files/131240825/test.exe.html
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Mon Jul 21, 2008 1:42 am

Antonio, el ejemplo así como lo tienes si funciona, pero le hice una pequeña modificación y no funciona como debería

Code: Select all  Expand view  RUN
#include "FiveWin.ch"

function Main()

   local oWnd, lVal := .T., oChk

   DEFINE WINDOW oWnd

   @ 2, 2 SAY "Test" OF oWnd SIZE 80, 20 DESIGN

   @ 8, 12 CHECKBOX oChk VAR lVal PROMPT "Another" OF oWnd SIZE 120, 40 DESIGN
   oChk:bLDblClick := { || msgInfo( "doble click" ) }

   ACTIVATE WINDOW oWnd

return nil
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Mon Jul 21, 2008 8:03 am

Quique,

Eso se debe sencillamente a que en el nuevo método no se está evaluando el codeblock bLDblClick. Eso es todo.

Pero tienes que reconocer que el bug ya está solucionado.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Mon Jul 21, 2008 1:39 pm

No lo vería así, porque estas perdiendo una funcionalidad ¿comprarías un carro nuevo que para que pueda arrancar le quitan la puerta del pasajero? no es una solución porque quitas algo que si se usa, por eso me dí cuenta que no funciona.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby quique » Wed Jul 23, 2008 3:34 pm

Antonio, ¿alguna noticia sobre este tema?
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby quique » Fri Jul 25, 2008 3:58 pm

Antonio ¿ya habrás encontrado alguna solución?
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby Antonio Linares » Fri Jul 25, 2008 5:43 pm

Quique,

Solo tienes que hacer este pequeño cambio:
Code: Select all  Expand view  RUN
METHOD LDblClick( nRow, nCol, nFlags ) CLASS TControl

   if ::lDrag
      if ValType( ::bLDblClick ) == "B"
         Eval( ::bLDblClick, nRow, nCol, nFlags )
      endif
      return ::LButtonUp( nRow, nCol, nFlags )
   endif

return Super:LDblClick( nRow, nCol, nFlags )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42161
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Postby quique » Fri Jul 25, 2008 6:11 pm

Gracias Antonio, creo que ya quedó, queda un efecto de que si al combobox le das doble click no pierde el foco al dar click en el say hasta que das un segundo clic, pero creo que ese es problema del combo, porque con los demas controles que probé no tuve problemas.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 31 guests