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 13-11-2003
Feñiz Feñiz is offline
Miembro
 
Registrado: may 2003
Posts: 20
Poder: 0
Feñiz Va por buen camino
Repetir varios controles en tiempo de ejecución

Quisiera saber si existe una forma para "repetir" varios controles en distintas partes de una ventana.

Me explico: Lo que quiero hacer es una ventana con un TPageControl, que contenga varias pestañas. Dentro de cada pestaña van una serie de controles, en todas los mismos, y con las mismas propiedades.

Lo que pregunto es si hay alguna manera de crear los controles en la primera pestaña, con las propiedades que se necesiten, y luego copiar esos mismos controles en las demás pestañas. Me refiero a hacerlo, evidentemente, en tiempo de ejecución.

¿Y que por qué no lo hago en tiempo de diseño? Muy sencillo. El número de pestañas del TPageControl no es fijo, sino que depende de lo que se le especifique en un archivo de configuración.

¿Alguien puede ayudarme con el tema? Gracias.
Responder Con Cita
  #2  
Antiguo 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Algo rápido que se me ocurre:

Coloca todos los controles de la pestaña en un TFrame y ya durante la ejecución nada más creas un frame por cada pestaña y lo insertas.

// Saludos
Responder Con Cita
  #3  
Antiguo 13-11-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: 27
delphi.com.ar Va por buen camino
Primero te recomendaría utilizar un TTabControl en lugar de un TPageControl, así siempre trabajas con el mismo juego de componentes, evitando utilizar recursos innecesarios.
Si esto no te sirve, porque se te complica mucho la lógica, una opción puede ser armar un TFrame con todo el juego de componentes que tu quieres, y crear en tiempo de ejecución tantas instancias de este TFrame como necesites.
Si esto tampoco te convence, puedes hacer lo que tu quieres, crear los componentes que tiene el primer tab, a ellos puedes acceder a través de la propiedad Components, ir creando uno a uno, asignarle las propiedades del objeto anterior por el método Assign, y cambiarle el parent. La teoría de esto diría que funcionaría pero el método assign no esta implementado en la mayoría de los controles de la VCL, por lo que no te recomiendo esta última opción.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 13-11-2003
Feñiz Feñiz is offline
Miembro
 
Registrado: may 2003
Posts: 20
Poder: 0
Feñiz Va por buen camino
Cita:
delphi.com.ar comentó:
una opción puede ser armar un TFrame con todo el juego de componentes que tu quieres, y crear en tiempo de ejecución tantas instancias de este TFrame como necesites.
Antes de nada gracias por las respuestas, y por la rapidez, sois los mejores

Nunca he trabajado con TFrames antes. He estado mirando la ayuda, y veo que son como ventanas, pero ¿cómo asocio un TFrame con mis pestañas?
Responder Con Cita
  #5  
Antiguo 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Feñiz comentó:
Nunca he trabajado con TFrames antes. He estado mirando la ayuda, y veo que son como ventanas, pero ¿cómo asocio un TFrame con mis pestañas?
Primero que nada usas File|New|Frame para crear un nuevo Frame. Esto creo que ya lo hiciste y has visto que es muy similar a un formulario.

En el frame colocas todas las componentes que requieres.

Finalmente insertas en el formulario una componente Frame, de la paleta "Standard". Al hacerlo te aparecerá una lista con los frames (o mejor dicho, clases de frames) que tengas creados, en este caso sólo uno.

Para crearlos en código bastará algo así:

Código:
with TFrame1.Create(Self) do
  Parent := TabSheet;
donde TabSheet será la pestaña que creas en código.

// Saludos
Responder Con Cita
  #6  
Antiguo 13-11-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: 27
delphi.com.ar Va por buen camino
En tu caso, que las creas dinámicamente:
Código:
for i := 0 to PageControl1.PageCount-1 do
  with TFrame1.Create(Self);
  begin
    Parent := PageControl1.Pages[i];
    Aling := alClient;
  end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 13-11-2003 a las 20:41:53.
Responder Con Cita
  #7  
Antiguo 13-11-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: 27
delphi.com.ar Va por buen camino
Roman!!!.. esa manía de responder a coro!!

Saludos!
__________________
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 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
delphi.com.ar comentó:
Código:
for i := 0 to PageControl1.PageCount-1 do
  with TFrame1.Create(Self);
  begin
    Parent := PageControl1.Pages[i];
    Aling := alClient;
  end;
[Error] Unit1.pas (): Undeclare identifier: 'Aling'
[Fatal Error]Project1.dpr(): Could not compile used unit in 'Unit1.pas'

Responder Con Cita
  #9  
Antiguo 13-11-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: 27
delphi.com.ar Va por buen camino
Ups.. Error de sintaxis!!, eso me pasa por escribir directamente en el foro

Código:
for i := 0 to PageControl1.PageCount-1 do
  with TFrame1.Create(Self);
  begin
    Parent := PageControl1.Pages[i];
    Align  := alClient;
  end;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #10  
Antiguo 13-11-2003
Feñiz Feñiz is offline
Miembro
 
Registrado: may 2003
Posts: 20
Poder: 0
Feñiz Va por buen camino
Gracias de nuevo.

Pero hay algo que todavía no me ha quedado claro del todo. ¿Cómo accedo luego a los componentes que he metido en el frame?

Por ejemplo, si en el frame hay un Edit, habrá luego un edit en cada pestaña. ¿Cómo me refiero a ellos entonces?
Responder Con Cita
  #11  
Antiguo 13-11-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Frame.Edit

// Saludos
Responder Con Cita
  #12  
Antiguo 14-11-2003
Feñiz Feñiz is offline
Miembro
 
Registrado: may 2003
Posts: 20
Poder: 0
Feñiz Va por buen camino
Gracias de nuevo, Román.

A ver, os pongo cómo lo he hecho al final, a ver qué os parece:

Código:
Uses Frames;

[...]

var Controles: array of TFrame1;

[....]
          {Dimensiono el array de controles}
SetLength(Controles,PageControl1.PageCount);
          {Creo un Frame para cada pestaña del PageControl}
for contador:=0 to Pagecontrol1.PageCount -1 do
  begin
  Controles[Contador]:=TFrame1.Create (Form1) {El Self no me funciona}
  Controles[Contador].Parent:=PageControl1.Pages[Contador];
  Controles[Contador].Align:=alClient;
  Controles[Contador].Name:='Controles'+inttostr(Contador);
  end;
De esta forma puedo acceder luego a cada uno de los controles de cada página utilizando el array Controles.

Así funciona, lo que no sé si es la forma correcta de hacerlo, o si hay una forma mejor. Vuestras opiniones y críticas serán bienvenidas Gracias por vuestra paciencia.
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 12:54:21.


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