DIALOGS NOWAIT-CLAUSULA VALID

User avatar
FranciscoA
Posts: 2163
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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

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
horacio
Posts: 1364
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by horacio »

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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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
Rick Lipkin
Posts: 2668
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by Rick Lipkin »

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
csincuir
Posts: 415
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala
Has thanked: 3 times
Been thanked: 2 times
Contact:

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by csincuir »

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

Code: Select all | Expand


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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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
csincuir
Posts: 415
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala
Has thanked: 3 times
Been thanked: 2 times
Contact:

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by csincuir »

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

Code: Select all | Expand


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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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
MarioG
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR
Been thanked: 2 times

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by MarioG »

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
RSalazarU
Posts: 211
Joined: Wed Jul 16, 2008 12:59 pm
Location: Cochabamba-Bolivia
Contact:

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by RSalazarU »

Francisco:

Yo lo hago asi

Code: Select all | Expand


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

      ACTIVATE WINDOW ::oDlg
 


en tu caso

Code: Select all | Expand


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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

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

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
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by carlos vargas »

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

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by FranciscoA »

Carlos Vargas, gracias por responder.

Este es el ejemplo auto-contenido y el .RC

Code: Select all | Expand

#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

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
carlos vargas
Posts: 1721
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: DIALOGS NOWAIT-CLAUSULA VALID

Post by carlos vargas »

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

salu2
carlos vargas
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
Post Reply