PDA

Ver la Versión Completa : Formulario Auxiliar


bbjb
01-12-2004, 09:28:38
Saludos,

Tengo un formulario auxiliar que generó en modo ejecución y utilizo para establecer unos filtros previos a un listado.

Una vez fijados estos valores y regresar al principal, no puedo recuperar los valores del form.auxiliar.

El código que utilizo es el siguiente:

TFauxiliar = class(TForm)
public
Propiedad: String;
end;
.....................

//en el evento FormClose del auxiliar
if ModalResult = mrOk then
Propiedad := el valor que necesitas;
.......................

//Formulario principal llamará así a auxiliar
with TFauxiliar.Create(nil) do
begin
if ShowModal = ID_OK then
Edit1.Text := Propiedad;

Free;
end;

Me provoca un error de "Violación de acceso a la dirección ...."

He seguido el hilo de roman pero sin tener éxito.
http://www.clubdelphi.com/foros/showthread.php?t=3972&highlight=formulario+ejecucion+create

Alguna sugerencia???

afxe
01-12-2004, 09:38:03
Prueba esto en la llamada:


//Formulario principal llamará así a auxiliar
with TFauxiliar.Create(Self) do
begin
if ShowModal = mrOK then
Edit1.Text := Propiedad;
Free;
end;

DarKraZY
01-12-2004, 09:38:06
Acabo de probarlo y a mí me funciona correctamente. Para terminar de probarlo he puesto un TButton en el TFauxiliar asignándole "mrOk" en la propiedad "ModalResult" del TButton.

Er_Manué
01-12-2004, 09:42:36
Prueba a crear el formulario auxiliar con Application.CreateForm(TFauxiliar, Fauxiliar);

TFauxiliar = class(TForm)
public
Propiedad: String;
end;
.....................

//en el evento FormClose del auxiliar
if ModalResult = mrOk then
Propiedad := el valor que necesitas;
.......................

Application.CreateForm(TFauxiliar, Fauxiliar);

//Formulario principal llamará así a auxiliar
with Fauxiliar do
begin
if ShowModal = ID_OK then
Edit1.Text := Propiedad;

Free;
end;


A ver si asi hay suertecilla y funciona :p

Salu2
Er_Manué

Neftali [Germán.Estévez]
01-12-2004, 09:48:15
¿Exactamente en qué línea te da el error? ¿Lo has "debuggado" (...ufff que mal suena esto...)? ¿No estarás liberando el form auxiliar en el OnDestroy con caFree?

El código en sí no parece tener errores; ¿Tienes algo més puesto en los eventos de Close/destroy?

bbjb
01-12-2004, 10:37:38
He probado con vuestros consejos y he de comunicaros que el ganador ha sido ...... Er_Manué (es broma)

Haciendo Application.CreateForm(TFauxiliar, Fauxiliar) puedo recuperar los valores sin ningún problema, aunque sigo mosqueadillo de porque no ha funcionado con TFauxiliar.Create([nil,self]) porque la única programación que tengo en el auxiliar es la de asignar a la variable pública el valor del objeto.

En fín, Muchiiiiiiiiiiiisimas Gracias a tod@s

Er_Manué
01-12-2004, 10:51:05
weeeeeeee!! gracias!! plas plas muchas gracias!! nunca espere esto!! sniff.... :D

A mi me pasaba lo mismo si no ponia los formularios en auto-create Forms, que no es más que Application.CreateForm(..,..); pero no tengo demasiado claro el por qué, pero funciona ;)

Salu2

roman
01-12-2004, 16:43:59
Una crítica constructiva:

La programación no es cosa de suerte. Antes de adoptar una "solución" porque quien-sabe-por-qué-pero-así-me-ha-funcionado es recomendable revisar y entender el porque de las cosas. En este caso, por ejemplo, se termina por utilizar algo que por regla general se contra recomienda: dejar los formularios en el AutoCreate o acceder directamente a las variables globales que Delphi declara, y todo cuando la técnica original debe funcionar correctamente pero alguna otra cosa nos está estorbando. Quizá, como dice Neftali, se pone Action := caFree en el evento OnClose del formulario auxiliar.

// Saludos

Er_Manué
01-12-2004, 17:44:27
Estoy totalmente de acuerdo contigo Roman, lo que sucede que normalmente debido a esos "maravillosos plazos de entrega" que tan holgadamente nos "proponen" nuestros "queridos" jefes :D si algo funciona, ¡ ni lo toques ! por que no hay más tiempo :( pero realmente eso únicamente provoca arrastrar cada vez más errores, como una bonita bola de bugs...digo de nieve ;)

Salu2