Delphi - problemas con formularios 2

 
Vista:

problemas con formularios 2

Publicado por santiago (15 intervenciones) el 26/09/2003 05:33:05
Quiero crear formularios en tiempo de ejecucion y que se pasen valores de variables entre ellos.
Desde el primero (form1) creo a otro (form2) con create y luego éste crea a un tercero (form3) con create tambien...
Cuando el form3 quiere pasarle algun valor al form2 aparece el error (por ejemplo form2.textbox.text := '100' ; ) 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 claro.
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

RE:problemas con formularios 2

Publicado por Diego Romero (636 intervenciones) el 26/09/2003 08:02:00
Te propongo lo siguiente, enviame los fuentes de tu proyecto, al menos las partes más significativas al problema a mi correo y lo reviso. Porque por lo que dices parece ser un problema de sincronización entre creaciones de formularios pero no tengo una idea cabal de cómo suceden las cosas.
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

RE:problemas con formularios 2

Publicado por Fer (269 intervenciones) el 26/09/2003 09:12:09
Yo creo que, en realidad hay varios problemas.

El primero radica en la forma de trabajar. No me parece muy buena idea eso del paso de variables entre formularios, más correcto sería utilizar propiedades.

Aún así, es peor idea todavía utilizar las variables globales que declara automáticamente para hacer referencia a los formularios (Form1, Form2, etc).

En lugar de ésto, suponiendo que Form1 es el formulario principal de la aplicación, y tras quitar Form2 y Form3 de la lista de formularios autocreados, yo haría lo siguiente:

Si desde Form1 se crea Form2 con una instrucción como:

Form2 := TForm2.Create(Self);

Para pasar datos de Form2 a Form1 escribiría:

TForm1(Owner).Label1.Caption := 'Este dato viene de Form2';

De forma análoga, si Form2 crea a Form3 con:

Form3 := TForm3.Create(Self);

Bastaría con escribir:

TForm2(Owner).TextBox.Text := '100';

De este modo, evitas además depender del nombre de la variable que hace referencia a los formularios de tipo TForm1 y TForm2 ya que estás haciendo referencia a ellos a través del propietario (Owner) de los de tipo TForm2 y TForm3.

Bueno, creo que no me he explicado con demasiada claridad pero espero que te sirva de ayuda.
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

RE:problemas con formularios 2

Publicado por josu (42 intervenciones) el 26/09/2003 11:02:27
Y siguiendo ese estilo de programacion, como escribirias del Form2 en el tres? Para que se se escriberan mutuamente dos forms en los no ha creado el uno al otro ¿usarias las variables globales?
Un saludo
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

RE:problemas con formularios 2

Publicado por Fer (269 intervenciones) el 26/09/2003 13:23:04
Si el Form2 ha creado al 3, lo ideal es tener alguna variable en el Form2 que lo referencie. En ese caso, lógicamente dicha variable sería global al Form2. Ejemplo

parte private de TForm2:

FUnForm3: TForm3;

en alguna parte de la implementación de TForm2:

FUnForm3 := TForm3.Create(Self);

Hacer que dos formularios que no se han creado mutuamente ya es más complicado. De la forma en que desarrollamos las aplicaciones en la empresa en la que trabajo evitamos esas situaciones y, realmente, nunca hemos tenido necesidad real de hacerlo, pero una forma sería utilizar el objeto Screen (lo que no deja de ser una variable global).

En este caso, para escribir en el Form3 desde el Form1 se podría hacer algo como:

for i:=0 to Screen.FormCount - 1 do begin

if Screen.Forms[i] is TForm3 then
TForm3(Screen.Forms[i]).Label1.Caption := ''Label cambiada desde Form1;

end;//for i

Como puedes comprobar no es un método demasiado ortodoxo ya que te obliga a recorrer todos los forms creados y además, en el caso de que hubieses creado más de un form de la clase TForm3, escribiría en todos (o en el primero si pones un Break en el for).

Pero seguro que también hay solución para estos problemas. Sólo hay que pensar un poco.

Lo mejor: declarar propiedades.
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