Problem with Escape key and dialog on MDI child

Post Reply
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Problem with Escape key and dialog on MDI child

Post 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 | Expand

  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 | Expand

  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 
User avatar
Rick Lipkin
Posts: 2668
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Problem with Escape key and dialog on MDI child

Post by Rick Lipkin »

Gale

You are close ... add this to your ON INIT move ....

Code: Select all | Expand

ON INIT ( oDlg:Move( 0,0, oWndChildA:nWidth, oWndChildA:nHeight, .T. ), ; 


This ties the Dialog to the child ..

Rick Lipkin
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Re: Problem with Escape key and dialog on MDI child

Post by Gale FORd »

i will try that but how does that relate to problem pressing escape key?
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Re: Problem with Escape key and dialog on MDI child

Post 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 | Expand

// 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 maximizedreturn 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() }//----------------------------------------------------------------------------// 
User avatar
Rick Lipkin
Posts: 2668
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Problem with Escape key and dialog on MDI child

Post by Rick Lipkin »

Gale

This is my code for MdiChild

Code: Select all | Expand

      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 findoInvt:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. ) // <----------------frame and dialog link// dialog controlsoInvt:bResized = { | nSizeType, nWidth, nHeight | _ResizeControls1( nSizeType, nWidth, nHeight, oInvt )  }Return(nil)//---------------------------------------Static Func _ResizeControls1( nSizeType, nWidth, nHeight, oDlg )// for inventory findif nSizeType = 0 //SIZE_MAXIMIZED         //37              //277   oDlg:aControls[ 1  ]:SetSize( nWidth - 37, nHeight - 185 ) //txbrowseendifReturn(nil) 


My Error ... see this code in _ReSizeUm1() ...

Code: Select all | Expand

oInvt:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. ) 


Place the above in your ON INIT code


Rick Lipkin
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Re: Problem with Escape key and dialog on MDI child

Post 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.
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Re: Problem with Escape key and dialog on MDI child

Post 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.
User avatar
Rick Lipkin
Posts: 2668
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Problem with Escape key and dialog on MDI child

Post by Rick Lipkin »

Gale

Code: Select all | Expand

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

Code: Select all | Expand

VALID(!GETKEYSTATE( 27 )) 

On the dialog to keep ESC from firing ..

Rick Lipkin
Gale FORd
Posts: 663
Joined: Mon Dec 05, 2005 11:22 pm
Location: Houston
Contact:

Re: Problem with Escape key and dialog on MDI child

Post 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.
Post Reply