Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Acceso a objetos/propiedades de otro Form (https://www.clubdelphi.com/foros/showthread.php?t=75116)

adrall 29-07-2011 18:01:18

Acceso a objetos/propiedades de otro Form
 
Haber si me podeis explicar esto que no entiendo:

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

Código Delphi [-]
uses Unit2;  // Incluyo la referencia en el Uses
...
procedure TForm1.Button1Click(Sender: TObject);
begin
with TForm2.Create(self) do
   begin
   ShowModal;
   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 Delphi [-]
implementation 

uses Unit1;
Hasta aquí todo bien, si ahora vuelvo a crear otro form desde el Form2, así:
Código Delphi [-]
uses Unit3;  // Incluyo la referencia en Uses
...
procedure TForm2.Button1Click(Sender: TObject);
begin
with TForm3.Create(self) do
   begin
   ShowModal;
   Free;
   end;
end;
Si ahora quiero acceder a algun objeto el Form2 se supone que debo incluir:
Código Delphi [-]
implementation 

uses Unit2;
Pues no funciona, 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 puedo acceder sin problemas a los objetos del Form1.

Debo cometer algun error que no consigo ver.

Utilizo Delphi XE i Windows XP

roman 29-07-2011 18:10:56

Y, ¿de qué manera intentas acceder a Form2 desde Form3? Yo creo que estás trantando de hacerlo usando la variable que crea delphi por defecto cuando añades un formulario a tu aplicación, pero cuando creas tu Form2 desde el principal, no estás usando dicha variable sino un objeto creado al vuelo.

// Saludos

adrall 29-07-2011 18:38:10

Al crearse el Form2 se declara la variable:
Código Delphi [-]
var
  Form2: TForm2;
Todos las propiedades/funciones/etc. de ese Form creado en ejecucion se acceden sin problemas así:
Código Delphi [-]
  Form2.Funcion/Procedimiento/Propiedad ...;
Lo que no comprendo es porqué no puedo acceder a ellas desde el Form3 creado también en ejecución.

maeyanes 29-07-2011 18:45:04

Hola...

Ya te comentó román el por qué. Si en ningún momento en tu código haces:

Código Delphi [-]
Form2 := TForm2.Create(nil);

Entonces al querer hacer:

Código Delphi [-]
Form2.Show;

Vas a obtener una bonita excepción en tiempo de ejecución.


Saludos...

roman 29-07-2011 18:48:54

Cita:

Empezado por adrall (Mensaje 407916)
Todos las propiedades/funciones/etc. de ese Form creado en ejecucion se acceden sin problemas así:
Código Delphi [-]
  Form2.Funcion/Procedimiento/Propiedad ...;

Si esto fuera cierto entonces no habrías aberto este hilo. Obviamente sí tienes problemas.

Lo que debes entender es que no es lo mismo el form que se declara al añadir el formulario, que el que estás creando en TForm1.Button1Click. Otra cosa sería si pusieses:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(self);

with Form2 do
   begin
   ShowModal;
   Free;
   end;
end;

Porque aquí sí estás asignando a la variable Form2 el objeto que creas.

// Saludos

adrall 29-07-2011 19:19:04

Aaaah! Claro! Ahora lo entiendo (bueno, más o menos), si declaro la variable Form2 en la Unit1 si que puedo acceder desde otras Unit.

Muchas gracias por su ayuda.

Saludos

ecfisa 30-07-2011 10:15:24

Hola adrall.
Cita:

Ahora lo entiendo (bueno, más o menos)
Lo que te explica román está clarísimo, tu código inicial es:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   with TForm2.Create(self) do
   begin
     ShowModal;
     Free;
   end;
end;
Se crea una instancia de la clase TForm2, pero no fué asignada a ninguna variable, no hay forma de referenciarla si no es dentro del width de ese procedimiento.

Ahora comparalo con el código de román:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2.Create(self);
  with Form2 do
  begin
     ShowModal;
     Free;
  end;
end;
Ahora sí podes referenciar la instancia mediante la variable Form2.



Cita:

si declaro la variable Form2 en la Unit1 si que puedo acceder desde otras Unit
Siempre que esté declarada en la sección de interface de la Unit1 y la otras unidades incluyan a Unit1.

Un saludo.


La franja horaria es GMT +2. Ahora son las 19:15:28.

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