DIALOGS NOWAIT-CLAUSULA VALID

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby carlos vargas » Wed Dec 05, 2012 7:16 pm

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
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1707
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby carlos vargas » Wed Dec 05, 2012 7:41 pm

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_

Code: Select all  Expand view

#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 view

// 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)
User avatar
carlos vargas
 
Posts: 1707
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Wed Dec 05, 2012 11:38 pm

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)

Code: Select all  Expand view
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
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Thu Dec 06, 2012 1:31 am

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
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby Rick Lipkin » Thu Dec 06, 2012 2:48 pm

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

Code: Select all  Expand view


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 )

 
User avatar
Rick Lipkin
 
Posts: 2658
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Fri Dec 07, 2012 1:07 pm

Rick.
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
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 16 guests