Ver Mensaje Individual
  #6  
Antiguo 28-07-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Componentes con el mismo nombre en clase padre e hija

¡Hola a todos!

Janlo: Conozco el fenómeno. Me ha sucedido en algunas ocasiones, en todas ellas involucrada la herencia visual (o plantillas) de Delphi.

Supongamos que tienes una forma F1 y una forma F2 que deriva de F1 (TF2 es clase hija de TF1, por lo tanto hereda todo lo que TF1 contenga).

El programador 1 agrega un componente de nombre "Matri" a F2 y luego guarda y cierra el proyecto.

Posteriormente viene el programador 2, quien abre el proyecto y su forma plantilla F1 y, sin estar abierta la forma F2, agrega a F1 un nuevo componente de nombre "Matri" o cambia por "Matri" el nombre de alguno de los componentes ya existentes en esa forma. Luego guarda y cierra el proyecto.

Más tarde regresa el programador 1, abre el proyecto e intenta abrir la forma F2. ¿Qué pasa? Delphi se da cuenta que la forma F2 es de clase (TF2) hija de TF1; por lo tanto, primero carga los elementos que le fueron definidos en tiempo de diseño a F1, entre ellos el objeto "Matri" (todos ellos a ser heredados por F2), para luego cargar el resto del diseño —lo establecido en F2—. Cuando está cargando el diseño particular de F2 (su archivo .dfm), Delphi nota que ahí se especifica otro "object Matri" (ver contenido textual de un archivo .dfm), pero la forma ya hubo cargado otro "object Matri" del archivo .dfm de F1, y como un componente (en este caso la forma) no puede adueñar a otros dos componentes que lleven el mismo nombre (Matri de TF1 y Matri de TF2) pues entonces el entorno de Delphi arroja el mensaje de error que nos presentas.

Es decir, esto pasa, generalmente*, cuando se establece en una forma un componente de nombre igual al de otro componente que ya existe en una forma derivada de ella. El mensaje de error aparecerá cuando se intente cargar la segunda forma (la derivada por herencia visual), ya sea en tiempo de diseño o incluso en tiempo de ejecución al instanciarla (usualmente llamando a Application.CreateForm).

*NOTA: Mencioné "generalmente" porque me ocurrió algo muy extraño recientemente: Trabajaba en Delphi 7 con un proyecto que tiene varias formas con herencia visual, de pronto mi máquina tuvo un bloqueo que me obligó a forzar el cierre de las aplicaciones. Cuando volví a cargar el proyecto en Delphi, una de las formas derivadas no logró abrirse correctamente, presentándose en pantalla el mensaje de error que nos ocupa una y otra vez. Cuando examiné el interior del archivo .dfm noté que muchas declaraciones de componentes que debían iniciar con "inherited" —para indicar que el componente era heredado (provenía) de otra clase de forma— iniciaban con "object" —indicación de que el componente fue agregado en la clase de la actual forma—. Tuve que editar el texto del archivo .dfm cambiando varias decenas de "object" por "inherited" para recuperar el estado normal de la forma derivada.

En resumen, mi consejo para solucionar este problema es que te asegures de que no haya nombres de componentes repetidos a través de la jerarquía de clases que da herencia visual a las formas de tu proyecto.

Espero esto sea de utilidad.

Un abrazo bien cargado.

Al González.
Responder Con Cita