FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour Get: bChanged doesn't trigger if changed by mouse-menu
Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Wed Jan 14, 2009 02: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:

#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
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Wed Jan 14, 2009 03:11 PM

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

EMG

Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Wed Jan 14, 2009 03: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
Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: 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
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Fri Jan 16, 2009 12:16 PM

Please reread my message above.

EMG

Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: 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
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Fri Jan 16, 2009 02:34 PM

Did you try?

EMG

Posts: 782
Joined: Wed Dec 19, 2007 07:50 AM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Fri Jan 16, 2009 04: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
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Fri Jan 16, 2009 06:17 PM
Please look at the HandlEvent method:

      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):

      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
Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Mon Jan 19, 2009 08: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:
	IF bChanged != NIL
		::bChanged := bChanged
	ENDIF

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

Gilbert Kuhnert
CTO Software GmbH
http://www.ctosoftware.de
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Mon Jan 19, 2009 12:20 PM

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

EMG

Posts: 274
Joined: Fri Apr 04, 2008 01:25 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Mon Jan 19, 2009 01: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:

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
Posts: 9022
Joined: Thu Oct 06, 2005 08:17 PM
Re: Get: bChanged doesn't trigger if changed by mouse-menu
Posted: Mon Jan 19, 2009 02:33 PM
Better add Self as the fourth parameter. Please look at my sample above:

Eval( ::bChange, , , Self )


EMG

Continue the discussion