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-09-2005
CAOS CAOS is offline
Registrado
 
Registrado: mar 2005
Posts: 9
Poder: 0
CAOS Va por buen camino
Creación de componentes

Estoy creando un componente que he derivado de TPanel. Lo único que hace es crear dos paneles dentro de él con las propiedades altop y alclient.
Cuando desde diseño se insertan componentes dentro de uno de los dos paneles que contiene mi nuevo componente al ejecutarlo pierdo estos componentes introducidos.
Sé que es lógico que pase porque en el create del componente creo los dos paneles desde el inicio.
Mi pregunta es: ¿Hay alguna manera de no perder estos componentes incrustados en diseño cuando ejecuto o de mantenerlos en algún sitio para luego añadirlos?
Responder Con Cita
  #2  
Antiguo 13-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Dame codigo
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #3  
Antiguo 13-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
Lamentablemente, no se puede hacer lo que quieres. Una alternativa es, en vez de crear un componente, usar la clase TFrame y meter ahí los dos paneles que necesitas (mas otros componentes que pudieras necesitar). Por último, habría que añadir este frame en todos los formularios que lo vayan a utilizar, y con esto conseguimos la reutilización de código casi igual que si hubieramos creado un componente específico.

Saludos!

Última edición por jmariano fecha: 13-09-2005 a las 21:24:12.
Responder Con Cita
  #4  
Antiguo 14-09-2005
CAOS CAOS is offline
Registrado
 
Registrado: mar 2005
Posts: 9
Poder: 0
CAOS Va por buen camino
Te agradezco la idea, pero he trabajado bastante con frames y para este caso no es lo que necesito.

Realmente lo que quiero es que mi componente funcione de contenedor al igual que lo hace un TPanel.

Voy a explicarlo de otra manera, igual queda más claro:

Si derivo un componente de TPanel (vamos a llamarlo MiPanel) y en tiempo de diseño le añado componentes (un label, por ejemplo), al ejecutarlo sigue conteniendo estos componentes añadidos (en nuestro caso, el label).

Pero si a mi componente (MiPanel) le añado en el create otro panel (Panel1) y en tiempo de diseño le añado otros componentes al Panel2 (esta vez quien contiene el label no es mi componente sino Panel2), cuando lo ejecuto como en el create del componente de mi componente (MiPanel) se crea de nuevo el panel Panel1 pierdo estos componentes. Hay alguna manera de guardar estos componentes insertados en el Panel1 para poder añadirlos en el create y que no me desaparezcan.

No se si queda más claro, pero más o menos es lo que quiero hacer.
Responder Con Cita
  #5  
Antiguo 14-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por CAOS
(...) en tiempo de diseño le añado otros componentes al Panel2 (esta vez quien contiene el label no es mi componente sino Panel2 (...)
Eso no es del todo correcto. Si en lugar de dos paneles (y a modo de pruebas) añades solamente uno de ellos, concretamente el que queda ocupando la parte superior de tu componente, verás que puedes añadir controles a tu componente (el panel principal, por llamarlo así) y verás, si miras el formulario "en modo de texto" (1) cómo los controles que añadas lo hacen dentro de tu componente.

Sin embargo, si añades algún control en el panel "superior" que creaste dentro de tu componente (el panel principal) y vuelves a mirar el formulario "en modo de texto" verás que no se ha añadido ningún control al mismo, ni dentro de tu componente ni fuera del mismo. De hecho, cuando vuelvas a mostrar el fomulario "normalmente" el control que hubieras añadido ya no estará ahí: solamente quedará su declaración, que habrá de borrarse, si se quiere compilar...

¿Porqué pasa eso? No tengo idea. He estado toda la tarde dándole vueltas al asunto que te ocupa porque me llamó la atención. He probado de varias formas. Cuando jmariano respondió que era algo que no era posible, a punto estuve de responder para preguntarle porqué no era posible, es decir, si conocía el motivo por el cual no podía lograrse esto que trataba de hacerse...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 14-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
Como ya te comenté, no se puede hacer lo que quieres porque ese "Panel2" pierde la capacidad de almacenar "subcomponentes" de forma persistente. Verás que ni siquiera se almacena en el archivo de recursos del formulario, .dfm, las propiedades "published" de "Panel2" (como comenta dec), aunque esto se podría solucionar creando una propiedad "published" que apunte a "Panel2" e invocando, para dicho control, el método "SetSubComponent" (pasándole el parámetro "True") en el constructor de la clase, pero la capacidad de poseer subcomponentes y que estos sean persistentes se pierde (esto se debe a como se maneja el almacenamiento de las propiedades en el archivo de recursos del formulario .dfm).

Saludos!

Última edición por jmariano fecha: 14-09-2005 a las 01:35:44.
Responder Con Cita
  #7  
Antiguo 14-09-2005
CAOS CAOS is offline
Registrado
 
Registrado: mar 2005
Posts: 9
Poder: 0
CAOS Va por buen camino
dec veo que has hecho las mismas pruebas que yo. Y estoy como tú, si es como dice jmariano que no se puede, por qué con un TPanel si que es posible?
Responder Con Cita
  #8  
Antiguo 14-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno, supongo que no es posible por lo que jmariano dice:

Cita:
Empezado por jmariano
(...) esto se debe a como se maneja el almacenamiento de las propiedades en el archivo de recursos del formulario .dfm
Otra cosa es que no deje de extrañarme, pero, es cierto lo que dije más arriba: si añades un control al "panel2" verás cómo este no se refleja en el archivo "dfm", esto es, en realidad no añades el control a ningún sitio...

Cita:
Empezado por CAOS
(...) por qué con un TPanel si que es posible?
Pues no tengo idea cierta, para qué nos vamos a engañar. Me figuro algunas cosas, pero no sabría decirte, exactamente.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 14-09-2005
Avatar de jmariano
jmariano jmariano is offline
Miembro
 
Registrado: jul 2005
Posts: 376
Poder: 19
jmariano Va por buen camino
Cita:
Empezado por CAOS
dec veo que has hecho las mismas pruebas que yo. Y estoy como tú, si es como dice jmariano que no se puede, por qué con un TPanel si que es posible?
El problema está en quien es el propietario de un panel, y sólo los formularios, frames y módulos de datos tienen la capacidad de almacenar todas las propiedades de los subcomponentes que contienen en el archivo de recursos .dfm.

Otra solución, relacionada, precisamente, con esto, es que tus panels internos tengan como propietario el mismo de tu componente (que podría ser un formulario, frame u otro panel) y que el padre sea tu componente (para que aparezcan dentro de tu componente). Es decir, el "Owner" de tus panels es el "Owner" de tu componente y el "Parent" de tus panels sería tu componente. (Aunque, asegúrate siempre de no volver a crear los panels si ya existen en el propietario).

De esta forma, si conseguirías que se pudieran insertar controles en tus panels y, estos, serían persistentes (no se perderían al ejecutar la aplicación). El único problema es que los panels podrían ser modificados en tiempo de diseño y se podrían eliminar.

Saludos!
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 23:13:43.


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