PDA

Ver la Versión Completa : problemas con formularios 2


santiago14
26-09-2003, 05:19:08
Pido disculpas pero aqui voy de nuevo.....
El problemas parece estar cuando un formulario (form1) crea a otro (form2) con create y luego ese crea a un tercero (form3) con create tambien...
Cuando el form3 quiere pasarle algun valor al form2 aparece el error que es bastante largo pero habla de un ...EAccess Violation raised project1.exe at address....
La verdad es que estoy desconcertado con el error.
He probado pasar valores de variables desde form2 a form1 y no he tenido problemas, los lios comienzan cuando quiero hacer lo mismo desde form3 a form2.
Bueno espero haber sido mas claro esta vez y vuelvo a pedir disculpas.

roman
26-09-2003, 07:59:00
EAccesViolation se genera cuando un apuntador o un objeto nil son referenciados.

Por lo que indicas, el error se genera en una asignación del tipo

Form2.Edit1.Text := '.....'

de manera que o bien Form2 o bien Edit son nil. A no ser que estés creando los controles Edit por código no puede ser que Edit1 sea nil de manera que nos queda Form2.

Lo único que se me ocurre entonces es que por alguna razón Form2 no es lo que tú piensas. Me explico:

Recuerda que Delphicrea automáticamente una variable asociada al formulario. Es posible que hayas quitado Form2 de "auto create" y en el Form1 tengas declarada una variable Form2 en el lugar desde dónde lo creas. De esta manera Form3 estará haciendo referencia al Form2 que pone Delphi y no al que tu creaste.

Investígale por ahí. Si no se corrige el problema vuelve a consultarnos.

// Saludos

pd: Por favor cuando escribas la continuación de un mensaje hazlo en el mismo hilo ya que es difícil saber a qué mensaje te refieres.

santiago14
26-09-2003, 15:40:19
Estuve mirando lo que dijo Roman y no pude solucionarlo...
Veamos, deje de lado el proyecto principal y he creado tres ventanas form1, form2, form3; el unico que es autocreado es form1, form2 se crea desde form1 con create y form3 se crea desde form2 con create.
Luego puse en el evento click de un boton en form3:

form2.edit1.text:='100';
close;

nuevamente aparece el error ...EAccess Violation...

¿¿Puede ser que no se pueda crear en tiempo de ejecucion mas de un formulario en cascada sin que se pierdan las referencias o estoy equivocado??

roman
26-09-2003, 17:09:18
Posteado originalmente por santiago14
¿¿Puede ser que no se pueda crear en tiempo de ejecucion mas de un formulario en cascada sin que se pierdan las referencias o estoy equivocado??

Estás equivocado. Prueba a poner un breakpoint (F5) sobre la línea en cuestión, ejecuta la aplicación y, cuando se pare en la línea y antes de ejecutar ésta última pon el cursor del ratón sobre Form2 para ver cuál es su valor. Juraría que es nil.

// Saludos

santiago14
26-09-2003, 19:05:43
Mi querido Roman, tiene usted razon... es nil.

Ahora... como resuelvo el problema??

Cual es la forma correcta de hacer lo que estoy intentando?

Sugerencias??

Desde ya te agradezco pues esto me ha servido de mucho.

Gracias.

roman
26-09-2003, 19:30:09
Posteado originalmente por santiago14
Ahora... como resuelvo el problema??


¿Cómo creas Form2?

Como te dije antes, si usas una variable local a Form1 entonces Form3 no la verá; sólo verá la variable Form2 declarada en Unit2 que es nil ya que no está en el "auto-create".

Puedes hacer lo siguiente:

No usar una variable local al momento de crear Form2 sino usar la declarada en Unit2. Desde luego debes agregar Unit2 a la cláusula uses tanto de Unit1 como de Unit3 para qe ambas la vean. Lo correcto es en la parte de implementación.

Por otra parte, según entiendo de tu código, Form3 la necesitas para asignar un valor a un cuadro de texto de Form2 y la cierras apenas sucede esto.

No es muy buena idea acceder a los controles de un formulario desde otro formulario; incluso hay quienes piensan que los controles de un formulario deberían ser privados y no públicos cómo hace Delphi.

Piensa en lo que hace un cuadro de diálogo como FileOpen. El diálogo no coloca ningún valor en el formulario que lo abre; lo que hace es dejar ese valor en una propiedad pública (FileName en este caso) de manera que el formulario que lo abrió puede usar el valor.

Dicho esto quizá te convenga algo así:


TForm3 = class(TForm)
public
Propiedad: String;
end;


En el evento OnCloseQuery de Form3 pones:


if ModalResult = mrOk then
Propiedad := el valor que necesitas;


Form2 llamará a Form3 así:


with TForm3.Create(nil) do
begin
if ShowModal = ID_OK then
Edit1.Text := Propiedad;

Free;
end;


El punto fino en ésto es la separación de trabajos. Regresando al FileOpenDialog, éste no sabe, ni tiene por qué saber nada acerca del formulario que lo llama; su labor es escoger un archivo y punto

En tu caso me parece que es algo similar; Form3 no tiene por qué saber de la existencia de Form2, simplemente hace su labor de ajustar Propiedad y punto.

// Saludos

santiago14
27-09-2003, 05:59:03
Ahh, esto es otra cosa....
Muchisimas gracias mi amigo, muchas gracias....