Antonio,
I upgrade to FWH 2.7 to use with xHB comercial due to the _hbstack bug and I found any fixed bugs from 2.6 that came back.
I'll be glad if you can review this issues:
AnsiUpper() function:
In any cases AnsiUpper generate a GPF (I tested under XP) and our app
crash (but in any way stay running because the exe can't be erased), we
must restart computer...
---------------------------------------
TOutLook.prg:
Bug:
The first time we click in button your action isn't fired. We must
click button a second time.
Possible solution:
In method ADDITEM comment the lines:
oBmp:bMMoved := ...
oBmp:blButtonUp := ...
----------------------------
On change (TGET class) bug:
bChange don't consider last character typed in oGet object. In other words
the buffer is updated with one character of "delay"
Working sample:
Code:
#include "FiveWin.ch"
function Main()
local oDlg
local cVar := space(40)
local oGet
DEFINE DIALOG oDlg TITLE "Just a get"
@ 2, 2 SAY "Text:" OF oDlg
@ 2, 6 GET oGet VAR cVar OF oDlg
oGet[2]:bChange := {|| oGet:Assign(), oDlg:SetText(oGet:cText) }
@ 3, 7 BUTTON "&Ok" OF oDlg SIZE 30, 12 ACTION oDlg:End()
@ 3, 16 BUTTON "&Cancel" SIZE 30, 12 OF oDlg ACTION oDlg:End() CANCEL
ACTIVATE DIALOG oDlg CENTERED
return nil
Possible solution (thanks to Rossine):
Code:
METHOD KeyChar( nKey, nFlags ) CLASS TGet
This code is placed on wrong place:
if ::bChange != nil
lAccept = Eval( ::bChange, nKey, nFlags, Self )
if ValType( lAccept ) == "L" .and. ! lAccept
return 0
endif
endif
The correct place if before otherwise clause at end of method
METHOD KeyChar( nKey, nFlags ) CLASS TGet
(...)
if ::oGet:TypeOut
if ! Set( _SET_CONFIRM )
::oWnd:nLastKey = VK_RETURN
::oWnd:GoNextCtrl( ::hWnd )
else
if Set( _SET_BELL )
MsgBeep()
endif
endif
endif
// Rossine
if ::bChange != nil
lAccept = Eval( ::bChange, nKey, nFlags, Self )
if ValType( lAccept ) == "L" .and. ! lAccept
return 0
endif
endif
// Rossine
Eval( ::bPostKey, Self, ::oGet:Buffer )
otherwise
return Super:KeyChar( nKey, nFlags )
endcase
return 0
---------------------------------
Suggestion:
We have any problems to create/activate dialogs with valid/init into classes
because in .ch files the name Self is used. See this sample
METHOD MyMethod CLASS MyClass
define dialog ::oDlg ...
activate dialog ::oDlg nomodal valid ::MyValid()
(...)
The activate code will conflict with Self name, see the PPO:
::oDlg:Activate(::oDlg:bLClicked,::oDlg:bMoved,::oDlg:bPainted,.T.,,! .T. ,{|Self|::MyValid()},::oDlg:bRClicked,,)
"valid ::MyValid()" turn into "{|Self|::MyValid()}"
We suggest change Self to This into .ch files
--------------------------------------------------------------------
A little suggestion to .ch too: Include clause PICT like Clipper:
[ <pict:PICT,PICTURE> <cPicture> ]
-------------------------------------------------------------------
Another suggest to .ch: DEFAULT command:
#xcommand DEFAULT <uVar1> := <uVal1> ;
[, <uVarN> := <uValN> ] => ;
if( <uVar1> == nil, <uVar1> := <uVal1>, ) ;;
[ if( <uVarN> == nil, <uVarN> := <uValN>, ); ]
This translated declararion:
DEFAULT x := 1
if(x == nil, x == 1, )
Appears to be more efficient that:
x := if(x == nil, x == 1, x)
Because assign a value to variable only when value is nil