Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema al acceder a los controles dentro de un TFrame (https://www.clubdelphi.com/foros/showthread.php?t=72939)

Ledian_Fdez 21-03-2011 16:11:15

Problema al acceder a los controles dentro de un TFrame
 
Hola chicos de este foro:

Les cuento que estoy haciendo una aplicación con del delphi7 y en mi formulario principal se me ha ocurrido crear de forma dinámica unos frame como les muestro.

Código Delphi [-]
procedure TPrincipalForm.JvXPBar5ItemClick(Sender: TObject;
  Item: TJvXPBarItem);
begin
 LiberarFrame;
 Case Item.Index of
   0:begin    // Bodegas
      miFrame:=TBodegaFrame.Create(nil);
     end;
   1:begin    // Nucleos
      miFrame:=TNucleosFrame.Create(nil);
     end;
   2:begin    // Consumidores
      miFrame:=TConsumidoresFrame.Create(nil);
     end;
 End;
 miFrame.Parent:=Panel1;
 miFrame.align:=alClient;
end;

y los libero a través de este procedimiento:

Código Delphi [-]
procedure TPrincipalForm.LiberarFrame();
begin
 if assigned(miFrame) then
   begin
    miFrame.Free;
    miFrame:= nil;
   end;
end;

Hasta ahí todo sin problema, pero ... a la hora de acceder a algunos de los componentes de esos Frame, digamos por ejemplo un TListView desde otro formulario ahi me da error, mejor dicho no he podido lograr concretar la linea de código.

Ya estan agregadas las uses Bodegas y Principal
al formulario Principal puedo acceder sin problema por ejemplo:

Código Delphi [-]
PrincipalForm.JvXPBar5.Collapsed := false;

Cita:

Pero no de la mismo forma con BodegaFrame. XXX

Lo he intentado con:
Código Delphi [-]
miFrame.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'miFrame'
Código Delphi [-]
BodegaFrame.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'BodegaFrame'
Código Delphi [-]
PrincipalForm.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'ListViewBodega'
Código Delphi [-]
PrincipalForm.BodegaFrame.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'BodegaFrame'

Amigos mios no se que hacer ademas de alarme los pelos !!!

Si alguien me pudiera ayudar se los iba agradecer

Mil gracias de antemanos,
Salu2.

duilioisola 21-03-2011 17:12:23

¿Cómo declaras miFrame?

Supongo que es una propiedad del formulario principal:

Código Delphi [-]
type
  PrincipalForm= class(TForm)
  ...
  private
  miFrame : TFrame;
  ...
  end;
o
Código Delphi [-]
type
  PrincipalForm= class(TForm)
  ...
  public
  miFrame : TFrame;
  ...
  end;
Aunque también puede declararse fuera como una variable más:
Código Delphi [-]
type
  PrincipalForm= class(TForm)
  ...
  end;

var
  miFrame : TFrame;

Si es de la primera manera no podrás verlo, porque es una propiedad privada del form PrincipalForm.

Si es de la segunda, deberás llamarlo de la siguiente manera, cuando lo llames desde otro formulario, como parece ser el caso.
PrincipalForm.miFrame.ListViewBodega;

Si es de la tercer manera, debería funcionar como lo has hecho.
miFrame.ListViewBodega

Ledian_Fdez 24-03-2011 13:19:55

Hola delphianos, les comento que tengo declarado el frame de esta forma:

Código Delphi [-]
type
  PrincipalForm= class(TForm)
  ...
  end;

var
  miFrame : TFrame;

Acá puedo acceder a el como bien decía duilioisola así:

Código Delphi [-]
PrincipalForm.miFrame

Lo que no puedo acceder a los controles que ella contiene, digamos por ejemplo Labels, ListView, Button ...

Código Delphi [-]
PrincipalForm.miFrame. ListViewBodega;
Undeclared identifier: 'ListViewBodega'

Podría ser de que como miframe se crea en tiempo de ejecución, hasta el momento el no tenga realmente el contenido de TBodegaFrame.

Código Delphi [-]
procedure TPrincipalForm.JvXPBar5ItemClick(Sender: TObject;
  Item: TJvXPBarItem);
begin
 LiberarFrame;
 Case Item.Index of
   0:begin    // Bodegas
      miFrame:=TBodegaFrame.Create(nil);
     end;
   1:begin    // Nucleos
      miFrame:=TNucleosFrame.Create(nil);
     end;
   2:begin    // Consumidores
      miFrame:=TConsumidoresFrame.Create(nil);
     end;
 End;
 miFrame.Parent:=Panel1;
 miFrame.align:=alClient;
end;

Lo que si es cierto es que aun no logro acceder a sus controles para interactuar con ellos, digamos por ejemplo que es el caso que me ocupa:

Desde el TBodegaFrame (miframe) llamo a otro formulario ProcesaBodegaForm donde desde el me van a introducir unos datos con los cuales luego de validarlo y procesarlo muestro el resultado en el ListViewBodega.

en espera de sus comentarios y respuestas,
y miles de gracias de antemano...

Lo saluda,
Yo.:confused:

duilioisola 24-03-2011 14:44:35

Supongo que lo que te falta entonces es un cast

Código:

TBodegaFrame ( PrincipalForm.miFrame ) .ListViewBodega;
miFrame es del tipo TFrame.
TFrame tiene nombre, Parent, y otras propiedades comunes a todos los objetos, pero no tiene las de TBodegaFrame.
Cuando creas miFrame le dices que es del tipo TBodegaFrame.
Cuando llamas a sus propiedades, debes decirle que mire los datos como un si fuera TBodegaFrame.

Ledian_Fdez 24-03-2011 16:36:32

Ok
 
Gracias amigos era solo eso lo que faltaba ...


La franja horaria es GMT +2. Ahora son las 12:06:41.

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