Page 1 of 1
Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 3:37 pm
by Gale FORd
I am having trouble fixing a problem when a user presses escape key on a MDI child window with dialog.
Either the dialog box closes and leaves and empty MDI child or I have problems with valid or disappearing menu.
I went back to basics and looked at sample testmdi4.prg
I found another reference in this forum about using GETKEYSTATE( VK_ESCAPE ) on the valid clause of activate dialog.
After some trial and error i have the following issue.
If I use a counter it seems the valid is called multiple times with 1 escape key press.
I wanted to try setting the valid to .t. if the escape key is pressed 2 times but remain if the escape key is pressed only 1 time.
I added the following valid clause with the counter checked for < 2 escape key pressed to return .f.. Unfortunately with 1 escape key press the dialog is closed code and the mdi child remains.
Code: Select all
local nCounter := 0 // Added to top of function child()
ACTIVATE DIALOG oDlg NOWAIT ; // It has to be NonModal --> NOWAIT clause
ON INIT oDlg:Move( 0, 0 ) ;
VALID ( if( GETKEYSTATE( VK_ESCAPE ), nCounter++, nil ), ;
tracelog( GETKEYSTATE( VK_ESCAPE ), nCounter ), ;
if( GETKEYSTATE( VK_ESCAPE ) .and. nCounter < 2, .f. , .t. ) )
If I change the counter to return .f. if counter < 3. Now 1 escape key press and the dialog stays, The 2nd escape key press and the dialog closes with mdi window remaining.
The tracelog shows nCounter reached a total of 3. Somehow the valid clause is evaluated twice during the 1st escape key press.
Code: Select all
local nCounter := 0 // Added to top of function child()
ACTIVATE DIALOG oDlg NOWAIT ; // It has to be NonModal --> NOWAIT clause
ON INIT oDlg:Move( 0, 0 ) ;
VALID ( if( GETKEYSTATE( VK_ESCAPE ), nCounter++, nil ), ;
tracelog( GETKEYSTATE( VK_ESCAPE ), nCounter ), ;
if( GETKEYSTATE( VK_ESCAPE ) .and. nCounter < 3, .f. , .t. ) ) // Changed to check for 3 times
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 4:22 pm
by Rick Lipkin
Gale
You are close ... add this to your ON INIT move ....
Code: Select all
ON INIT ( oDlg:Move( 0,0, oWndChildA:nWidth, oWndChildA:nHeight, .T. ), ;
This ties the Dialog to the child ..
Rick Lipkin
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 6:01 pm
by Gale FORd
i will try that but how does that relate to problem pressing escape key?
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 6:19 pm
by Gale FORd
That did not work at all. In the sample testmdi4.prg there was code after the activate dialog that sizes the window to match the dialog.
Still the escape problem persists.
I have included the full modified testmdi4.prg
You will need the testmdi4.rc from the samples folder to run.
If you press the escape key 1 time the dialog goes away but the child window remains.
With the valid code it should at least stop the 1st time escape key press.
Code: Select all
// This is an example of how to place controls inside a MDIChild
// from resources
// 5/9/2005 1:28PM: Updated by James Bott, jbott@compuserve.com
#include "FiveWin.ch"
static oWnd
//----------------------------------------------------------------------------//
function Main()
local oBar
SET _3DLOOK ON
DEFINE WINDOW oWnd TITLE "MDIChilds from resources" MDI
DEFINE BUTTONBAR oBar _3D OF oWnd
DEFINE BUTTON OF oBar ACTION child() //( Child(), MsgInfo( oWnd:oWndClient:aWnd[ 1 ]:cCaption ) )
ACTIVATE WINDOW oWnd maximized
return nil
//----------------------------------------------------------------------------//
function Child()
local oWndChild, oDlg, oBtn, n
local cName := "Testing..."
local lExit := .f., nCounter := 0
DEFINE WINDOW oWndChild MDICHILD OF oWnd ;
FROM 5,5 TO 6,6;
COLOR "N/W" ;
border none nomaximize nominimize // prevent resizing
oWndChild:bGotFocus = { || oDlg:SetFocus() }
DEFINE DIALOG oDlg RESOURCE "Child1" OF oWndChild
REDEFINE GET cName ID 110 OF oDlg
REDEFINE BUTTON oBtn ID 120 OF oDlg ;
ACTION ( MsgInfo( "First" ), oBtn:SetFocus() )
REDEFINE BUTTON ID 130 OF oDlg ACTION MsgInfo( "Second" )
for n = 1 to Len( oDlg:aControls )
oDlg:aControls[ n ]:bLClicked = GenBlock( oWndChild, oDlg:aControls[ n ] )
next
ACTIVATE DIALOG oDlg NOWAIT ; // It has to be NonModal --> NOWAIT clause
ON INIT oDlg:Move( 0,0 ) ;
VALID ( if( GETKEYSTATE( VK_ESCAPE ), nCounter++, nil ), ;
tracelog( GETKEYSTATE( VK_ESCAPE ), nCounter ), ;
if( GETKEYSTATE( VK_ESCAPE ) .and. nCounter < 2, .f. , .t. ) ) // Changed to check for 3 times
// ON INIT oDlg:Move( 0,0, oWndChild:nWidth, oWndChild:nHeight, .T. ) ; // this did not work because of the code below.
// Correct window size to match dialog
oWndChild:nWidth := oDlg:nWidth+7
oWndChild:nHeight := oDlg:nHeight+32
ACTIVATE WINDOW oWndChild ON INIT oWnd:paint()
return nil
//----------------------------------------------------------------------------//
function GenBlock( oWndChild, oControl )
return { || oWndChild:SetFocus(), oControl:SetFocus() }
//----------------------------------------------------------------------------//
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 8:25 pm
by Rick Lipkin
Gale
This is my code for MdiChild
Code: Select all
ACTIVATE DIALOG oInvt NOMODAL ;
ON INIT( If( lViewQuery = .t., oQuery:Show(),oQuery:Hide() ),;
_Hidum( cMode,oBtn2,oBtn3,oBtn4),oVnum:SetFocus() );
VALID(!GETKEYSTATE( 27 ))
ACTIVATE WINDOW oWndChildA ;
ON INIT ( oInvt:Move( 0,0, oWndChildA:nWidth, oWndChildA:nHeight, .T. ), ;
oWndChildA:bResized := {|| _ReSizeUm1( oInvt,oWndChildA ) }, ;
oInvt:refresh(.t.));
VALID ( IIF( !lOK3, _ExitPgm3(.T.,oWndChildA,oRsVeh,oLbx,@lOk3,oFontB), .F. ))
//-----------------------------------
Static Func _ReSizeUm1( oInvt,oWndChild )
// for inventory find
oInvt:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. ) // <----------------frame and dialog link
// dialog controls
oInvt:bResized = { | nSizeType, nWidth, nHeight | _ResizeControls1( nSizeType, nWidth, nHeight, oInvt ) }
Return(nil)
//---------------------------------------
Static Func _ResizeControls1( nSizeType, nWidth, nHeight, oDlg )
// for inventory find
if nSizeType = 0 //SIZE_MAXIMIZED //37 //277
oDlg:aControls[ 1 ]:SetSize( nWidth - 37, nHeight - 185 ) //txbrowse
endif
Return(nil)
My Error ... see this code in _ReSizeUm1() ...
Code: Select all
oInvt:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. )
Place the above in your ON INIT code
Rick Lipkin
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 9:05 pm
by Gale FORd
Sure but you cannot use escape key to close window.
I was just hoping that there was a fix for the escape key problem.
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 9:36 pm
by Gale FORd
Is there something about changing the size of the dialog you think will fix the escape key problem?
You keep referring to setsize() as the fix but I don't see where that relates to my problem, unless i am missing something.
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 9:56 pm
by Rick Lipkin
Gale
Code: Select all
oInvt:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. ) // <----------------frame and dialog link
This code links the dialog to the mdi frame .. this will keep ESC from closing and leaving the mdi frame visible .. I add
On the dialog to keep ESC from firing ..
Rick Lipkin
Re: Problem with Escape key and dialog on MDI child
Posted: Tue Sep 19, 2017 10:09 pm
by Gale FORd
I have no problem keeping dialog from closing.
I was just trying to incorporate the escape key and fix some bugs that crop up as a result.
I guess there is no way to make MDI child with dialog work reliably with escape key.
Oh well.