PDA

Ver la Versión Completa : Problema al acceder a los controles dentro de un TFrame


Ledian_Fdez
21-03-2011, 16:11:15
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.

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:

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:

PrincipalForm.JvXPBar5.Collapsed := false;

Pero no de la mismo forma con BodegaFrame. XXX


Lo he intentado con:
miFrame.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'miFrame'
BodegaFrame.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'BodegaFrame'
PrincipalForm.ListViewBodega
[Error] ActBodega.pas(154): Undeclared identifier: 'ListViewBodega'
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:

type
PrincipalForm= class(TForm)
...
private
miFrame : TFrame;
...
end;

o
type
PrincipalForm= class(TForm)
...
public
miFrame : TFrame;
...
end;

Aunque también puede declararse fuera como una variable más:
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:

type
PrincipalForm= class(TForm)
...
end;

var
miFrame : TFrame;

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

PrincipalForm.miFrame

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

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.

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


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
Gracias amigos era solo eso lo que faltaba ...