Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
Question 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.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #2  
Antiguo 24-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 25-07-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
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.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #4  
Antiguo 25-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 25-07-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
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.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #6  
Antiguo 25-07-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
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.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
  #7  
Antiguo 25-07-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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...
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 25-07-2003
CORBATIN CORBATIN is offline
Miembro
 
Registrado: may 2003
Ubicación: España
Posts: 131
Poder: 21
CORBATIN Va por buen camino
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.
__________________
No hay vientos favorables para quién no conoce su rumbo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:02:56.


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
Copyright 1996-2007 Club Delphi