Hola amigos a ver si alguien me echa una manito...
Tengo una app que Carga un array con datos de ventas que digita el usuario y los muestra con la XTBrowse en un Dialog, luego los imprimo, guardo y lipio ese array. Una vez limpio el array paso a la siguiente venta en el mismo proceso, esto se realiza en un mismo Dialog.
El problema se produce cada vez que refresco el browse para hacer una nueva venta, alli aumenta el uso en memoria de la app llegando hasta un limite en que consume gran parte de la memoria del pc y el dialog comienza a desaparecer y la app hay que cerrarla con el administrador de tareas.
He realizado varias depuraciones y he bajado ese uso de memoria, pero ya no se que mas hacer, actualmente el problema se da cuando hago +- 100 ventas seguidas.... pero al usuario ya le molesta estar cerrando y habriendo la app cada vez que ocurre...
por favor alguien echeme una manito
de ante mano,
muchas gracias..
Esta es la estructura general de la app.
#include "FIVEWIN.CH"
#include "DTPICKER.CH"
#define AR_DATOS ::aDatos //defino el array
***defino las variables a ocupar en el array
#define BA_nAt ::oBrw:nArrayAt
#define BA_NUMBOL 01
#define BA_DESPRO 02
#define BA_SUBTOT 03
......
.....
/*-----------------------------------------------------------------------------------------------*/
CLASS FT604
DATA oBrw, oBtn, oCat, oDlg
DATA aDbf
METHOD Open()
METHOD Init()
METHOD New() Constructor
METHOD Close() INLINE AEval( ::aDbf, { |oDbf| oDbf:Close() } ), .T.
METHOD Agrega()
...
...
ENDCLASS
/*-----------------------------------------------------------------------------------------------*/
METHOD Open() CLASS FT604 //abro las dbf's
::aDbf := Array( 02 )
DB_PRODUC := Tred():Use( GetApp():cRuta + "COPRODUC.DBF" )
DB_CAJAS := TRed():Use( GetApp():cRuta + "MOCAJERO.DBF" )
RETURN lTredOpen( ::aDbf )
/*-----------------------------------------------------------------------------------------------*/
METHOD Init() CLASS FT604 //preparo el array , y declaro variables
AAdd( AR_DATOS, ::AddReg() )
::oGet := Array( 7 )
::vGet := Array( 7 )
.....
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD AddReg() CLASS FT604
RETURN { Space( 01 ) ,; // 01 - NUMBOL 01
Space( 01 ) ,; // 02 - DESPRO 02
0 ,; // 03 - CODPRO 03
.F. } // 09 - ..... ESTADO 09
/*-----------------------------------------------------------------------------------------------*/
METHOD New() CLASS FT604
LOCAL vMsg, oMsg
DEFINE Dialog ::oDlg Resource "DL_604_VTAPOS"
Redefine DTPICKER ::oDpk VAR ::vDpk Id 106 Of ::oDlg COLORS CLR_BLACK ,CLR_RED
Redefine Get ::oGet[01] VAR ::vGet[01] id 131 of ::oDlg Update valid { || ::Agrega() } COLORS CLR_BLACK ,CLR_HCYAN
::oGet[07]:bGotFocus := { || ::oGet[07]:SetFocus() }
....
REDEFINE BTNBMP ::oBtn[05] ID 139 OF ::oDlg ;
RESOURCE "SALIR2" Tooltip "Salir Modulo Ventas..."
::oBtn[05]:bAction := { || ( ::oDlg:bValid := { || .T. } ) }
....
WITH OBJECT ( ::oBrw := TXBrowse():New( ::oDlg ) )
::SetBrw()
:CreateFromResource(107)
END
::oDlg:bKeyDown := { |nKey| ::Tecla( nKey ) }
Activate Dialog ::oDlg center Valid .F.
::Close()
RETURN Self
/*-----------------------------------------------------------------------------------------------*/
METHOD Agrega() CLASS FT604 //agrega los datos al array
hb_gcAll()
AR_DATOS[BA_nAt][BA_NUMBOL] := ::vGet[01]
AR_DATOS[BA_nAt][BA_DESPRO] := ::vGet[02]
AR_DATOS[BA_nAt][BA_SUBTOT] := ::vGet[03]
.....
::Totales()
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
METHOD Totales() CLASS FT604 //sumo los parciales y refresco
::vSay[01] := 0
::vSay[04] ++
AEval( AR_DATOS, { |aDat| ::vSay[01] += aDat[03] } )
::oSay[01]:Refresh()
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD SetBrw() CLASS FT604 //refresca los datos agregados al array
WITH OBJECT ::oBrw
:SetArray( AR_DATOS )
:aCols[ BA_NUMBOL ]:Hide()
WITH OBJECT :aCols[ BA_DESPRO ]
:cHeader := "DETALLE DEL PRODUCTO"
:nWidth := 350
DataFont := ::oFont2
END
WITH OBJECT :aCols[ BA_SUBTOT ]
:cHeader := "SUB - TOTAL "
:nWidth := 100
DataFont := ::oFont2
END
END
RETURN NIL
/*-----------------------------------------------------------------------------------------------*/
METHOD Tecla( nKey ) CLASS FT604 //teclas que se presionan para el cambio
DO CASE
CASE nKey == VK_F2 .AND. ::vSay[01] > 0 ; ::cambio()
ENDCASE
RETURN NIL
*------------------------------------------------------------------------------------------------*/
METHOD Cambio() CLASS FT604
LOCAL oDlg, oBtn, vSay, oSay, vPag, oPag, oRbt, vRbt, oGet, vGet, vCkb, oCkb
DEFINE Dialog oDlg Resource "DL_EFEC_POS"
Redefine Get oPag VAR vPag id 105 of oDlg valid { || ::vuelto( vPag, oBtn ) } Font ::oFont COLORS CLR_BLACK ,CLR_HCYAN
Redefine Button oBtn[01] Id 106 Of oDlg Action (::oDlg:bValid := {||.T.}, ::Imprimir(), ::Guardar(), oDlg:END() )
ACTIVATE DIALOG oDlg Center
RETURN .T.
*------------------------------------------------------------------------------------------------*/
METHOD Vuelto( vPag, vSay, oBtn, oSay ) CLASS FT604
vSay[03] := Transform( vPag - vSay[02], "999,999,999" )
IF Val( vSay[03] ) < 0
MsgInfo( "Monto Pagado es incorrecto....!!","Atención Cajeros..." )
vPag := 0
oBtn[01]:Disable()
ELSE
oBtn[01]:Enable()
ENDIF
oSay[03]:Refresh()
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD Imprimir() CLASS FT604 //se imprime el comprobante de pago
Local cPuerto:="LPT1", oPrn
LOCAL nLin, nFor
oPrn:=TDosPrn():New(cPuerto)
oPrn:Command("27,112,0,60,240")
oPrn:SayCmp( 01,00, "Caja:" )
FOR nFor = 1 TO Len( AR_DATOS )
imprimo los datos del array
.....
NEXT
oPrn:end(.T.)
MsgInfo( "Documento Generado", "Atención Usuario..." )
RETURN .T.
/*-----------------------------------------------------------------------------------------------*/
METHOD Guardar() CLASS FT604 //guardo los datos en la dbf y vuelve con otra transaccion
LOCAL nFor
FOR nFor = 1 TO Len( AR_DATOS )
paso el array a la dbf...
.....
NEXT
::oSay[03]:Refresh()
hb_gcAll()
AR_DATOS := {}
AAdd( AR_DATOS, ::AddReg() )
SysRefresh()
::SetBrw() /// AQUI SE PRODUCE EL AUMENTO EN EL USO DE LA MEMORIA, cuando paso a la siguiente transacción
RETURN Self