Hola,
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:
y comprobando el código fuente la clase tget he visto que comentando la llamada a ::KeyChar() del método KeyChar se evita que se ejecute dos veces el valid:
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:
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:
@ 0, 0 Get oGet Var cVar Of oDlg Size 50, 12y comprobando el código fuente la clase tget he visto que comentando la llamada a ::KeyChar() del método KeyChar se evita que se ejecute dos veces el valid:
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:
#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.Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
Fernando González Diez
ALSIS Sistemas Informáticos