PDA

Ver la Versión Completa : ERROR con formulario showmodal


molina669
07-11-2005, 11:04:01
Hola a todos y les agradecería que me ayudaran con un problemilla que fijo es una tontería pero que me trae locooooo.
Mi problema es que abro un formulario,donde introduzco una nueva provincia, con showmodal desde otro formulario. El formulario "showmodal" se abre bien, pero el problema viene cuando el padre tiene que evaluar si ha devuelto mrok o mrcancel. me sale el típico mensaje de "acces violation", ya he comprobado que los botones devuelven mrok y mrcancel.

Dentro de mi locura transitoria he intentado incluso abrir el formulario con show y no con showmodal(evidentemente tb sin mrok ni mrcancel) y me lo hace de PM, pero solo una vez, la segunda me da el mismo "access violation".

Les pido ayudo porque ya no se donde meterme.

Gracias a tod@s

epuigdef
07-11-2005, 12:47:11
Debes tener en cuenta dónde creas la instancia del formulario que muestras.
Tu problema parece que se debe a que destruyes el formulario y después intentas acceder a sus datos, y por esto te da error.

Espero que te sirva

Edu

molina669
07-11-2005, 13:10:50
Gracias por contestar, lo he comprobado y el error me da en la linea:" if (frmprovincia.showmodal =true) then", luego no intento acceder a sus elementos, sino a ella misma. Tal vez sea algún problema en la configuracion de delphi. Uso delphi5 con ADO, por si os sirve de algo pa ayudarme.

epuigdef
07-11-2005, 13:16:24
Ya me imaginaba que te daba el error en esta línea, pero el tema está en dónde creas la instancia de frmprovincia. En algún lugar no lejos de ahí y un poco más arriba debería estar la creación, del tipo


frmProvincia := TFrmProvincia.create(nil);


Y más abajo la destrucción:


frmProvincia.free;



En general, cuando se usa un formulario modal la estructura es la siguiente:



function recuperarDato : String;
var frmProvincia : TFrmProvincia;
temporal String;
begin
frmProvincia := TFrmProvincia.create(Nil);
try
if frmProvincia.showmodal = mrOk then
temporal := frmProvincia.EditProvincia.text
else
temporal := '';

finally
frmProvincia.free;
end;

recuperardato := temporal;
end;



Un saludo

Edu

Lepe
07-11-2005, 16:23:14
En lugar de frmprovincias.Free,
pon FreeAndNil(frmprovincias).

La diferencia es que con .Free, el puntero frmprovincias no queda apuntando a nil, sino a la dirección de memoria donde se encontraba la ventana, como ya se ha liberado, estas accediendo a una dirección no válida.

Ten cuidado de que la forma no tenga cafree en su evento OnClose, ya que al cerrarse se destruirá, y puedes perder la referencia.

saludos

molina669
08-11-2005, 10:49:57
Gracias a los dos me ha servido mucho vuestra ayuda