Problema con classes, a veces funcionan... otras veces no...

114 views
Skip to first unread message

Jorge

unread,
Jul 22, 2016, 3:01:41 PM7/22/16
to Comunidad de Visual Foxpro en Español
Hola a todos,

He creado algunos métodos generales dentro clases no visuales, quiero acceder a esos métodos desde cualquier parte de mi aplicación, he puesto todos los comandos Set Classlib To XYZ en un solo prg llamado setClasses que llamo desde el programa de inicio de la aplicación. 

En el mismo PRG (setClasses) creo un par de objetos con createobject() que he definido previamente como variables globales 

Cuando llamo a algunos de los métodos de las classes (devolver el siguiente número de factura, crear y devolver el nombre de un cursor con datos de factura, etc) estos procedimientos no devuelven correctamente los datos, la falla no sucede siempre, y por raro que parezca sucede en ciertas máquinas y en otras no, parece aleatorio, en las máquinas que sucede tampoco sucede siempre.

He probado varias cosas y el problema vuelve a presentarse.

¿que puedo estar haciendo mal? 
¿necesariamente debo crear los objetos previamente dentro del _screen para hacerlos globales?
¿es mejor instanciar los objetos cuando se necesiten y luego liberarlos? ¿no consume eso más recursos?

les agradezco los consejos que puedan darme

Carlos Miguel FARIAS

unread,
Jul 22, 2016, 4:30:49 PM7/22/16
to Grupo Fox
Como usas variables globales, el orden en que las creas puede alterar el funcionamiento.
Trata de crear los objetos como parte del objeto _screen, que es global pero del sistema, y por lo tanto siempre está.
Como dices que es aleatorio la aparición del error, puede darse que la creación de los objetos referenciados mediante globales no se haga en el mismo orden.
Sin más código para analizar, no se puede debuggear mucho.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe toda la vida, porque a veces Prosperidad no aparece

Luiz Alexandre Ruiz

unread,
Jul 22, 2016, 6:20:13 PM7/22/16
to Comunidad de Visual Foxpro en Español
Como disse o Miguel é melhor criar no _Screen.

Sobre instanciar quando necessário, é preciso lembrar que o objeto está no escopo global, ou seja, o que ele fez na ultima vez se mantém, eu prefiro sempre instanciar quando necessário para evitar problemas, mas cada caso é um caso. O que você pode fazer para evitar isso é criar um método para limpeza dos dados internos do objeto.

Jorge

unread,
Jul 23, 2016, 5:26:03 PM7/23/16
to Comunidad de Visual Foxpro en Español
Gracias Miguel, voy a cambiar los objetos para el _screen a ver que sucede

Jorge

unread,
Jul 23, 2016, 5:32:07 PM7/23/16
to Comunidad de Visual Foxpro en Español
Olá Luis, lo de instanciar cada ves me parece una buena idea pero tendría que hacer cambios en muchas partes de la aplicación, además de tener que estar pendiente de liberar el objeto luego de usarlo para evitar uso de recursos, voy a probar primero creando los objetos dentro del _screen y a ver como me va. ¡gracias por los consejos!

Luiz Alexandre Ruiz

unread,
Jul 23, 2016, 10:26:36 PM7/23/16
to Comunidad de Visual Foxpro en Español
Só mais uma dica.

O VFP 9 tem um "garbage collection" muito eficiente, se você fizer o objeto sendo PRIVATE ou LOCAL, ao final de cada método ou procedure o mesmo será excluído automaticamente.

Ex.

Método do form
Init
PRIVATE loBD as BD

loBD = CREATEOBJECT("BD")

Ao terminar este método a variável loBD será excluída e será liberado o recurso.

Carlos Miguel FARIAS

unread,
Jul 24, 2016, 10:03:30 AM7/24/16
to Grupo Fox
Lo que dice Luiz es cierto, pero si el objeto carga desde disco una buena cantidad de datos (lista clientes, productos, ciudades), conviene que el objeto se instancie una vez, se globalice con una referencia en el _Screen y se utilice donde sea necesario.
Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe 

Daniel Sánchez

unread,
Jul 24, 2016, 10:53:41 AM7/24/16
to Comunidad de Visual Foxpro en Español
La idea de las clases que son objetos es que este objeto debe encapsular todo lo que necesite, y no depender de variables externas, si es así esta rompiendo el concepto de encapsulación, si estas asiendo eso es probable que de ahí venga tus problemas ya que las variables globales pueden cambiar en cualquier lugar de la aplicación y eso te podría dar problemas aleatorios.
En mi caso las variables globales solo toman valores cuando carga la aplicación que más que nada son constantes que sirve para indicar valores fijos que puede ser el valor del impuesto, si permite la aplicación cambiar de contado al crédito cuando un documento ya tiene items y muchas políticas más, son variables que no son para que vayan cambiando de valores en procesos o diversas partes de tu aplicación, en este caso puedes optar por colgarla del _screen.
Si estas haciendo algo de lo comentado pues no queda más que reestructurar tus clases para que estas estén encapsuladas como debe ser.

Saludos 
--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047 RPM #948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Mario López

unread,
Jul 25, 2016, 11:23:56 AM7/25/16
to Comunidad de Visual Foxpro en Español

@Jorge:

SET CLASSLIB es para librerias de clases visuales VCX, para clases y procedimentos definidos en .PRGs deberías utilizar SET PROCEDURE TO .... ADDITIVE.

Igualmente tené en cuenta que VFP puede localizar funciones / clases sin estar en un procedure agregado con SET PROCEDURE si las mismas están definidas en un .PRG que está en el stack de ejecución (ver http://fox.wikis.com/wc.dll?Wiki~VisualFoxProInvocationStack)

HTH,
Mario


Reply all
Reply to author
Forward
0 new messages