Francisco
revisando el código, para entender como va el asunto ve lo siguiente:
1.-primero se crea la ventana princiapl,
2.-luego la ventana child,
3.-a continuacion el dialogo es creado, con sus controles, validaciones etc.
4.-luego de creado el dialogo, se procesa cada uno de los controles que contiene el dialogo y se cambia al contenedor padre de cada control, haciendo que el nuevo contenedor padre de cada control sea la ventana child creada previamente.
5.-luego el dialogo es completamente destruido.
quedando la ventana child con los controles, (hasta ahi todo bien aparentemente)
por que en el camino a quedado por ejemplo la validacion del dialogo, la cual se debe pasar a la ventana child,
los say que no son redefinido con id mayor a cero no son tomados en cuenta.
y los say que son pasados a la ventana child qeuda en negrillas (falla en el font).
los controles en la ventana child no responde a ninguna tecla, por lo tanto no queda funcional.(esto es lo mas importante)
continuo revisando.
salu2
carlos vargas
DIALOGS NOWAIT-CLAUSULA VALID
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
- carlos vargas
- Posts: 1721
- Joined: Tue Oct 11, 2005 5:01 pm
- Location: Nicaragua
Re: DIALOGS NOWAIT-CLAUSULA VALID
lo raro es que si definimos directamente controles en la ventana child, estos si responde a las teclas, por lo que se deduce que no es suficiente
con hacer un traslado de parents entre el dialogo y la ventana child.
prueba compilarlo, comentando y descomentando la linea
#define _SIN_DLGCHILD_
con hacer un traslado de parents entre el dialogo y la ventana child.
prueba compilarlo, comentando y descomentando la linea
#define _SIN_DLGCHILD_
Code: Select all | Expand
#include "FiveWin.ch"
#define GW_HWNDFIRST 0
#define GW_CHILD 5
#define GW_HWNDNEXT 2
#define _SIN_DLGCHILD_
/*--------------------------------------------------------------------------------------------------*/
STATIC oWnd
/*--------------------------------------------------------------------------------------------------*/
PROCEDURE Main()
LOCAL oMenu
SET DATE BRIT
SET CENTURY ON
DEFINE WINDOW oWnd MDI TITLE "Ventana Principal" MENU BuildWndMenu()
ACTIVATE WINDOW oWnd ;
ON INIT BuildWndChild() ;
MAXIMIZED ;
VALID MsgNoYes( "¿Desea salir de la ventana principal?", "Salir" )
RETURN
/*--------------------------------------------------------------------------------------------------*/
FUNCTION BuildWndmenu()
LOCAL oMenu
MENU oMenu
MENUITEM "Opcion &1"
MENU
MENUITEM "&Crear ventana Child" ACTION BuildWndChild()
SEPARATOR
MENUITEM "&Fin del programa" ACTION oWnd:end()
ENDMENU
ENDMENU
RETURN oMenu
/*--------------------------------------------------------------------------------------------------*/
PROCEDURE BuildWndChild()
LOCAL oWndChild
DEFINE WINDOW oWndChild ;
TITLE "Ventana Hija" ;
MDICHILD ;
COLOR CLR_BLACK, CLR_CYAN
ACTIVATE WINDOW oWndChild ;
ON INIT BuildDlgChild( oWndChild ) ;
VALID MsgNoYes( "¿Desea salir de la ventana hija?", "Salir" )
oWndChild:aControls[1]:SetFocus()
RETURN
/*--------------------------------------------------------------------------------------------------*/
PROCEDURE BuildDlgChild( oWndChild )
LOCAL oDlgChild, oB
LOCAL nNumero, cNombre, dFecha
nNumero := 100
cNombre := space( 30 )
dFecha := Date()
#ifdef _SIN_DLGCHILD_
@ 010, 020 SAY "Numero:" OF oWndChild PIXEL SIZE 100, 24
@ 035, 020 SAY "Nombre:" OF oWndChild PIXEL SIZE 100, 24
@ 060, 020 SAY "Fecha:" OF oWndChild PIXEL SIZE 100, 24
@ 010, 200 GET nNumero PICTURE "9999" OF oWndChild PIXEL SIZE 140, 24
@ 035, 200 GET cNombre PICTURE "@!" OF oWndChild PIXEL SIZE 140, 24
@ 060, 200 GET dFecha PICTURE "@D" OF oWndChild PIXEL SIZE 140, 24
@ 085, 200 BUTTON oB PROMPT "Sa&lir" OF oWndChild PIXEL SIZE 140, 24 ACTION oWndChild:End()
#else
DEFINE DIALOG oDlgChild OF oWndChild NAME "DLG_CHILD"
REDEFINE GET nNumero ;
ID 101 OF oDlgChild ;
PICTURE "9999"
REDEFINE GET cNombre ;
ID 102 OF oDlgChild ;
PICTURE "@!"
REDEFINE GET dFecha ;
ID 103 OF oDlgChild ;
PICTURE "@D"
REDEFINE BUTTON ;
ID 201 OF oDlgChild ;
ACTION oWndChild:End()
ACTIVATE DIALOG oDlgChild ;
NOWAIT ;
ON INIT ChangeParent( oDlgChild, oWndChild )
oDlgChild:End()
#endif
RETURN
/*--------------------------------------------------------------------------------------------------*/
PROCEDURE ChangeParent( oDlg, oChild )
LOCAL n
LOCAL hCtrl
LOCAL aChilds
hCtrl := GetWindow( oDlg:hWnd, GW_CHILD )
aChilds := {}
FOR n = 1 TO Len( oDlg:aControls )
AAdd( oChild:aControls, oDlg:aControls[ n ] )
NEXT
WHILE hCtrl != 0
AAdd( aChilds, hCtrl )
hCtrl := GetWindow( hCtrl, GW_HWNDNEXT )
END
AEval( aChilds, { |h| SetParent( h, oChild:hWnd ) } )
oChild:SetSize( oDlg:nWidth, oDlg:nHeight )
RETURN
/*--------------------------------------------------------------------------------------------------*/
Code: Select all | Expand
// Generated by ResEdit 1.5.11
// Copyright (C) 2006-2012
// http://www.resedit.net
#include <winresrc.h>
#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#define IDC_STATIC (-1)
//
// Dialog resources
//
DLG_CHILD DIALOG 0, 4294967267, 167, 88
STYLE DS_CENTER | DS_SETFONT | WS_VISIBLE | WS_CHILDWINDOW | WS_SYSMENU
FONT 10, "MS Sans Serif"
{
EDITTEXT 101, 77, 7, 60, 12, ES_RIGHT | ES_AUTOHSCROLL
EDITTEXT 102, 77, 21, 60, 12, ES_AUTOHSCROLL
EDITTEXT 103, 77, 35, 60, 12, ES_AUTOHSCROLL
PUSHBUTTON "&Salir", 201, 77, 49, 60, 16, BS_CENTER
LTEXT "Crédito número", 301, 7, 7, 65, 8, SS_LEFT
LTEXT "Nombre de cliente", 302, 7, 21, 65, 8, SS_LEFT
LTEXT "Fecha del credito", 303, 7, 35, 65, 8, SS_LEFT
}
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Carlos Vargas
Desde Managua, Nicaragua (CA)
- FranciscoA
- Posts: 2163
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: DIALOGS NOWAIT-CLAUSULA VALID
Hola Carlos.
Comprobado. Si usamos el ChangeParent(), no funcionan las teclas ENTER nI TAB, pero si declaramos los gets en la Child si trabajan.
Seguiré investigando, pués me interesa esta técnica.
Por otro lado, te comento que he resuelto mi problema, utilizando únicamente la function SetParent(oDlg:hWnd,oChild:hWnd), como podrás ver en el ejemplo siguiente. Vale mencionar que se pierde un poquito de estética en los bordes del dialog incrustado sin Caption. La secuencia que seguí, y que me funciona perfectamente (hasta el momento, ya que estoy haciendo pruebas exhaustivas para evitar cualquier "resbalón"), es la siguiente:
(me gustaría que la probaras y me dices)
Seguiremos investigando la otra técnica, y estaremos en contacto.
Muchas gracias por tu amabilidad.
Saludos.
Comprobado. Si usamos el ChangeParent(), no funcionan las teclas ENTER nI TAB, pero si declaramos los gets en la Child si trabajan.
Seguiré investigando, pués me interesa esta técnica.
Por otro lado, te comento que he resuelto mi problema, utilizando únicamente la function SetParent(oDlg:hWnd,oChild:hWnd), como podrás ver en el ejemplo siguiente. Vale mencionar que se pierde un poquito de estética en los bordes del dialog incrustado sin Caption. La secuencia que seguí, y que me funciona perfectamente (hasta el momento, ya que estoy haciendo pruebas exhaustivas para evitar cualquier "resbalón"), es la siguiente:
(me gustaría que la probaras y me dices)
Code: Select all | Expand
LOCAL oChild, bSalida, cTitle :="MyTitle"
DEFINE WINDOW oChild TITLE cTitle MDICHILD COLOR 0, GetSysColor()
DEFINE DIALOG oDlg RESOURCE "CREDITOS" OF oChild TITLE cTitle
REDEFINE SAY ID 4013 OF oDlg FONT oFont3
REDEFINE GET oFecha VAR dFecha ID 150 OF oDlg ;
VALID ...
...
...
REDEFINE BUTTONBMP oBt3 ID 310 OF oDlg BITMAP "SALIR" TEXTRIGHT ;
ACTION oDlg:End() CANCEL
bSalida := {|| oFont1:End() ,;
oFont2:End() ,;
oFont3:End() ,;
etc,etec....() }
ACTIVATE DIALOG oDlg CENTERED NOWAIT ;
VALID if(!GetKeyState( VK_ESCAPE ),( oChild:End() ,.T. ), .F.) ; //Este valid sería solo .T., si usamos el dialog sin CAPTION
ON INIT ( oDlg:SetSize(nWidthRes,nHeightRes-112), oDlg:Move(0,0) ,;
SetParent(oDlg:hWnd,oChild:hWnd,.t.) )
ACTIVATE WINDOW oChild ; //MAXIMIZED ;
VALID if(!GetKeyState( VK_ESCAPE ),( Eval(bSalida), .T. ), .F.) ;
ON INIT oChild:SetSize(oDlg:nWidth,oDlg:nHeight)
RETURN NIL
Seguiremos investigando la otra técnica, y estaremos en contacto.
Muchas gracias por tu amabilidad.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
- FranciscoA
- Posts: 2163
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: DIALOGS NOWAIT-CLAUSULA VALID
VALID if(!GetKeyState( VK_ESCAPE ),( oChild:End() ,.T. ), .F.) ; //Este valid sería solo .T., si usamos el dialog sin CAPTION
Corrijo: El valid debe usarse completo en cualquier caso.
Sorry.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
- Rick Lipkin
- Posts: 2668
- Joined: Fri Oct 07, 2005 1:50 pm
- Location: Columbia, South Carolina USA
Re: DIALOGS NOWAIT-CLAUSULA VALID
Francisco
Consider this code .. notice the the variable lClosed is the key in trapping the valid close. Note that oWndChild:End() trips the valid close just like X on the window close.
Rick Lipkin
Consider this code .. notice the the variable lClosed is the key in trapping the valid close. Note that oWndChild:End() trips the valid close just like X on the window close.
Rick Lipkin
Code: Select all | Expand
Local lCLosed
Local lOk
lCLosed := .f.
lOk := .f.
cTITLE := "System Params "
DEFINE ICON oICO RESOURCE "CONFIG"
DEFINE WINDOW oWndChild ;
MDICHILD ;
FROM 0,1 to 38,90 ;
NOMINIMIZE ;
ICON oIco ;
NOZOOM ;
OF oWndMain ;
TITLE cTITLE
DEFINE DIALOG oGRPS RESOURCE "OWNER" ;
of oWndChild
... some says, gets and browses
REDEFINE BTNBMP oBTN1 ID 141 of oGRPS ; // ok
RESOURCE "OK", "DOK", "DOK" ;
PROMPT " &Ok " LEFT 2007;
ACTION ( lOK := _busrules(cOwner,oOwner) ), ;
IF(lOK = .T., oWndChild:END(), ))
REDEFINE BTNBMP oBTN2 ID 142 of oGRPS ; // cancel
RESOURCE "CANCEL", "DCANCEL", "DCANCEL" ;
PROMPT "&Cancel " LEFT 2007;
ACTION ( lOK := .F., oWndChild:END() )
ACTIVATE DIALOG oGRPS NOWAIT ;
ON INIT ( oGRPS:Move( 0, 0 )) ;
VALID(!GETKEYSTATE( 27 ))
ACTIVATE WINDOW oWndChild ;
ON INIT ( oGrps:Move( 0,0, oWndchild:nWidth, oWndchild:nHeight, .T. ), ;
oWndChild:bResized := {|| oGrps:SetSize( oWndChild:nWidth, oWndChild:nHeight, .t. )}, ;
oGrps:refresh(.t.));
VALID ( IIF( !lCLOSED, ExitPgm( .T.,oRsOwn,@lClosed,oFontB ) , .F. )) // <-- here
RETURN( lOK )
//-----------------------
Static FUNCTION ExitPgm( lCLEAN,oRsOwn,lClosed,oFontB )
IF lCLEAN = .T.
lCLOSED := .T.
oRsOwn:Close()
// close databases .. cleanup
RELEASE oFontB
oRsOwn := NIL
ENDIF
RETURN( lCLOSED )
- FranciscoA
- Posts: 2163
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: DIALOGS NOWAIT-CLAUSULA VALID
Rick.
I have adapted your code on one module of my program and it's working.
Thank you very much.
Regards.
I have adapted your code on one module of my program and it's working.
Thank you very much.
Regards.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh-MySql-TMySql
Chinandega, Nicaragua.
Fwxh-MySql-TMySql