esto es algo sencillo no te compliques con un codigo dificil de depurar despues (mi humilde punto de vista)...
estas cometiendo un par de errores importantes
1.- Estas usando esta variable estatica nWnd que a medida que abres dialogos se incrementa y cada vez que pulsas un boton estas ejecutando la accion contenida en el ultimo valor de nWnd, por eso siempre ves que se actiualiza el ultimo dialogo, para que lo veas con claridad puedes ubicar esto en el boton "VER" MsgInfo( aObjVar( oDlg, nWnd ):cTitle )
2.- Cada dialogo abierto funcionaria como un area de trabajo independiente, debes seleccionar alias usas en cada uno, para eso debes usar bGotFocus()
te expongo un ejemplo tratando de seguir un poco tu estilo, es sencillo de comprender, no hay muchas complicaciones con arrays ni defines, trabaja con variables locales
- Code: Select all Expand view
#include "FiveWin.ch"
static oWndPrinc
static nWnd
**********************************************************************************************************************
function Main()
**********************************************************************************************************************
DEFINE WINDOW oWndPrinc Title "Ventanas" MDI MENU MenuPrin()
ACTIVATE WINDOW oWndPrinc MAXIMIZED
return nil
**********************************************************************************************************************
function MenuPrin()
**********************************************************************************************************************
local oMenu
MENU oMenu
MENUITEM "&Ventanas"
MENU
MENUITEM "&Ventanas" ACTION ( ManArt() )
ENDMENU
ENDMENU
return oMenu
**********************************************************************************************************************
function ManArt()
**********************************************************************************************************************
local cAlias, oDlgs
local oCli, aObj := Array( 5 )
if nWnd = nil
nWnd := 1
else
// Hacer control ventanas máximas.
nWnd ++
endif
cAlias := NewAlias( "Clients.dbf" )
DbUseArea( .T.,, "Clients.dbf", cAlias, .t., .f. )
DATABASE oCli
oCli:Load()
oCli:bBOF = { || MsgInfo( "Primer Registro" ) }
oCli:bEOF = { || MsgInfo( "Último Registro" ) }
DEFINE DIALOG oDlgs TITLE "Diáologo: " + Str( nWnd ) FROM 0,0 TO 20,40 OF oWndPrinc
oDlgs:bGotFocus := {|| DBSELECTAREA( cAlias ) }
@ 1, 1 SAY aObj[ 1 ] PROMPT oCli:Name OF oDlgs UPDATE
@ 2, 1 SAY aObj[ 2 ] PROMPT oCli:Adress OF oDlgs UPDATE
@ 5, 1 BUTTON aObj[ 3 ] PROMPT "Anterior" OF oDlgs;
ACTION ( oCli:Skip( -1 ) , If( oCli:BoF(), MsgBeep(),), oDlgs:Update() )
@ 6, 1 BUTTON aObj[ 4 ] PROMPT "Siguiente" OF oDlgs;
ACTION ( oCli:Skip(),;
Iif( oCli:EoF(), oCli:Skip( -1 ),), oDlgs:Update() )
@ 7, 1 BUTTON aObj[ 5 ] PROMPT "Ver" OF oDlgs;
ACTION ( MsgInfo( "Alias: " + cAlias + CRLF +;
"Valor nWnd: " + Str( nWnd ) ) )
ACTIVATE DIALOG oDlgs NOWAIT CENTERED;
ON INIT ( aObj[ 4 ]:SetFocus(), oDlgs:Move( 0, 0 ) );
VALID ( ( oCli )->( DbCloseArea() ), .t. )
return nil
**********************************************************************************************************************
function NewAlias( cNomDbf )
**********************************************************************************************************************
static nNum := 0
local cAlias := ""
nNum++
cAlias := SubStr( cFileNoExt( cFileName( cNomDbf ) ), 1, 4 ) + LTRIM( STR( nNum ) )
return ( cAlias )