En el ejemplo que muestro mas abajo se define una ventana mdi child y dentro de ella incrustado una barra de botones, una barra outlook 2003, un splitter y un dialogo.
El problema viene a al pulsar la tecla "ESC", esta hace que se evalue 2 veces el valid de la ventana mdi child.
En el dialogo hay un get:
- Code: Select all Expand view RUN
@ 0, 0 Get oGet Var cVar Of oDlg Size 50, 12
y comprobando el código fuente la clase tget he visto que comentando la llamada a ::oWnd:KeyChar() del método KeyChar se evita que se ejecute dos veces el valid:
- Code: Select all Expand view RUN
METHOD KeyChar( nKey, nFlags ) CLASS TGet
...
if nKey == VK_ESCAPE // avoids a beep!
// ::oWnd:KeyChar( nKey, nFlags )
return 1
endif
...
Ya me imagino que no es la solución correcta, sobre todo porque si en el ejemplo se quita la línea del get, osea se deja la definición del dialogo sin nada dentro de él, sigue ejecutando 2 veces el valid de la ventana.
Ejemplo:
- Code: Select all Expand view RUN
#include 'Fivewin.ch'
#include "Splitter.ch"
Procedure Main()
local oWndMain, oMenu
Define Window oWndMain Title "Ventana principal" Mdi
Set Message To "" Keyboard Clock Date Of oWndMain 2007
MENU oMenu 2007
MENUITEM '&Child' MESSAGE 'Ventana child' Action ps_Child( oWndMain )
ENDMENU
oWndMain:SetMenu( oMenu )
Activate Window oWndMain MAXIMIZED;
Valid msgnoyes('¿Abandonar el programa?', 'Salir')
return
*---------------------------------------------------------------------
static Procedure ps_Child( oWndMain )
local oWnd, oBar, oBtn1, oBtn2
Define Window oWnd MdiChild Title 'Ventana child' of oWndMain
Set Message To "" Of oWnd 2007
Define ButtonBar oBar Size 50, 45 Of oWnd 2007
Define Button oBtn1 Of oBar Prompt 'Otro' TOP
Define Button oBtn2 Of oBar Prompt 'Edit' TOP
Activate Window oWnd On Init ps_Init(oWnd, oBar) Valid .F.
return
*---------------------------------------------------------------------
static procedure ps_Init( oWnd, oBar )
local oDlg, oGet, cVar, oOutLook, aRect, oSplit
local nWidth, nHeight
Define Dialog oDlg Of oWnd TRANSPARENT STYLE nOR( WS_CHILD, WS_VISIBLE )
@ 0, 0 Get oGet Var cVar Of oDlg Size 50, 12
Define OutLook2003 oOutLook Of oWnd PROMPTS "Accesos"
oWnd:oLeft := NIL
aRect := oOutLook:aDialogs[ 1 ]:GetCliRect()
@ 0, aRect:nRight SPLITTER oSplit ;
VERTICAL _3DLOOK ;
PREVIOUS CONTROLS oOutLook ;
HINDS CONTROLS oDlg ;
SIZE 4, oWnd:nHeight - 70 PIXEL ;
OF oWnd
ACTIVATE DIALOG oDlg NoWait Valid oWnd:End()
oWnd:bResized := {|| oSplit:AdjClient(), oOutlook:refresh(.t.) }
oDlg:Move( 0, oSplit:nRight,,, .F. )
nWidth := oDlg:nWidth
nWidth += oOutLook:nWidth
nWidth += oSplit:nWidth
nHeight := oDlg:nHeight
nHeight += oBar:nHeight
nHeight += oWnd:oMsgBar:nHeight
oWnd:SetSize(nWidth, nHeight, .F.)
oWnd:bResized := {|| oSplit:AdjClient(), oDlg:SetSize( oWnd:nWidth - oOutLook:nWidth - oSplit:nWidth - 8, oSplit:nHeight - 1, .t. ),;
oDlg:refresh(.t.), oOutlook:refresh(.t.) }
oWnd:bValid := {|| ps_Salir()}
return
*---------------------------------------------------------------------
static function ps_Salir()
msginfo('1')
return .T.