Get: bChanged doesn't trigger if changed by mouse-menu

Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Wed Jan 14, 2009 2:44 pm

Hi,

if a get-field has been changed, normally the bChanged is being executed. But if you right-click into the field and say "paste", the bChanged doesn't become evaluated.

I tested it with this small sample:

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

function Main()
   LOCAL oDlg, oGet
   SET _3DLOOK ON
   DEFINE DIALOG oDlg TITLE "TGet from " + FWDESCRIPTION
   oGet := TGet():New( 1, 3, , oDlg, 80, 10, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",,,,, .F.,, .F.,, .F.,, .F., .F.,{|| msginfo("get changed")}, .F., .F., .F.,, .F.,,,, )
   @ 2,    4 BUTTON "&Ok" OF oDlg SIZE 30, 12 ACTION oDlg:End()
   @ 2,   12 BUTTON "&Cancel" SIZE 30, 12 OF oDlg ACTION oDlg:End() CANCEL
   ACTIVATE DIALOG oDlg CENTERED
return nil


Is there a particular reason, why it's not evaluated? In FW 16bits there appeared no such problem.
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby Enrico Maria Giordano » Wed Jan 14, 2009 3:11 pm

In the TGet class, the method HandleEvent() should eveluate bChange in case of WM_CUT, WM_PASTE and WM_CLEAR messages.

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8328
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Wed Jan 14, 2009 3:17 pm

As I use the original tGet-Class from FWH808, it should work. But with right-click it doesnt, with CTRL+V it works properly.
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Fri Jan 16, 2009 10:39 am

Antonio,

do you any idea, why with right-click + paste bChange isn't evaluated?
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands


Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Fri Jan 16, 2009 12:51 pm

Enrico,

WM_PASTE is handled. Otherwise CTRL+V wouldn't trigger bChanged.
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands


Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby mmercado » Fri Jan 16, 2009 4:53 pm

Hi Enrico:

Pasting from get rightclicking menu paste option doesn't trigger bChange evaluation, Ctrl + V Does.

FWH 8.12

Regards.

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

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby Enrico Maria Giordano » Fri Jan 16, 2009 6:17 pm

Please look at the HandlEvent method:

Code: Select all  Expand view
      case nMsg == WM_PASTE
           if GetFocus() == ::hWnd
              CallWindowProc( ::nOldProc, ::hWnd, WM_PASTE, 0, 0 )
              ::oGet:buffer = Pad( GetWindowText( ::hWnd ), Len( ::oGet:buffer ) )
              DEFINE CLIPBOARD oClp OF Self FORMAT TEXT
              ::oGet:Pos += Len( oClp:GetText() )
              oClp:End()
              ::oGet:Assign()
           endif   
           return 0


As you can see, bChange is not evaluated when WM_PASTE message is handled. The following change is a possible fix (but I'm not sure what to do with the missing two parameters nKey and nFlags):

Code: Select all  Expand view
      case nMsg == WM_PASTE
           if GetFocus() == ::hWnd
              CallWindowProc( ::nOldProc, ::hWnd, WM_PASTE, 0, 0 )
              ::oGet:buffer = Pad( GetWindowText( ::hWnd ), Len( ::oGet:buffer ) )
              DEFINE CLIPBOARD oClp OF Self FORMAT TEXT
              ::oGet:Pos += Len( oClp:GetText() )
              oClp:End()
              ::oGet:Assign()
              if ::bChange != nil   // EMG
                 Eval( ::bChange, , , Self )   // EMG
              endif   // EMG
           endif   
           return 0


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8328
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Mon Jan 19, 2009 8:33 am

Enrico,

thank you very much! Now it seems to work. For all others who have a similar problem, my corrections in class tget:

1) I added DATA bChanged
2) in methods NEW() and REDEFINE() I added following:
Code: Select all  Expand view
   IF bChanged != NIL
      ::bChanged := bChanged
   ENDIF

3) I added Enricos suggetion in following way:
Code: Select all  Expand view
              if ::bChanged != nil   
                 Eval( ::bChanged )   
              endif
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby Enrico Maria Giordano » Mon Jan 19, 2009 12:20 pm

I don't understand why you need of another change codeblock. Isn't bChange enough?

EMG
User avatar
Enrico Maria Giordano
 
Posts: 8328
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby gkuhnert » Mon Jan 19, 2009 1:44 pm

Enrico,

with my first try it didn't work, so I changed to bChange. Now I tested again and bChange suffices.
Thanks for your support

So I changed (finally) only the method HandleEvent() and it looks like this:

Code: Select all  Expand view
METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TGet

   local oClp

   do case
      case nMsg == WM_CUT
           CallWindowProc( ::nOldProc, ::hWnd, WM_CUT, 0, 0 )
           ::oGet:buffer = Pad( GetWindowText( ::hWnd ), Len( ::oGet:buffer ) )
           DEFINE CLIPBOARD oClp OF Self FORMAT TEXT
           ::oGet:Pos -= Len( oClp:GetText() )
           oClp:End()
           ::oGet:Assign()
           if ::bChange != nil   // **GK
              Eval( ::bChange )   // **GK
           endif //**GK
           return 0

      case nMsg == WM_PASTE
           if GetFocus() == ::hWnd
              CallWindowProc( ::nOldProc, ::hWnd, WM_PASTE, 0, 0 )
              ::oGet:buffer = Pad( GetWindowText( ::hWnd ), Len( ::oGet:buffer ) )
              DEFINE CLIPBOARD oClp OF Self FORMAT TEXT
              ::oGet:Pos += Len( oClp:GetText() )
              oClp:End()
              ::oGet:Assign()
              if ::bChange != nil   // **GK
                 Eval( ::bChange )   // **GK
              endif //**GK
           endif
           return 0

      case nMsg == WM_CLEAR
           CallWindowProc( ::nOldProc, ::hWnd, WM_CLEAR, 0, 0 )
           ::oGet:buffer = Space( Len( ::oGet:buffer ) )
           ::SetPos( 1 )
           ::oGet:Assign()
           if ::bChange != nil   // **GK
              Eval( ::bChange )   // **GK
           endif //**GK
           return 0
   endcase

return Super:HandleEvent( nMsg, nWParam, nLParam )
Best Regards,

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
User avatar
gkuhnert
 
Posts: 274
Joined: Fri Apr 04, 2008 1:25 pm
Location: Aachen - Germany // Kerkrade - Netherlands

Re: Get: bChanged doesn't trigger if changed by mouse-menu

Postby Enrico Maria Giordano » Mon Jan 19, 2009 2:33 pm

Better add Self as the fourth parameter. Please look at my sample above:

Code: Select all  Expand view
Eval( ::bChange, , , Self )


EMG
User avatar
Enrico Maria Giordano
 
Posts: 8328
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia


Return to FiveWin for Harbour/xHarbour

Who is online

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