FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
constructor...propiedad heredada
Pues tengo definido un constructor para una clase que hereda de TPanel,y al intentar inicializar alguna de las propiedades heredadas me da error
La llamada al constructor...
¿es que no se puede hacer ó es q lo estoy haciendo mal? Gracias |
#2
|
||||
|
||||
Hola,
Siempre que escribas en el Foro diciendo que te aparece un determinado error, por favor, especifica cuál es el mismo, puesto que de ese modo contribuirás a la posible solución que pueda ofrecérsete. Creo que el error que tienen, en este caso, debe ser un "Access Violation", porque, tú tienes una clase que hereda de "TPanel" e implementas un constructor para tu clase, pero, ¿qué pasa con "TPanel"? Estás tratando de acceder a la propiedad de un objeto que no fue creado aún. No tengo Delphi ahora mismo a mano, pero, prueba a llamar en el constructor de tu clase al constructor de "TPanel", más o menos así: Pero, tal como lo expongo tampoco funcionará, porque creo recordar que "TPanel" necesita un "Owner" en su contructor, de tal modo que tendrías que proporcionárselo, ora lo incluyas como parámetro en tu constructor, ora le pases un "nil" como "Owner". Si haces esto último asegúrate de liberar objeto y el "TPanel" en un destructor de tu "TBarco", por ejemplo. Aún así (disculpa que me enrolle tanto) es posible que no te funcione pasar un "nil" como "Owner" del "TPanel". No lo sé ahora mismo. No lo recuerdo. Prueba a ver, de todos modos y nos dices qué tal. |
#3
|
||||
|
||||
Saludos
Cita:
__________________
Van Troi De León (Not) Guía, Code vB:=Delphi-SQL, ¿Cómo? Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto! |
#4
|
||||
|
||||
Hola,
Cita:
A ver, supongamos el siguiente código fuente: Ahí tenemos una clase que hereda de "TPanel" y añade una "Propiedad" a esta última. Ahora bien, en el constructor de la clase "TPanelEx"... ¿dónde se crea el propio "TPanel"? En ningún sitio, luego, si tratamos de acceder a la propiedad "Caption", que es de la clase "TPanel", obtendremos una violación de acceso muy linda. ¿Entonces? Pues tenemos que llamar al constructor de la clase "TPanel" desde el constructor de la clase "TPanelEx". Hasta aquí lo normal, pero, ¿qué ocurre con el constructor de "TPanel"? Pues que necesita un parámetro "Owner", de tipo "TComponent". Es decir, que no podría hacerse simplemente así: ¿Y qué podemos hacer? Bien. Puesto que "TPanel" cuenta con un constructor que necesita un parámetro de tipo "TComponent", démosle ese parámetro a partir de uno en el constructor de "TPanelEx", más o menos así: ¿Se entiende ahora mejor o sigo explicándome como el culo? Je, je, je. |
#5
|
|||
|
|||
Gracias a los dos.
La solución que ha propuesto dec me funciona bien.
Esa explicación me aclara,creo,algunas cosillas Por lo que voy entendiendo,la necesidad de destruir "a mano" el TPanel creado se hace patente al no tener por ejemplo un owner de tipo Tform que destruya todos sus objetos contenidos cuando lo cerramos ¿es correcto? Todo esto sería automático si el objeto contenido fuera por ejemplo un atributo del objeto contenedor,tanto creación como destrucción ¿no? |
#6
|
||||
|
||||
Hola,
Cita:
Cita:
|
#7
|
|||
|
|||
Me refiero a lo siguiente:
Ahora mi clase tiene un atributo Timage:
Tal y como está implementado el tema,si yo llamo a barco.crear(x,x,x,x,x) ¿se llama automáticamente al constructor de imagen? |
|
|
|