FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Ayuda: Control Has No Parent Window
Hola a todos, estoy incursionando en Delphi(7) y tengo el siguiente problema:
Estoy tratando de crearme un componente que hereda de TComboBox. La idea es poder utilizar todas las funcionalidades del Combo, pero además estoy creando unas funciones para poder agregar valores a la propieded Object de cada Item. Esto con el fin de rescatar estos valores(dependiendo del item seleccionado) y realizar algunas taras con ese valor. De acuerdo al código que he hecho, esto funciona, pero cuando cierro el formulario que contiene mi control, se dispara el Destroy de mi componente y cuando trato de accesar los Items, la aplicación me arroja el mensaje '.....has no parent windows'. Agragdeceré cualquier ayuda al respecto...... Este el código del control que estopy haciendo: Gracias....... Última edición por jachguate fecha: 20-12-2005 a las 00:21:53. |
#2
|
||||
|
||||
Hola pelaorb68, bienvenido(a) al ClubDelphi.
He editado tu mensaje para añadir la etiqueta [delphi]. Su uso es obligatorio aqui para publicar fragmentos de código, y estarás de acuerdo conmigo que la presentación del mismo ahora es mucho mas legible que en la versión original del mensaje. Te invito a leer la guia de estilo y la ayuda sobre el uso de estas etiquetas (vínculos en mi firma). Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
||||
|
||||
Hola,
Tal vez podrías valerte del método protegido "Notification", que "TComboBox" hereda de "TComponent". Sobreescribe este método en tu componente y estáte atento a sus parámetros: entre otras cosas, mediante este método, se avisará a tu componente de que va a ser "removido": es ahí acaso donde tienes que hacer lo que te sea preciso, mejor que en "Destroy". Adéntrate un tanto en la ayuda de "TComponent" y su método "Notificacion". De todos modos deja que te diga que no estoy muy puesto en todo esto: un vistazo a los métodos que "TComponent", "TWinControl", "TControl", "TObject"... en definitiva, no olvidar la jerarquía de clases: darte cuenta de que puedes aprovecharte de métodos y propiedades que se implementan en clases de las que, directa o indirectamente, hereda tu componente. Lamentaría mucho que te hubiera confundido más que otra cosa. |
#4
|
||||
|
||||
Hola pelaorb68
Creo que, para solucionar el error de 'Control Has No Parent Window', basataría con esto: Espero que te sirva... y ¡bienvenido! Saludos.
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#5
|
|||
|
|||
Ohchan, gracias por tu respuesta pero cuando asigno AOwner a ParentWindow, al compilar me arroja el mensaje: Incompatible Types: 'HWND' and 'TComponent'.
Estoy leyendo la ayuda de Delphi para entender la propiedad ParentWindow.... |
#6
|
|||
|
|||
Dec, gracias por tu ayuda. Agregué el método Notification. Ahora, puse en un formulario, solamente el Combo. Cuando cierro el formulario, se dispara el 'Notification', en él logro detectar que es opRemove, pero no sé como evaluar que componente(AComponent) es el que viene indicado en sus parámetros, ya que la primera vez que entra AComponent no es del tipo TRBComboBox. La segunda vez que entra si lo es, pero me arroja error al querer evaluar los Items.
El procedimiento es el sgte:
|
#7
|
||||
|
||||
Un ejemplo significado
Bueno... me he creado un ejemplo simplificando:
Y cuando creo el objeto: Si quito lo que está marcado en rojo... me da el mismo error que en tu código... Espero que te sirva de pista Ya nos contarás...
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#8
|
||||
|
||||
Pero tú estás creando un objeto TStrings distinto.
Buscando en los foros de Borland veo que el problema al parecer radica en que los strings de un combobox realmente pertenecen al sistema y para cuando se llama a Destroy, estos items ya no existen. Al no existir, el control intenta crearlos de nuevo, lo cual ya no puede hacer porque el Handle del combo ya no existe. Vi una solución que al parecer funciona pero habrá que probarla más a fondo. Consiste en definir un manejador para el mensaje WMDestroy y liberar ahí los objetos:
// Saludos |
#9
|
||||
|
||||
Cita:
Al recorrer paso a paso depurando me encontraba que Items estaba vacío (en el Destroy)... ahora sabemos porqué
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin) |
#10
|
|||
|
|||
Roman, gracias por tu respuesta, se ve genial la solución, pero te comento que estoy hace poco incursionando en Delphi, por lo tanto, no sé cómo puedo implementar tu ayuda..?????
De todas formas, mil gracias.... |
#11
|
|||
|
|||
Roman, he revisado nuevamente el código que pusiste y me he dado cuenta que me faltó incluir la Unit Messages en el Uses. He compilado y funciona perfectamente, es decir, libera los objetos de todos los controles(RBCombobox) que posea el formulario.
Mil Gracias a ti y a todos los que respondieron a mis dudas...... |
|
|
|