DIALOGS NOWAIT-CLAUSULA VALID

DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Sat Dec 01, 2012 1:15 am

Buenas noches, amigos en el foro.
He trabajado usando WINDOWS MDICHILD sin problemas. Pero ahora, en un nuevo proyecto, se hace necesario trabajar con DIALOG NOWAIT, siempre en ambiente MDI.

Utilizo DBFs temporales para ciertas consultas, las que creo en una carpeta en C:\. Ahora bien, con Window MdiChild funciona bien la eliminación de estas temporales, sea ya que el usuario cerró la winchild directamente, o la tenia minimizada y cerró el programa. Este comportamiento no es el mismo con Dialogs NOWAIT: si el usuario cierra el dialog, se borra la temporal, pero si no tiene el cuidado de cerrarlo y cierra el programa, las temporales se quedan colgadas. Es decir, si se cierra el programa y habian dialogs abiertos, no se evalúa la cláusula VALID del dialog.

Entonces, mi pregunta es: ¿Cómo hacer para que se ejecute el VALID en los dialogs NOWAIT al cerrar el programa, a como lo hacen las MDICHILDS, y poder borrar las temporales?

Aqui pongo un trozo de codigo de como lo estoy haciendo.

Agradezco, de antemano, cualquier sugerencia o ayuda.
Code: Select all  Expand view  RUN
Static oWnd
//----------------------------
Function Main()
DEFINE WINDOW oWnd MDI  TITLE "MyTitle"
DEFINE BUTTONBAR oBar OF oWnd SIZE 60, 64
DEFINE BUTTON  PROMPT "Créditos"  OF oBar  ACTION Creditos()
...
ACTIVATE WINDOW oWnd MAXIMIZED ;
    VALID  MsgNoYes("¿En realidad desea salir?","Salir")
Return nil

//----------------------------
Function Creditos()
local oDlg, cSitPTMO:="SITUAC"
LOCAL cDrivDirTemp := "C:\TEMPORALES\"

DbUseArea(.t.,, "
Creditos","Creditos",.t.)
copy struct to cDrivDirTemp+(cSitPTMO)

dbUseArea(.t.,,cDrivDirTemp+(cSitPTMO),(cSitPTMO), .F.)

DEFINE DIALOG oDlg OF oWnd RESOURCE "
CREDITOSCONSUL"
ACTIVATE DIALOG oDlg CENTERED  NOWAIT ;
     VALID( (cSitPTMO)->(dbCloseArea()) ,;
            Ferase(cDrivDirTemp+(cSitPTMO)+"
.dbf") ,;
            dbSelectArea(cOldSele), .T. )
Return nil

Saludos.
Last edited by FranciscoA on Sat Dec 01, 2012 1:23 pm, edited 1 time in total.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby horacio » Sat Dec 01, 2012 12:01 pm

No sé si esto es lo que buscas pero se me ocurre que cuando el usuario hace click fuera del dialogo el mismo se cierre con el método bLostFocus, oDlg : bLostFocus := { || oDlg : End() }, de esta manera se ejecutaría el valid.

Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Sat Dec 01, 2012 1:37 pm

Horacio, gracias por responder.
Lo que quiero hacer es que si el usuario tiene abiertos dialogs NOWAIT y cierra el programa, que se ejecuten las VALID de cada uno de ellos.
Ya probé con tu sugerencia, y nada. ¿Alguien mas?
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby Rick Lipkin » Sat Dec 01, 2012 2:38 pm

Francisco

Take a look at the sample \samples\adorick.prg .. shows how to trap a valid with a variable and then eval that variable to close the child and clean up your data.

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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby csincuir » Sat Dec 01, 2012 2:46 pm

Francisco,
No lo he probado, pero de repente te puede servir este codigo:

Code: Select all  Expand view  RUN

..
ACTIVATE DIALOG oDlg CENTERED  NOWAIT ;
     VALID Salida( cSitPTMO, cOldSele )
Return nil

///-------------------------------------------
FUNCTION Salida( cSitPTMO, cOldSele )

   if getkeystate( VK_ESCAPE )
      Return( .f. )
   endif
   
  (cSitPTMO)->(dbCloseArea())
  Ferase(cDrivDirTemp+(cSitPTMO)+".dbf")
  dbSelectArea(cOldSele)
return .T.
//...-------------------------
 


Saludos.

Carlos.
csincuir
 
Posts: 408
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Sat Dec 01, 2012 3:57 pm

Carlos.
Muchas gracias. No funcionó.
Saludos.

Rick.
Many thanks. I'll take a look at your code.
Best regards.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Sat Dec 01, 2012 4:26 pm

Rick.

"Suddenly I lit the candle":
As I'm stopping the. Exe to run more than 1 time, and temporary files are placed in "c: \ temporary \", I see nothing wrong in using the following code, when I close the program (Main Window).

What you say about this?

/ / -------------------- / /
Function DelTempFiles()
Local aDirectorio: = DIRECTORY (cDrivDirTemp + "*. *", "D")
   AEVAL (aDirectorio, {| aFich | FERASE (cDrivDirTemp + aFich [F_Name])})
   SysRefresh ()
Return nil

Best Regards
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby csincuir » Sat Dec 01, 2012 4:39 pm

Francisco,
Si no funciono con el dialogo, entonces prueba con la ventana principal haber si ahora si funciona:

Code: Select all  Expand view  RUN

//----------------------------
Function Main()
DEFINE WINDOW oWnd MDI  TITLE "MyTitle"
DEFINE BUTTONBAR oBar OF oWnd SIZE 60, 64
DEFINE BUTTON  PROMPT "Créditos"  OF oBar  ACTION Creditos()
...
ACTIVATE WINDOW oWnd MAXIMIZED ;
    VALID  CierraSistema()

Return nil

//-----------------------------
Function CierraSistema()
LOCAL cDrivDirTemp := "C:\TEMPORALES\"

  If !MsgNoYes("
¿En realidad desea salir?","Salir")
     Return .f.
  End

  dbCloseAll()
  Ferase(cDrivDirTemp+"
*.dbf")

Return .t.

//-----------------------------


Saludos.

Carlos.
csincuir
 
Posts: 408
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Sat Dec 01, 2012 5:47 pm

Carlos

Gracias. Precisamente asi es como lo estoy haciendo, con la salvedad de que uso *.* porque tambien tengo ahí los .CDX correspondientes.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby MarioG » Mon Dec 03, 2012 11:55 am

Francisco;
Si mal no interpreto creando EXIT PROCEDURE TuSalida(), en el Main(), cierre como cierre siempre evalúa este procedimiento
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
MarioG
 
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby RSalazarU » Mon Dec 03, 2012 1:34 pm

Francisco:

Yo lo hago asi
Code: Select all  Expand view  RUN

      ::oDlg:bValid = {|| ::_lValid() }

      ACTIVATE WINDOW ::oDlg
 


en tu caso
Code: Select all  Expand view  RUN

DEFINE DIALOG oDlg OF oWnd RESOURCE "CREDITOSCONSUL"

oDlg:bValid = {|| ... }  //<---- traslada aca tu VALID

ACTIVATE DIALOG oDlg CENTERED  NOWAIT ;
     VALID( (cSitPTMO)->(dbCloseArea()) ,;
            Ferase(cDrivDirTemp+(cSitPTMO)+".dbf") ,;
            dbSelectArea(cOldSele), .T. )
 


Atentamente,

Rolando
Cochabamba, Bolivia
RSalazarU
 
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Mon Dec 03, 2012 2:28 pm

Mario, Rolando.
Gracias por su interés. El comportamiento es el mismo.

Después de dos días, de 16 hrs cada uno!!! (¡que terquedad!), y centenares de pruebas con todos los ejemplos afines encontrados aquí en el foro, he llegado a la conclusión de que el comportamiento de la cláusula VALID no es el mismo en las WINDOWS MDICHILD, como en los DIALOG NOWAIT. Usando MDICHILD, si tienen abiertas varias de estas y se cierra el programa (WinMain), la cláusula VALID es evaluada en cada una de ellas, no así en los DIALOG NOWAIT.

Estoy desistiendo de éstos DIALOGS NOWAIT porque no encuentro la forma de que se evalúe el VALID de ellos cuando estaban abiertos y el usuario cierra totalmente la aplicación sin percatarse de que estos dialogs estaban activados. Bien puedo dejarlo así, y en la function de cierre borrar los ficheros temporales que menciono en esto post. Pero... se me quedarían cargados todos los recursos, que incluyo en el VALID, al no ser liberados (Fonts,Backgrounds...)

Ej:
DEFINE DIALOG oDlg OF oWnd RESOURCE "CREDITOSCONSUL"
ACTIVATE DIALOG oDlg CENTERED NOWAIT ;
VALID( ,oFont1,oFont2,oBack,; //estos no se liberan si el dialog estaba abierto y el usuario cerro el programa
(cSitPTMO)->(dbCloseArea()) ,; //estos sí, en la function de cierre del programa
Ferase(cDrivDirTemp+(cSitPTMO)+".dbf") ,;
dbSelectArea(cOldSele), .T. )
Return nil

Por otro lado, estuve probando la técnica (A. Linares) de pasar los controles del dialog a una Child utilizando el ejemplo testmdir.prg que está en samples y me funciona el traspaso, pero la child se comporta como MODAL, no me permite abrir otra ventana o ejecutar otra acción desde el menú, pero si la minimizo sí ,(que raro). ¿Cómo puedo corregir esto?

Utilizo FWH-1006, BCC582, XHARBOUR,PELLESC

Agradezco a todos por su interés y continúo solicitando sus sugerencias para ambos casos.
Saludos.

PD. MODIFICADO:
Antonio, disculpa, tuve un error. El inconveniente no es que se comporte como MODAL, sino que se desactivan las teclas ENTER Y TAB.

Referente a:
..pero la child se comporta como MODAL, no me permite abrir otra ventana o ejecutar otra acción desde el menú, pero si la minimizo sí ,(que raro). ¿Cómo puedo corregir esto?

Esto sucede si lo hago asi:
Code: Select all  Expand view  RUN
ACTIVATE DIALOG oDlg CENTERED NOWAIT ;
     ON INIT (  oDlg:SetSize(nWidthRes,nHeightRes-40), oDlg:Move(0,0) ,;
                 SetParent(oDlg:hWnd,oWnd:hWnd,.t.) ) ;
     VALID( oFont:End(),;
            oFont2:End(),;
            (cSitPTMO)->(dbCloseArea()) ,;
            Ferase(cDrivDirTemp+(cSitPTMO)+".dbf") ,;
            Ferase(cDrivDirTemp+(cSitPTMO)+".CDX") ,;
            dbSelectArea(cOldSele), .T. )
 

Mil dilcupas.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby carlos vargas » Mon Dec 03, 2012 6:03 pm

Francisco, si me preparas un ejemplo autocontenido
que muestre el problema, yo podria revisar las clases involucradas (twindows,tdialog,tmdichild)
para ver si puedo brindarte una solucion a tu problema.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby FranciscoA » Mon Dec 03, 2012 8:43 pm

Carlos Vargas, gracias por responder.

Este es el ejemplo auto-contenido y el .RC
Code: Select all  Expand view  RUN
#include "FiveWin.ch"

#define SM_CXSCREEN 0
#define SM_CYSCREEN 1
#define GW_CHILD      5
#define GW_HWNDNEXT   2
#define SW_RESTORE    9

static oWnd
//--------------------------------------------------------------------
Function Main()

   SET CENTURY ON

   DEFINE WINDOW oWnd MDI  TITLE "PRUEBA"

   ACTIVATE WINDOW oWnd MAXIMIZED ;
       ON INIT oDlgChild() ;
       VALID  MsgNoYes("¿Desea salir?","Salir")

       oWnd:End()

return nil

//-------------------------
Function oDlgChild()
LOCAL oChild
   
DEFINE WINDOW oChild TITLE "A Child Window / Dialog" MDICHILD ;
       COLOR 0, GetSysColor( )
     
ACTIVATE WINDOW oChild;
    ON INIT Dialog( oChild ) ;
    VALID ( .T. )

RETURN NIL

//---------------------------------//
Function Dialog(oChild)
local oDlg
local oNumPtmo,cNumPtmo:=Space(7)
local oFecha, dFecha:=Date()

DEFINE DIALOG oDlg OF oChild RESOURCE "PRUEBA"

   REDEFINE SAY oFecha VAR dFecha  ID 150 OF oDlg

   REDEFINE SAY ID 4001 OF oDlg
   REDEFINE SAY ID 4002 OF oDlg

   REDEFINE GET oNumPtmo VAR cNumPtmo ID 151 OF oDlg ;
          UPDATE ;
          PICTURE "9999999"  

   REDEFINE BUTTON ID 310 OF oDlg  ACTION ( oChild:End() )  CANCEL

ACTIVATE DIALOG oDlg CENTERED NOWAIT ;
     ON INIT (  ChangeParent( oDlg, oChild ) ) ;
     VALID ( .t. )

oChild:SetSize( oDlg:nWidth, oDlg:nHeight ) //  Dialog-Size
oDlg:End()  

Msginfo("No se evalua el valid al salir del programa sin cerrar los Dialogs NoWait"+CRLF+;
        "y ENTER Y TAB no funcionan en el GET")

RETURN nil

//--------------------------------------------------
function ChangeParent( oDlg, oWnd )

   local hCtrl := GetWindow( oDlg:hWnd, GW_CHILD )
   local n, aChilds := {}

   while hCtrl != 0
      AAdd( aChilds, hCtrl )
      hCtrl = GetWindow( hCtrl, GW_HWNDNEXT )
   end

   AEval( aChilds, { | hCtrl | SetParent( hCtrl, oWnd:hWnd ) } )

   for n = 1 to Len( oDlg:aControls )
      AAdd( oWnd:aControls, oDlg:aControls[ n ] )
   next

return nil


Code: Select all  Expand view  RUN
PRUEBA DIALOG FIXED IMPURE 0, -29, 658, 269
STYLE WS_POPUP|DS_MODALFRAME|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE
CAPTION "Aprobacion de Crédito y Cálculo de Amortización"
FONT 8, "MS Sans Serif"
{
  CONTROL "&Salir           ", 310, "Button", BS_RIGHT|WS_TABSTOP, 448, 245, 86, 22
  CONTROL "", 151, "Edit", ES_AUTOHSCROLL|WS_BORDER|WS_TABSTOP, 70, 3, 60, 12
  CONTROL "", 150, "Edit", ES_AUTOHSCROLL|WS_BORDER, 230, 3, 60, 12
  CONTROL "Crédito Número", 4001, "Static", WS_GROUP, 0, 4, 68, 8
  CONTROL "Fecha del Credito", 4002, "Static", WS_GROUP, 154, 4, 72, 8
}


Nuevamente, muchas gracias.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2159
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: DIALOGS NOWAIT-CLAUSULA VALID

Postby carlos vargas » Wed Dec 05, 2012 5:13 pm

ok, francisco, lo revisare.
te aviso como me va.

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Next

Return to FiveWin para Harbour/xHarbour

Who is online

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