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
/* *********************************************************************************** */