Es & # 8220; implícitamente importado & # 8221; Siempre es algo malo en los paquetes de Delphi?

StackOverflow https://stackoverflow.com/questions/1215664

Pregunta

Intento reorganizar mis paquetes para un conjunto de Componentes descendientes de TFrame , lo encuentro aparentemente necesario para separar algunos de mis descendientes TFrame de utilidad separados de los formularios de diálogo que los usan, principalmente porque los primeros están registrados en la paleta como componentes verdaderos y eso parece confundir al IDE a veces con respecto a los formularios de diálogo que los usan. Los formularios de diálogo a su vez son llamados por componentes no visuales, que son parte de un tercer paquete. Esto, hasta ahora , parece hacer que la mayoría de los compiladores quejas relacionadas con la dependencia / confusiones desaparecen (Sin embargo, aún no he salido).

Al compilar el paquete con los formularios de diálogo (que llaman a los marcos), recibo la advertencia " Unidad 'MyFrames' importada implícitamente en el paquete 'MyDialogForms' "

Dado que aparece como una advertencia del compilador, hace mucho tiempo tuve la impresión de que "importar implícitamente" una unidad generalmente no es algo bueno. ¿Hay casos específicos en los que ese no es el caso? es decir, ¿dónde está bien importar implícitamente una unidad, y / o una práctica adecuada? ... y si es así, ¿cuáles son esos casos específicos?

¿Fue útil?

Solución

Aquí está el problema:

Solo puede tener una copia de una unidad en su programa. Si intenta cargar la misma unidad dos veces a través de paquetes, generará una excepción y el paquete no se cargará la segunda vez. La forma de evitar esto es estructurar sus paquetes para que no se use ninguna unidad en más de uno.

El código para cada unidad que compiles debe estar en el paquete. El compilador comenzará con todas las unidades que declare en la sección contiene , pero cualquier otra unidad utilizada por esas unidades también debe compilarse para que sea accesible, a menos que esas unidades estén contenidas en otro paquete que se enumera en requiere . Estos extras son los importados implícitamente unidades. El problema es que se importan implícitamente , no se mencionan explícitamente en la sección contiene donde se mostrarán convenientemente en el Administrador de proyectos a la derecha. Esto significa que es posible que no note que su unidad está en un paquete y termine colocándola en otro. Luego, cuando intentas ejecutar tu programa y cargar los paquetes, las cosas se rompen. Es por eso que el compilador te lo advierte.

Es una advertencia, y no un error, por una razón. Siempre y cuando comprenda cómo funciona el sistema, es técnicamente seguro usar importaciones implícitas. Solo recuerda que esas unidades están terminando en el paquete, ya sea que las declares o no. Pero, de nuevo, dado que están terminando allí, ya sea que los declares o no, probablemente sea más simple agregarlos oficialmente y ahorrarte la molestia.

Otros consejos

+1 para Respuesta de Mason . El lugar donde las unidades importadas implícitamente se convierten en un problema es en un proyecto grande donde se vuelve exponencialmente más difícil hacer un seguimiento de las unidades que están vinculadas desde cualquier lugar.

Creo que la mejor manera es tener una carpeta por paquete, y esa carpeta contiene todos los archivos del paquete. Si veo una "importación implícita" advertencia, agrego el paquete requerido o agrego la unidad al paquete. Por lo tanto, todas las unidades se especifican en el paquete que las contiene y están todas en la misma carpeta. Nunca agrego carpetas a la ruta de búsqueda, porque cada proyecto conoce todos sus archivos directamente.

La estructura no es realmente difícil de mantener y lo protege de problemas en los que diferentes unidades contienen diferentes versiones de un archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top