Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Repetir varios controles en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=5234)

Feñiz 13-11-2003 19:47:52

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.

roman 13-11-2003 19:55:29

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

delphi.com.ar 13-11-2003 19:58:11

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!

Feñiz 13-11-2003 20:25:54

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?

roman 13-11-2003 20:38:23

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

delphi.com.ar 13-11-2003 20:39:31

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 13-11-2003 20:40:29

Roman!!!.. esa manía de responder a coro!! :D

Saludos!

roman 13-11-2003 20:49:51

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'

:D

delphi.com.ar 13-11-2003 20:58:19

:eek: Ups.. Error de sintaxis!!, eso me pasa por escribir directamente en el foro :p

Código:

for i := 0 to PageControl1.PageCount-1 do
  with TFrame1.Create(Self);
  begin
    Parent := PageControl1.Pages[i];
    Align  := alClient;
  end;


Feñiz 13-11-2003 21:17:42

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?

roman 13-11-2003 21:28:08

Frame.Edit

// Saludos

Feñiz 14-11-2003 10:41:16

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.


La franja horaria es GMT +2. Ahora son las 17:36:09.

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