Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como acceder a los componentes de un frame? (https://www.clubdelphi.com/foros/showthread.php?t=2477)

CORBATIN 24-07-2003 23:22:08

Como acceder a los componentes de un frame?
 
Saludos a todos, no sé si el asunto es lo suficientemente explicito, pero por sí las moscas voy a intentar explicaros mi problema.

Estoy creando una aplicación y he empezado a crear lo que sería la ventana de administración de los datos de la BD. La forma de funcionar dicha ventana es con un form que contiene dos paneles, el de la izquierda los botones para acceder a los datos y a la derecha donde cargo los frames.

Estoy utilizando los frames para mostrar las distintas presentaciones según al botón que se pulse, donde tengo una variable de tipo TFrame que es que la que utilizo para crear dichos frames.

El problema me surge, cuando tengo que acceder a los componentes de dichos Frames, por ejemplo a un botón, en un form normal se haría Fnormal.myboton......, pues aquí no lo consigo hacer, de hecho, no sé si utilizar un frame como contenedor estaría bien hecho o no.

En fin, espero que me podaís ayudar y sobre todo alguna guía sobre la utilización de frames y cuando se deben utilizar, gracias.

delphi.com.ar 24-07-2003 23:32:16

Si los dos frames son del mismo tipo, te recomiendo que tu variable no sea del tipo TFrame, sino del tipo de tu frame TMiFrame (o hacer un cast a este tipo), entonces al igual que un TForm accederás a todos sus componentes porque están publicados en su definición .
Otra solución, es trabajar como cualquier TComponent utilizando la propiedad Components (Todos los hijos) o con Controls de los TWinControl.

Saludos!

CORBATIN 25-07-2003 01:15:54

Asi es como creo los frame:

if FFrame <> nil then begin
FFrame.Free;
FFrame := nil;
end;
Fadministrador.caption := txtcaption + txt;
case num of
1:FFrame := TFcomponentes.Create(pnlmostrar);
2:FFrame := TFpersonas.Create(pnlmostrar);
3:FFrame := TFproveedores.Create(pnlmostrar);
4:FFrame := TFenvasado.Create(pnlmostrar);
5:FFrame := TFmaquinas.Create(pnlmostrar);
end;
FFrame.Align := alClient;
FFrame.Parent := pnlmostrar;

Todos los create son de frames distintos y según el indice recibido al procedimiento muestro el correspondiente, creo que lo estoy haciendo bien, aunque además de este método también me has comentado otro, pero ese no se como hacerlo, por eso quería saber si se puede acceder a los componentes de un frame igual que al de un form.

for i := FFrame.ComponentCount-1 downto 0 do begin
MyTabla := FFrame.Components[i];
if (FFrame.Components[i] is TTable) then begin
(MyTabla as TTable).open;
end;
end;

Esto es lo que hago para buscar tablas y abrirlas, pero lo que necesito es hacer que los botones tengan la propiedad enabled activa o no en función de si se esta insertando o editando datos etc.
Nota: Si no te importa comentame si lo que hago es correcto y como se haría así y en la otra opción que me has comentado, gracias por la ayuda.

delphi.com.ar 25-07-2003 16:25:35

Bueno, puedes hacer un cast de un frame a su tipo y acceder a sus componentes:
Código:

TFPersonas(FFrame).edText.Enabled := False;
, una solución por la que yo he optado, es crear una clase abstracta de la cual heredan todos los frames con algunos métodos propietarios. Entonces en cada frame tienes que implementar este método y puedes llamar a este método si tu variable FFrame es del tipo de la clase abstracta.

Saludos!

CORBATIN 25-07-2003 16:37:00

Hola a todos de nuevo, ya se como utilizar las propiedades de component y controls, pero para esto cada vez que tenga que hacer algo sobre algún componente tengo que recorrerlos todos y encontrar el que busco, una vez que accedo a una propiedad entonces según su estado tengo que volver a buscar de nuevo los otros botones para cambiarle la propiedad, ¿esto sería conveniente o ralentizaría la aplicación? ¿es esto lo que me propones?.

Por cierto, he observado una cosa curiosa, resulta que desde los frames si puedo acceder a los componentes y procedimientos del form principal (del contenedor de los dos paneles y todos los frames) pero en cambio desde el from principal no puedo acceder a ninguno de los procedimientos ni componentes de los distintos frames que voy creando. Para aquellos que se las haya ocurrido dire que en el form principal si tengo incluidos las unit de los frames en la claúsula "uses".

Tal vez este aquí el problema que he comentado en mis anteriores post, ¿alguién sabe cuál puede ser el motivo de que me ocurra esto?.

De nuevo os doy gracias a todos y perdón por mi ignorancia. saludos.

CORBATIN 25-07-2003 16:46:11

Vaya, creo que mientras yo escribía mi respuesta tú también lo hacias.

Siguiendo entonces con tú último post, mi pregunta es la siguiente:

Si ya tengo un procedimiento que según el indice me crea el FFrame del tipo del frame que le indico, ¿Por que tengo que hacerle después un cast?.

Esto lo podría entender ya que esta asignación se hace en tiempo de ejecución por lo que en cierta manera sería normal no poder acceder de la forma cotidiana a los elementos de ese frame, ya que en realidad FFrame no tiene asignado nada en tiempo de diseño, pero entonces tengo otra pregunta:

Si escribo esto: Fpersonas.myboton....., ¿Por que me da error y no reconoce el boton si esta dentro de Fpersonas que es su Frame contenedor?.

Ahí van otro mogollón de preguntas, gracias de nuevo y os vuelvo a pedir perdón por mi ignorancia, saludos.

delphi.com.ar 25-07-2003 17:23:07

Cita:

Posteado originalmente por CORBATIN
Si ya tengo un procedimiento que según el indice me crea el FFrame del tipo del frame que le indico, ¿Por que tengo que hacerle después un cast?.
Porque según tu explicación, tu variable FFrame es del tipo TFrame, y TFrame no posee los componentes que posee TFcomponentes. Es como si tu form lo tratas de TForm y no de TMiForm con todos sus componentes.

Cita:

Posteado originalmente por CORBATIN
Esto lo podría entender ya que esta asignación se hace en tiempo de ejecución
No!.. es el tipo de datos que estas tratando!

Cita:

Posteado originalmente por CORBATIN
Si escribo esto: Fpersonas.myboton....., ¿Por que me da error y no reconoce el boton si esta dentro de Fpersonas que es su Frame contenedor?.
¿FPersonas de qué tipo es?

Te recomiendo leer un poco de teoría...

CORBATIN 25-07-2003 21:24:23

Gracias por vuestra ayuda pero ya he encontrado el problema, todo lo que me has dicho esta bien y lo que yo había hecho también, el problema residía en que no sé el motivo pero resulta que al crear el frame no me creaba de forma automática la variable del tipo de la unit, es decir, si creo el frame Fpersonas debería existir una variable Fpersonas sería del tipo TFpersonas y este de TFrame.

Como esto si lo hace de forma automática al crear los forms, me he confiado y no me había fijado en tal cosa, pero al preguntarme por el tipo de Fpersonas, ya sabía que era de TFpersonas que a su vez de TFrame, pero lo he ido a repasar y no encontraba tal variable y me he mosqueado, en definitiva, que al crear los diversos frames no me ha creado la variable del frame de forma automática.

Con respecto a las últimas anotaciones espero estar en lo cierto con lo siguiente:

1º y 2º/ Yo tengo una variable de tipo Frame igual que el resto de los frames con componentes y con este case le asigno su correspondiente frame (con tu tipo y todos sus componentes),
case num of
1:FFrame := TFcomponentes.Create(self);
2:FFrame := TFpersonas.Create(self);
3:FFrame := TFproveedores.Create(self);
4:FFrame := TFenvasado.Create(self);
5:FFrame := TFmaquinas.Create(self);
end;
en tiempo de diseño lo único que yo tengo es una variable de tipo Frame sin nada más asignado, por lo que es normal que no pueda usarla para acceder a los componentes de cualquier otro frame como por ejemplo TFpersonas en tiempo de diseño, por supuesto sin hacer el mencionado cast.

2/Sobre tú último comentario, creo que ya se ha quedado claro
no podía hacer esto Fpersonas.myboton... porque no existía tal variable y por eso no me dejaba hacer este acceso.

Gracias por todo y gracias también por ayudar a que los demás aprendamos nuevas cosas,saludos.


La franja horaria es GMT +2. Ahora son las 01:44:04.

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