Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Acceder a componentes de otro form (https://www.clubdelphi.com/foros/showthread.php?t=76779)

alexisenp 27-11-2011 07:14:25

Acceder a componentes de otro form
 
Hola, espero me puedan ayudar con este problema que tengo

Desde el Form1, el principal de la aplicacion, creo otro formulario, por ejemplo así:

Código:

uses Unit2;  // Incluyo la referencia en el Uses
...
procedure TForm1.Button1Click(Sender: TObject);
var f2 : Tform2;
begin
  f2:= TForm2.Create(self);
  try
    f2.ShowModal;
  finally
    f2.Free;
  end;
end;

Si desde el Form2 quiero acceder a alguna objeto/propiedad del Form1, me basta con añadir en el Unit2 lo siguiente:
Código:

implementation

uses Unit1;

Hasta aquí todo bien, si ahora vuelvo a crear otro form desde el Form2, así:
Código:

uses Unit3;  // Incluyo la referencia en Uses
...
procedure TForm2.Button1Click(Sender: TObject);
var f3 : Tform3;
begin
  f3:=TForm3.Create(self);
  try
      f3.ShowModal;
  finally
      f3.Free;
  end;
end;

Para acceder a algun objeto el Form2 desde el Form3 incluí:
Código:

implementation

uses Unit2;

Ahora al intentar asignarle un texto a un edit del Form2 desde el Form3, lanza una excepción EAccesViolation, y lo curioso es que en tiempo de diseño si que puedo acceder perfectamente a los objetos/propiedades del Form2.
Es mas, si incluyo Unit1 en el uses del form 3 si que puedo asignarle valores a los edit del Form1 sin problemas.

Intente crear la variable de tipo Form2 en el interface del Form1 para luego incluir el Unit1 en el Form3 y poder acceder de la forma:
Código:

f2.edit1.text :='algo'
pero tambien da problemas.

Debo cometer algun error que no consigo ver.
Espero puedan ayudarme, de antemano gracias.

Utilizo Delphi XE y Windows 7

Lord Delfos 27-11-2011 07:24:30

Y pregunto, de donde tratas de acceder a objetos de Form2 desde Form3? Es decir, al hacer click en algun boton de Form3, en el OnCreate?

Por ahi viene por ese lado la cosa...


PD: Mis disculpas por la ortografia pero estoy en un teclado en ingles...

beginner01 27-11-2011 14:41:53

Cita:

Empezado por alexisenp (Mensaje 419573)
Hola, espero me puedan ayudar con este problema que tengo

Desde el Form1, el principal de la aplicacion, creo otro formulario, por ejemplo así:

Código:

uses Unit2;  // Incluyo la referencia en el Uses
...
procedure TForm1.Button1Click(Sender: TObject);
var f2 : Tform2;
begin
  f2:= TForm2.Create(self);
  try
    f2.ShowModal;
  finally
    f2.Free;
  end;
end;

Si desde el Form2 quiero acceder a alguna objeto/propiedad del Form1, me basta con añadir en el Unit2 lo siguiente:

Código:

implementation
uses Unit1;

Hasta aquí todo bien, si ahora vuelvo a crear otro form desde el Form2, así:
Código:

uses Unit3;  // Incluyo la referencia en Uses
...
procedure TForm2.Button1Click(Sender: TObject);
var f3 : Tform3;
begin
  f3:=TForm3.Create(self);
  try
      f3.ShowModal;
  finally
      f3.Free;
  end;
end;

Para acceder a algun objeto el Form2 desde el Form3 incluí:
Código:

implementation

uses Unit2;

Ahora al intentar asignarle un texto a un edit del Form2 desde el Form3, lanza una excepción EAccesViolation, y lo curioso es que en tiempo de diseño si que puedo acceder perfectamente a los objetos/propiedades del Form2.
Es mas, si incluyo Unit1 en el uses del form 3 si que puedo asignarle valores a los edit del Form1 sin problemas.

Intente crear la variable de tipo Form2 en el interface del Form1 para luego incluir el Unit1 en el Form3 y poder acceder de la forma:
Código:

f2.edit1.text :='algo'
pero tambien da problemas.


Prueba de esta manera.

Código Delphi [-]
uses Unit2;  // Incluyo la referencia en el Uses
...
procedure TForm1.Button1Click(Sender: TObject);
//var f2 : Tform2; //Esta variable solo será visible durante la ejecución de este procedimiento
begin
  Form2 := TForm2.Create(self);
  try
     Form2.ShowModal;
  finally
     Form2.Free;
  end;
end;

Prueba acceder al form2 desde Form3 usando.

Código Delphi [-]
Form2.edit1.text :='algo'

haz lo mismo para Form3 y los demas formularios que quieras crear.

alexisenp 27-11-2011 21:30:49

Cita:

Empezado por Lord Delfos (Mensaje 419574)
Y pregunto, de donde tratas de acceder a objetos de Form2 desde Form3? Es decir, al hacer click en algun boton de Form3, en el OnCreate?

Por ahi viene por ese lado la cosa...


PD: Mis disculpas por la ortografia pero estoy en un teclado en ingles...

El Form1 es el principal hay varias opciones, el usuario presiona el boton de Nueva boleta y se abre el Form2 que pide el ingreso de varios datos. Uno de ellos son los datos del cliente, el usuario tiene un boton que al presionarlo se abre el Form3 y se le muestra una lista con clientes en un DBGrid en ese form tiene varias opciones de busqueda y filtro, al presionar el boton "Seleccionar" del Form3 los datos del cliente que el usuario eligio, se muestran en el Form2 ( en unos Edits). Al presioinar el boton "Seleccionar" se ejecuta un codigo como el siguiente
Código:

Form2.edit_nombre:=DBgrid_clientes.Fields[1].Value;
form2.edit_direccion:=DBgrid_clientes.Fields[2].Value;
Form2.edit_fono:=DBgrid_clientes.Fields[3].Value;

en ese momento es cuando me da el error

Cita:

Empezado por beginner01 (Mensaje 419585)
Prueba de esta manera.

Código Delphi [-]
uses Unit2;  // Incluyo la referencia en el Uses
...
procedure TForm1.Button1Click(Sender: TObject);
//var f2 : Tform2; //Esta variable solo será visible durante la ejecución de este procedimiento
begin
  Form2 := TForm2.Create(self);
  try
     Form2.ShowModal;
  finally
     Form2.Free;
  end;
end;

Prueba acceder al form2 desde Form3 usando.

Código Delphi [-]
Form2.edit1.text :='algo'

haz lo mismo para Form3 y los demas formularios que quieras crear.

Pero esa variable que pusiste Form2, ¿donde la declaro?, es la unica duda que me queda de tu respuesta, pero todo lo demas lo he hecho.

Saludos y gracias por sus respuestas.

Lord Delfos 28-11-2011 01:59:29

Bueno... No vi la respueta de arriba, je. Lo mas sensato seria no declarar la variable en ningun lado. La variable ya existe, se llama Form2 y esta declarada en la Unit2.

alexisenp 28-11-2011 02:36:59

Cita:

Empezado por Lord Delfos (Mensaje 419631)
Bueno... No vi la respueta de arriba, je. Lo mas sensato seria no declarar la variable en ningun lado. La variable ya existe, se llama Form2 y esta declarada en la Unit2.

Efectivamente, esa es la solucion a mi problema.
Probe lo que ponia @beginner01 y no me funciono por que estaba usando la variable Form2 cuando en realidad en mi programa la variable es Form_ingreso_comprobante, no me di cuenta hasta que vi tu respuesta Lord Delfos.

Muchisimas gracias a ambos, con esto mi problema queda resuelto :D .

JoseAntonio 02-12-2011 07:20:15

bueno, no se muy bien para que necesitas acceder a componentes de otro formulario el hecho que se pueda no significa que se deba, una clase solo deberia conocer la interfaz de otra y en esta otra no deberian estar publicados sus componentes, recuerda que los objetos son cajas negras y no pueden estar interactuando entre si por todos lados, a mayor cantidad de enlaces mas dificil te sera depurar ademas otro que ve tu codigo tendra que abrir varios formularios para entenderlo, es mi opinion, salu2

PepeLolo 12-12-2011 01:53:32

Porque no colocas el dataset y DataSource que manejas en un DataModulo que será visible por todos los formularios y los campos del form2 los enlazas al datasource del DataModulo, así tendrás la misma información en un formulario y en otro, sin necesidad de acceder a las propiedades de distintos formularios.:D


La franja horaria es GMT +2. Ahora son las 12:14:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi