![]() |
No muestra mi componente
Hola foro.
El problema que tengo es el siguiente: estoy desarrollando un componente reloj que hereda de TLabel y mustra la hora (muy facil, nada complicado), ahora el problema es cuando quiero crear dentro de este componente otro que se cree con él, por ejemplo un TPanel (solamente porque queda bonito), ahora lo que hago es lo siguiente: en el Constructor del TLabel creo el TPanel...todo bien, me compila y todo, pero cuando voy a probarlo... ¡el TPanel no aparece!. Encima también creo un TTimer que funciona perfectamente, no se mas que probar...!!!:confused: El constructor es el siguiente: Constructor TLabelTimer.Create(AOwner : TComponent); Begin inherited Create(AOwner); pnlFondo := TPanel.Create(AOwner); pnlFondo.Top := Self.Top; pnlFondo.Left := Self.Left; pnlFondo.Height := Self.Height; pnlFondo.Width := Self.Width; pnlFondo.Parent := Self.Parent; end; En estos dias estuve haciendo otro componente que también tenía que crear otro componente (en este caso era con dos TShape) y tampoco pude hacerlo, la verdad es que no se me ocurre nada... Muchas gracias Saludos Diego Valcarce |
Hola:
Prueba a poner pnlFondo.Visible := TRUE; a ver si así aparece; por cierto todos esos Self sobran, no veo que haya ningún conflicto de ámbito de variables. |
Asi tampoco
Si, eso lo probé también, pero me sigue sin aparecer, no se por qué será...
Igualmente muchas gracias... |
Código:
El constructor es el siguiente: |
Cita:
// Saludos |
Cita:
No obstante, esta linea Código:
pnlFondo.Parent := Self.Parent; |
Cita:
// Saludos |
Je, je, cadetill. ¿Te has percatado de que la frase
"hace que el padre del objeto pnlFondo sea el padre de TLabelTimer" tiene dos sentidos? O el padre de TLabelTimer pasa a ser el padre de pnlFondo o el padre de pnlFondo pasa a ser el padre de TLabelTimer. Cosas del lenguaje :) // Saludos |
Cita:
jejejejeje ;) |
Cita:
ahora, porque yo me fui con la segunda opción y tuve que corregir el mensaje anterior donde te corregía. :D |
En todo caso, si lo que se pretende es que la etiqueta aparezca dentro del panel... yo cambiaria la herencia, de manera que el nuevo componente herede del TPanel, y en su creación se fabrique una etiqueta que mostrará la hora... o simplemente que muestre la hora en su propiedad Caption.. que es casi una etiqueta... no???
Hasta luego. ;) |
El problema era otro
Muchas gracias a todos por responderme, pero la verdad es que el problema era otro...
Todo eso que me dijeron yo lo había probado (eso de jugar con los parents) pero me lo seguia sin mostrar como mínimo, pues hasta en algunos casos hasta me tiraba error:( . Lo que dice jachguate es totalmente verdadero, el componente no sirve para nada y se podría haber hecho uno que herede de TPanel y tocar su propiedad Caption, pero el tema es que yo lo estoy haciendo mas que nada para aprender y no sabía porque no se mostraba, hasta que me mandaron una erspuesta de otro foro que me resultó: El tema es que cuando le asigno las propiedades de Self.Top, Self.Left, etc. estas propiedades todavía no tienen un valor (ya que el componente se esta creando), solamente por eso es que no se mostraba, ya lo corregí y ahora funciona perfectamente...:p Igualmente muchisimas gracias a todos, nuevamente. |
Me parece que estas cometiendo un error al hacer:
Código:
pnlFondo.Top := Self.Top; Código:
pnlFondo.Top := 0; Otra opción puede ser trabajar con BoundsRect y ClientRect o con la propiedad Align := alClient! Saludos! |
Cita:
// Saludos |
Cita:
Saludos! |
Cita:
De cualquier manera ya haré la prueba pues realmente me intriga ver qué aspecto tiene una cosa así. Para Diegoval que dijo: Cita:
// Saludos |
Ahora entiendo menos...
El tema es el siguiente:
El ejemplo que yo puse (un TLabel con un TPanel) es medio tonto y la verdad es que por si no funciona para nada... pero me sierve para probar como hacer para crear un componente visual dentro de otro tambien visual... por ejemplo... Yo quiero hacer un componente que represente un cuadrado dentro de otro y luego unir los vertices superior izuierdo del mas grande con un superior izquierdo del mas chico y asi...(lo que simularía un diente en la planilla odontológica) para despues capturar el mensaje click y hacer lo que corresponda segun en que area del diente clickee... ahora viene el problema de cómo hacerlo. A mi se me ocurrio heredar de un TShape y luego crear otro TShape para ponerlo dentro y luego hacer las lineas que unan los vértices. Bueno, el tema es que se cómo hacer para crear un componente desde otro componente, o sea, la pregunta sería como hacer para hacer eso? Lo anterior (del componente TLabel y el TPanel) lo solucioné asignando las propiedades Left, Top, etc. del panel en el evento Paint del Label y no en el Create. (Igualmente no me funcionó del todo bien, seguramente no se debe hacer asi...) La verdad me parece tan sencillo que no se por qué no me sale, pero tampoco se me ocurren soluciones alternativas para crear un diente...!!! |
Permíteme hacerte unos comentarios:
De verdad me parece estupendo que desees aprender y siempre es útil trabajar a prueba y error- a veces no queda más remedio. Pero también es muy recomendable que se tome uno un tiempo alejado del ordenador para leer la documentación. En tu caso, ya que deseas escribir componentes te recomiendo que leas el apartado Component Writer's Guide. No se trata de que lo entiendas todo de una sóla vez pero sí de que te des una idea del tipo de cosas que se involucran. Por ejemplo, encontrarás ahí la información acerca del método Loaded, que sirve precisamente para inicializar valores que dependen de que las propiedades de la componente ya estén cargadas. Asímismo te darás una idea general de que son los controles contenedores y porque entonces no es una buena idea tratar de meter una componente en un TLabel. // Saludos |
Solo añadir a lo que comenta Román, que también sería bueno que mirases en Google y buscases "curso de creación de componentes". Te saldrán cantidad de enlaces interesantes.
Uno de los que más me ha gustado (no los he mirado todos) es este , un documento en PDF de 105 páginas ;) |
Cita:
Código:
Constructor TLabelTimer.Create(AOwner : TComponent); Código:
constructor TCustomLabel.Create(AOwner: TComponent); Código:
pnlFondo.Parent := Self.Parent; Cita:
¡Hasta pronto! Al González :). Los negocios se deben ajustar a las capacidades humanas, no las capacidades humanas a los negocios. Por una vida laboral sana ;). |
La franja horaria es GMT +2. Ahora son las 21:55:35. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi