PDA

Ver la Versión Completa : Acceso a método d 1 form dsd Módulo d Datos


Muten
25-11-2003, 11:08:18
Lo he hecho ciento de veces, y nunca me ha pasado nada, pero de buenas a primeras, al hacer referencia en un módulo de datos a un método público de un formulario, me da un error de memoria..
- Incluyo la unidad dentro del módulo de datos.
- Llamo al método desde el evento BeforePost de un DataSet que se encuentra en el módulo de datos.
- Cuando la ejecución del programa entra en el método y hace referencia a algún componente del formulario (p. ej. button1.Focused), se produce el error de acceso de memoria.

He observado (con un breakpoint) que al llamar al método desde el módulo de datos ( Form1.ValidaCampos(); ), la variable Form1 es igual a nil.

La única forma de que funcione bien, es usando una variable global a la q le asigno en el evento OnCreateForm el valor de "self" y anteponiendo esta variable a todos los componentes dentro del método. Pero me parece algo chapucero.

He estado observando, y en la unidad donde tengo definido el formulario, no puedo hacer referencia a él. Es decir: si pongo Form1.Caption al mirar con un watch su valor, me sale también "nil".
No sé si es debido al uso de componentes JFActiveSoft, o pq el formulario lo he creado dinámicamente... lo que sea, me esta dando mucho dolor de cabeza. :confused:
Un saludo!

__cadetill
25-11-2003, 13:24:12
si Form1 = nil es porque este formulario no ha sido creado y, por eso el Acces Violation

Funciones de este tipo, son recomendables ponerlas en Units totalmente a parte de los formularios y acceder a ellas tanto desde los DataModules como desde los Forms (poniendo el uses pertinente, claro)

Espero te sirva

Muten
25-11-2003, 13:50:57
Gracias por contestar cadetill.

El formulario está creado dinámicamente, es un formulario de mantenimiento de una tabla Firebird.

Cuando el usuario da la orden de grabar los datos, con el método controlo que se hayan metido todos los datos no nulos, para evitar la excepción. Para ello recorro los componentes (dbedit) comprobando si ha introducido algo, si no es así, doy un mensaje de alerta y le mando el foco al dbedit.

Pienso que lo mejor es hacer un método, ya q voy a trabajar con componentes del formulario.

PD. Ya está solucionado el problema, creaba el formulario de esta manera:

procedure TfrmPpal.JfMenuItem9Click(Sender: TObject);
var
form3: Tform3;
begin
{ Creamos la Form}
form3 := Tform3.Create(self);
Try // La hacemos visible
form3.Showmodal;
Finally //Liberamos la memoria, pase lo que pase
form3.Free;
end;

end;

**He visto otro ejemplo para crear el formulario:

procedure TfrmPpal.JfMenuItem9Click(Sender: TObject);
begin
Application.CreateForm(Tform3,form3);
with form3 do
try
ShowModal;
finally
Free;
end;
end;

Así va bien :p . Supongo q la diferencia entre una forma y la otra está en q antes creaba una variable local y ahora estoy usando una global a la aplicación.. ¿me equivoco?

Saludos a todos.