Page 1 of 1

USO DE DIALOGOS NOMODALES

Posted: Fri Feb 17, 2017 4:16 am
by Miguel Salas
Buenas noches a todos.

Nunca he usado dialogos NOWAIT (NO MODALES) pero ahora mi cliente me pide eso.

primer problema: abro todas mis tablas en mi modulo principal y las cierro hasta el salir de la aplicación.
así que al abrir módulos y mas módulos el área ( alias) de mi tabla es la misma en todos, por lo que al hacer algo en el segundo dialogo le "pega" al primero (digamos un filtro), así al regresar al primero ya no es el mismo contenido. Esto es obvio por que NO fue creado para trabajar así. Lo que se me ocurre es abrir mis segundos diálogos con otros áreas y alias para poder hacer esto. ¿o Algún otro consejo ?

desde ya saludos.

Re: USO DE DIALOGOS NOMODALES

Posted: Fri Feb 17, 2017 7:39 am
by Antonio Linares
Miguel,

> Lo que se me ocurre es abrir mis segundos diálogos con otros áreas y alias para poder hacer esto

Esa es la forma correcta de hacerlo

Re: USO DE DIALOGOS NOMODALES

Posted: Fri Feb 17, 2017 5:00 pm
by Miguel Salas
Gracias Antonio.

Ahora ¿se puede saber si ya está abierto un dialogo para únicamente posicionarse en el lugar de abrirlo de nuevo.?

saludos

Re: USO DE DIALOGOS NOMODALES

Posted: Fri Feb 17, 2017 9:00 pm
by artu01
Hola Miguel y Antonio
yo estoy terminando de hacer un sistema con dialogos no modales pero yo abro todo los archivos una sola vez al arrancar
el sistema y se cierra todos ellos cuando se sale del mismo... este es un trozo de mi codigo...no tendre problema
con ponerlo en red?

Code: Select all

    IF !(VALTYPE( AbreDbf("ARTICULO", .T., .F. , , cPathDbf+cSubCarp, {"articulo"  }, "Articulos" ) ) == "O" .AND.     ;
         VALTYPE( AbreDbf("PATRON", .T., .F. , , cPathDbf+cSubCarp, {"PATRON"  }, "Patrones" ) ) == "O" .AND.          ;
         VALTYPE( AbreDbf("PERSONA" , .T., .F., , cPathDbf, {"PERSONA"}, "Personas") ) == "O" .AND.           ;
         VALTYPE( AbreDbf("IGV"     , .T., .F., , cPathDBF, , "I.G.V." ) ) == "O" .AND.                        ;
         VALTYPE( AbreDbf(cDbfGuia , .T., .F., "CABGUIA", cPathDbf, {cDbfGuia}, "Cabecera") ) == "O" .and.    ;
         VALTYPE( AbreDbf(cDbfDGuia , .T., .F., "DETGUIAD", cPathDbf, {cDbfDGuia}, "Movimientos de guias" ) ) == "O" .AND. ;
         VALTYPE( AbreDbf(cDbfParte , .T., .F., "CABPARTE", cPathDbf, {cDbfParte}, "Cabecera de Parte") ) == "O" .and.    ;
         VALTYPE( AbreDbf(cDbfdParte , .T., .F., "DETPARTE", cPathDbf, {cDbfdParte}, "Movimientos de partes" ) ) == "O" .AND. ;
         VALTYPE( AbreDbf(cDbfFac   , .T., .F., "FACTURA", cPathDbf, {cDbfFac}, "Facturas"   ) ) == "O"  .AND.;
         VALTYPE( AbreDbf("CONPAG" , .T., .F., , cPathDBF, {"CONPAG"}, "Condiciones de Pago" ) ) == "O" .AND.      ;
         VALTYPE( AbreDbf("MCODI"   , .T., .F., , cPathDbf+cSubCarp, {"MCODI"}, "Proveedores"         ) ) == "O" .AND. ;
         VALTYPE( AbreDbf("EMPRESA"  , .T., .F. , , cPathDBF, {"empresa"}, "Empresas"  ) ) == "O"  ;
        )
        lOk:=.f.
        Msgalert("El archivo esta siendo usado")
      IIF( Select("PERSONA" ) <> 0, PERSONA->( DBCLOSEAREA() ), )
      IIF( Select("IGV" ) <> 0, IGV->( DBCLOSEAREA() ), )
      IIF( Select(cDbfGuia) <> 0, (cDbfGuia)->( DBCLOSEAREA() ), )
      IIF( Select(cDbfDGuia) <> 0, (cDbfDGuia)->( DBCLOSEAREA() ), )
          IIF( Select(cDbfParte) <> 0, (cDbfParte)->( DBCLOSEAREA() ), )
          IIF( Select(cDbfdParte) <> 0, (cDbfdParte)->( DBCLOSEAREA() ), )
      IIF( Select("MCODI") <> 0, MCODI->( DBCLOSEAREA() ), )
      IIF( Select("ARTICULO") <> 0, ARTICULO->( DBCLOSEAREA() ), )
      IIF( Select("CONPAG") <> 0, CONPAG->( DBCLOSEAREA() ), )
      IIF( Select("EMPRESA"  ) <> 0, EMPRESA->( DBCLOSEAREA()  ), )
      IIF( Select("PATRON"  ) <> 0, PATRON->( DBCLOSEAREA()  ), )
      IIF( Select("Factura") <> 0, Factura->( DBCLOSEAREA() ), )
    ENDIF
Return lok
 
Miguel Salas wrote:Gracias Antonio.

Ahora ¿se puede saber si ya está abierto un dialogo para únicamente posicionarse en el lugar de abrirlo de nuevo.?

saludos
Miguel no entiendo tu pregunta .... entiendo que los dialogos se muestran se abren normalmente solo que hay que poner el parametro
NOWAIT en el ACTIVATE DIALOG

Code: Select all

DEFINE DIALOG oDlg RESOURCE "BRW_GUIA" TITLE "Notas de Pedido" 
....
// coloco los controles
.....
.....
ACTIVATE DIALOG oDlg NOWAIT
 
Espero que los que saben mas sobre no modales nos puedan aclarar las dudas
gracias

Re: USO DE DIALOGOS NOMODALES

Posted: Fri Feb 17, 2017 10:25 pm
by FiveWiDi
Miguel Salas wrote:Gracias Antonio.

Ahora ¿se puede saber si ya está abierto un dialogo para únicamente posicionarse en el lugar de abrirlo de nuevo.?

saludos
Si, se puede.

Aquí te dejo una función que yo utilizo para abrir una MDICHILD y gestionar las DBF que utiliza y la propia apertura de la MDICHILD.
La MDICHILD respecto de las DBF se comporta igual que un DIALOG NOWAIT.
En este código, fíjate en la variable 'oSWnd', es una STATIC que contiene la MDICHILD; con ella hago un SHOW() o un HIDE(). Yo no cierro la MDICHILD hasta que salgo de la aplicación, sólo la escondo en vez de cerrarla durante la existencia de la aplicación.
La definición de la MDICHILD la tengo en un fichero aparte, de ahí que haga "#include 'Alumne01.FWD'".
Las variables que utilices en el DIALOG NOWAIT deberás declararlas como STATIC si cuando vuelves a llamar el DIALOG las quieres 'gestionar', pués si son LOCAL al acabar la función dejan de existir.

Code: Select all

#include "AMPA32.ch"
#include "FWDCtrl.ch"

#xTranslate @<oDbf>:<(cField)>  =>  ( <oDbf>:nArea )-><cField>

STATIC aFamilia  := {}
STATIC aConcep   := {}

/* *********************************************************************************** */
/* *********************************************************************************** */
FUNCTION Alumne01( AMPAarra, nAccion, cCodiAlum, nGoRegi )

/* nAccion valdrà:
                   0 - No hace nada, simplemente un GoTo.
                   1 - Nova alta
                   2 - Modifica
                   3 - Borrar
*/

STATIC lExiste      := .F.
STATIC nEditando    := 0
STATIC oSWnd        := Nil
STATIC oSAfegir     := Nil
STATIC oSModi       := Nil
STATIC oSDel        := Nil
STATIC oSGo         := Nil
STATIC oSRecno      := Nil

STATIC oSTdbfAlumne := Nil

STATIC aHistoFiltre := {0}

Local lRespuesta  := .T.
Local aFiltro     := aFiltroFun( AMPAARRA )

#include "Alumne01.LCL"

Local aGets       := {}

Local oTdbfAlumne  := Nil

// Per a que aGetFamili cerqui en una DBF sense estar filtrada.
Local oTdbfAlumneFree := Nil

Local oTdbfFamili  := Nil
Local oTdbfPares_  := Nil
Local oTdbfdomici  := Nil
Local oTDbfConcep  := Nil
Local oTDbfRelcon  := Nil
Local oTDbfDatCur  := Nil

//Local aAsociar     := {}
Local aVeomasSiNo  := {}

uBusca      := Space(60)
nRecno      := 1

nEditando   := 0

/* Se chequea que exista una BD de trabajo, en caso contrario no se abre la ventana.
   -------------------------------------------------------------------------------*/
If AMPAarra[2][3][1][1] = ""

    lRespuesta  := .F.

  Else

    If lExiste

        WarningDemo2( oSTdbfAlumne:LastRec() )

        oSWnd:Show()
        oSWnd:Restore()
        lRefresca( AMPAarra, oSWnd )
        oSWnd:SetFocus()

      Else

        AMPAarra[4][1] := .F.

        oTdbfAlumne := oDbfClon( AMPAarra, "ALUMNE" )
        oTdbfAlumne:Setindex(4)   // per nom

        oTdbfAlumne:Gotop()


        oTdbfAlumneFree := oDbfClon( AMPAarra, "ALUMNE" )
        oTdbfAlumneFree:Setindex( 0 )   // per nom

        oTdbfFamili := oDbfClon( AMPAarra, "FAMILI" )

        oTdbfPares_ := oDbfClon( AMPAarra, "PARES_" )

        oTdbfdomici := oDbfClon( AMPAarra, "DOMICI" )

        oTDbfCONCEP := oDbfClon( AMPAarra, "CONCEP" )

        oTDbfRelcon := oDbfClon( AMPAarra, "RELCON" )

        oTDbfDatCur := oDbfClon( AMPAarra, "DATCUR" )

        oTdbfAlumne:Gotop():Load()

        #include "Alumne01.FWD"

        oSWnd        := oAlumne01
        oSRecno      := oRecno
        oSAfegir     := oAfegir
        oSModi       := oModi
        oSDel        := oDel
        oSGo         := oGo
        oSTdbfAlumne := oTdbfAlumne

        oAlumne01:bGotFocus  := { || ( uSetGoto( AMPAArra, oTdbfAlumne:CodiDomi, Nil, Nil, Nil, Nil, Nil, Nil, Nil ), ;
                                       oAlumne01:Move( 0, 0, (oAlumne01:nRight - oAlumne01:nLeft), (oAlumne01:nBottom - oAlumne01:nTop ), .T. ) ) }


        lGroupGetEdit( AMPAarra, oAlumne01, aGets )

        AADD( aGets, oAlumFacturab )
        AADD( aGets, oAlumlopd )
        AADD( aGets, oAlumDrIm )
        AADD( aGets, oALUMsoci )
        AADD( aGets, oCompDade )
       
        
        ROYes(AMPAarra, aGets)

        NullBrush( oAlumne01 )
        oIndiAlta:Hide()
        oIndiModi:Hide()
        oSayFlt:Hide()

        oTdbfAlumne:SetBrowse( oWBrowse, .F. )

        oLbFamilia:bKeyDown   := {| nKey , nflags | If( nKey = VK_RETURN .and. nEditando = 0, ;
                                                        ( Eval(oLbFamilia:bChange ), If( aFamilia[oLbFamilia:nAt][1] = "P", uGoto( AMPAArra, "P" ), uGoto( AMPAArra, "A" ) ) ), ;
                                                        KeyInoWnd( AMPAarra, oAlumne01, "A", ;
                                                                  {nEditando, oModi, oBusca, oWBrowse, oPrint, oAfegir, oDel, oASFiltre,;
                                                                   Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil }, ;
                                                                   nKey, nflags )    ;
                                                      ) }

        oLbConcep:bLDblClick := { |nRow,nCol,nKeyFlags| ( Eval(oLbConcep:bChange ), uGoto( AMPAArra, "R" ) ) }


        oLbConcep:bKeyDown   := {| nKey , nflags | If( nKey = VK_RETURN .and. nEditando = 0, ;
                                                        ( Eval(oLbConcep:bChange ), uGoto( AMPAArra, "R" ) ), ;
                                                        KeyInoWnd( AMPAarra, oAlumne01, "A", ;
                                                                  {nEditando, oModi, oBusca, oWBrowse, oPrint, oAfegir, oDel, oASFiltre,;
                                                                   Nil, Nil, Nil, Nil, Nil, Nil, Nil, Nil}, ;
                                                                   nKey, nflags )    ;
                                                      ) }


        ACTIVATE WINDOW oAlumne01 ;   //   MAXIMIZED ;   ON INIT oLBmnda:Set( AMPAarra[1][2][5][3] ) ;
            VALID ( If( nEditando == 0, ;
                        If( AMPAarra[4][1], ;
                            (lExiste := .F., oPrint:SetFocus(), lWndSalta( AMPAarra, Nil) ,;
                             laTDbfEnd( AMPAarra, { oTdbfAlumne, oTdbfPares_, oTdbfFamili, oTdbfDomici, oTDbfCONCEP, oTDbfRelcon, oTDbfDatCur, oTdbfAlumneFree } ), ;
                             oSTdbfAlumne := oSWnd := oSRecno := oSModi := oSDel := oSAfegir := oSGo := Nil, .T. ), ;
                            (lWndSalta( AMPAarra, oAlumne01 ) ,oSWnd:Hide(), .F. ) ;
                          ) , ;
                        (Eval( oSGo:bAction ), .F.) ;
                      ) ;
                  ) ;
          ON INIT ( oWBrowse:GoTop(), AutResiz( AMPAarra[1][2][3][3], AMPAarra[1][2][2][3], oAlumne01, 2 )) //FIVEWIDI

        oLbfamilia:SetArray( { "*", "*", "*", "*", "*" } )
        //oLbfamilia:bLine = { || { ArraFamilia[ oLbfamilia:nAt ][2] } }
        oLbfamilia:Refresh()
        oLbfamilia:GoTop()

        oLbConcep:SetArray( { "*", "*", "*", "*", "*", "*", "*", "*", "*" } )
        //oLbConcep:bLine = { || { ArraFamilia[ oLbConcep:nAt ][2] } }
        oLbConcep:Refresh()
        oLbConcep:GoTop()

        oTabs:SetOption( 3 )

        VeoMasSiNo( AMPAARRA, aVeoMasSiNo, Nil )

        oAlumne01:Hide()
        oAlumne01:Show()

        lExiste := .T.

    EndIf

    If ValType(cCodiAlum) = "C"
        If AllTrim(cCodiAlum) <> ""
            oSTdbfAlumne:KillFilter( .T. )
            //oSayFlt:Hide()
            oSRecno:Varput( nGoToAlum( AMPAarra, oSTdbfAlumne, cCodiAlum, .F., .T. ) )
        EndIf
    ElseIf nGoRegi > 0
        oSTdbfAlumne:KillFilter( .T. )
        //oSayFlt:Hide()
        oSRecno:Varput( nGoRegi )
    EndIf

    If nAccion = 0
        Eval( oSGo:bAction )
    ElseIf nAccion = 1
        Eval( oSAfegir:bAction )
    ElseIf nAccion = 2
        Eval( oSGo:bAction )
        Eval( oSModi:bAction )
    ElseIf nAccion = 3
        Eval( oSGo:bAction )
        Eval( oSDel:bAction )
    EndIf

EndIf

Return lRespuesta
/* *********************************************************************************** */
 

Re: USO DE DIALOGOS NOMODALES

Posted: Sat Feb 18, 2017 5:37 pm
by cnavarro
En mi opinión deberías utilizar MDICHILDs en lugar de DIALOGs NOWAIT