FoxPro/Visual FoxPro - Formulario compuesto

   
Vista:

Formulario compuesto

Publicado por Antonio (12 intervenciones) el 14/03/2016 23:33:10
Buenas a todos, tengo un conjunto de formularios en el cual se le pasa un valor 1 o 2 desde el menú del formulario principal para que entre en clientes o proveedores y así abrir unas tablas u otras. El conjunto de formularios es idéntico para ambas tablas pero las instrucciones dependen del valor de entrada.


Va sin problemas cuando paso el valor 1 y me abre las tablas clientes. Al cerrar el conjunto de formularios se vuelve a poner el valor en 0 y si pulso en la otra opción manda un 2 y se me abre proveedores.

El problema es cuando abro uno de los dos y luego abro el otro pues el valor que se pasa al conjunto de formularios pasa a ser a los dos conjuntos de formularios el mismo valor ya que es una variable global y desde el conjunto de formularios según este valor pues además de abrir las tablas clientes o proveedores realiza mas operaciones, con lo cual al abrir el 2º formulario el 1º también coge los mismos valores y da errores.

Estoy intentando hacerlo guardando el valor cuando entre en otra variable pero ya no veo ni lo que estoy haciendo....

Me podéis sugerir alguna idea??

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Formulario compuesto

Publicado por Fidel José (321 intervenciones) el 15/03/2016 00:22:37
Las variables globales se pueden utilizar únicamente para temas globales.
Si estás hablando de pasar valores, la única forma de hacerlo efectivo, es pasar los parámetros por valor.
El problema de los conjuntos de formularios es que la parametrización resulta complicada, tanto como su manejo, por lo que no resultan nada recomendables, más allá de lo que diga la ayuda de Visual fox.

No hay ningún problema en que uses el mismo formulario para realizar varias tareas distintas, con las siguientes precauciones:
1) Preferir la definición de propiedades del formulario a cualquier otro tipo de definción de variables.
2) Las variables de paso (duran dentro de 1 método o 1 evento) deben ser definidas como local sin excepción
3) Los parámetros deben ser recibidos por la instrucción LPARAMETERS en todos los casos.
4) Los valores pasados por parámetros deben ser asignados a propiedades del form, salvo que solamente se utilicen únicamente en el INIT del form que recibe los parámetros.
5) Debes configurar las alternativas de uso y cuidar el desenlace en el método Destroy del form.
6) Es mejor colocar los controles dentro de Containers cuando un grupo de controles no se mostrará en determinadas alternativas.
7) Es mejor que los Containers sean clases Containers que puedan resolver sus propios problemas, antes que meter un barullo dentro de un formulario. De ese modo, la alternativa de configuración carga las clases Container a medida que se necesitan.

La ventaja de las propiedades del form, es que no importa cuantas veces se instancie el mismo en forma simultánea, porque cada conjunto de propiedades pertence a cada form instanciado.

Lo que debes tener presente, es que un formulario mantiene su name como referencia de objeto, solamente cuando se lo llama desde el Command de Menú y siempre que se trate de la primer instancia del formulario.
La mejor estrategia para retener el nombre de objeto de un formulario (se supone que si tiene instancia múltiple es WindowType=0 ), es la siguiente:

local lnForms
lnForms = _Screen.FormCount
DO FORM frmMultilpe WITH param1,param2,param3
if _Screen.FormCount > m.lnforms && significa que se instanció el formulario
objReference = _Screen.Forms(1) && el último form instanciado toma siempre la posición 1 del conjunto _Screen.forms
o mejor
Addproperty(_Screen, "MiInstancia_x",_Screen.Forms(1)
else
Messagebox("No se pudo instanciar el form")
endif
Conociendo la referencia de objeto puedes manipulear cualquier cosa dentro del form:
_Screen.MiInstancia_x.Hide()
_Screen.MiInstancia_x.show()
? _Screen.miInstancia_x.Caption
? _Screen.MiInstancia_x.Text1.Value

Finalmente, No uses conjunto de formularios. Si necesitas que varios formularios tengan una conducta determinada, puedes crear una clase Custom y dirigir su comportamiento desde los métodos de la clase Custom.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Formulario compuesto

Publicado por ANTONIO (16 intervenciones) el 15/03/2016 13:21:17
Muchas gracias por contestar tan rápido. Me pongo a hacer pruebas en cuanto pueda y te cuento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario compuesto

Publicado por Antonio (12 intervenciones) el 16/03/2016 00:35:14
Al final lo he dejado como compuesto pero he separado lo de cliente y proveedor y he realizado 2 formularios nuevos y de momento funciona todo.... aunque con tiempo probaré a ver si lo puedo unificar pues ahora si quiero modificar algo en uno y quiero que lo haga en le otro lo tengo q hacer de nuevo.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario compuesto

Publicado por Luiz Alexandre Ruiz (58 intervenciones) el 16/03/2016 03:02:02
No form que recebe o valor para indicar se é clientes o proveedores (não escrevo em espanhol..jajaja), crie uma propriedade para receber este valor e use dentro dele para fazer todo o processo, sendo assim você não precisa usar a variável global.

No form criei uma propriedade e coloco nela o valor recebido, depois mostro em um Label e também pode ser visto clicando no botão.

Rode o PRG para ver o que acontece e depois estude o código.

Enviei um exemplo, espero que ajude.

Qualquer coisa é só perguntar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Formulario compuesto

Publicado por ANTONIO (16 intervenciones) el 16/03/2016 10:31:50
Muchas gracias por la respuesta, aunque no hables español te entiendo perfectamente.

Y el ejemplo muy bueno, solo que tengo q adecuarlo ahora al conjunto de formulario y la propiedad se crea en el no en el formulario hijo.

Voy a probarlo, pues aunque he resuelto el tema separándolo en 2 conjuntos de formularios uno para clientes y otro para proveedores me interesaría que estuviese todo junto para así si hay que modificar algo hacerlo solo 1 vez.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario compuesto

Publicado por ANTONIO (16 intervenciones) el 16/03/2016 11:39:52
Ya lo he probado Luis, pero sigue dando problemas.

El problema es por el conjunto de formularios creo, en un formulario simple no hay problemas.

En el conjunto de formularios al crear la propiedad, la crea pero en el formset, despues aunque lo ponga como numérico me lo pone como carácter y después que al ser un conjunto de formularios se pierde el valor de la propiedad.
He creado una variable como local para probar y ocurre lo mismo, también pierde al valor al ser un conjunto de formularios.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Formulario compuesto

Publicado por Luiz Alexandre (58 intervenciones) el 17/03/2016 13:26:59
Bem provável que seja por ser via formset, porque você deve ter configurado o DataSession para 1 - Default Data Session, mude para 2 - Private Data Session, mas mude isso em cada um dos form´s, e não deixe as tabelas no FormSet, somente dentro dos form´s.

Se está criando a propriedade, no formset, não vai funcionar também, precisa ser no form.

Outra forma de criar a propriedade no Form.

Pode ser feito como o nosso amigo Fidel mostrou, mas no seu caso, use assim, lembre-se deve ser antes de atribuir o valor a propriedade.

no Init do Form.

THISFORM.AddProperty("nValor",0)
THIS.nValor = lnValorRecebido
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar