FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
Hola,
Cita:
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... |
#3
|
||||
|
||||
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. |
#4
|
|||
|
|||
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?
|
#5
|
||||
|
||||
Hola,
Bueno, supongo que no es posible por lo que jmariano dice: Cita:
Cita:
|
#6
|
||||
|
||||
Cita:
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! |
#7
|
||||
|
||||
Hola,
Cita:
Cita:
|
#8
|
||||
|
||||
Buenas!
Dónde tienes el código para la creación de los 2 paneles? En el onCreate del componente? Si es así, prueba a instanciar el Oncreate de tu componente, asegúrate que lleva la instrucción inherited para que llame al oncreate del padre y debuga para ver si en ésta instrucción entra a crear los 2 paneles que no te aparecen! Un saludo Edu |
#9
|
||||
|
||||
Cita:
Quizá es fácil pero hasta el momento no veo como lograr esto. Cuando se usa "View as text" y luego "View as form" el constructor Create se ejecuta antes de leer el dfm creando una instancia de los paneles interiores que nunca serán las que contengan componentes insertadas en diseño. Posiblemente redefiniendo DefineProperties, no lo sé. Creo que es demasiada complicación para algo que se resuelve con Frames (hasta ahora no he visto la razón para no usarlos). // Saludos |
#10
|
|||
|
|||
La verdad es que un compañero mío ha intentado crear el componente a partir de Frames y el problema es el mismo.
|
#11
|
||||
|
||||
Cita:
Pongo un ejemplo que construí para la ocasión:
Si lo probáis veréis que se crea un panel con dos paneles en su interior y que se pueden añadir controles en ambos paneles sin que se pierdan en ejecución. Tambien vereis, si visualizais el formulario como texto, que los controles añadidos forman parte del formulario (gracias a esto se mantiene la persistencia) y que, al volver a la vista de formulario normal, no ocurre el error de que tal panel ya existe (gracias a la comprobación que hacemos en el metodo "CrearPanels"). La desventaja, como ya dije, es que se pueden modificar los paneles en diseño y eliminar ( aunque siempre que la aplicación se ejecute los paneles aparecerán). Cita:
Cita:
Ten encuenta que un frame casi se comporta como si fuera un componente más. Fíjate que, incluso, cuando lo añadimos a un formulario pareciera que añadimos un control normal. Si tu problema para usar los frames es porque necesitas propiedades en tiempo de diseño (es decir, propiedades que aparezcan en el inspector de objetos) te comento que puedes crearlas, aunque tendrás que realizar alguna operación especial (comentame si es por esto y te digo como hacerlo). Saludos! |
|
|
|