2011-08-29 18 views
17

Estoy trabajando en un proyecto que está compuesto por varias aplicaciones compiladas de Delphi (más de 20 exe ​​y dll) y necesitaré compartir más de 60 imágenes (16x16, 24x24, 32x32 , ...) entre todos ellos.La mejor manera de compartir imágenes entre varias aplicaciones

He aunque en dos formas diferentes de compartir imágenes entre todas las aplicaciones, pero no estoy seguro de qué es mejor:


Idea 1:

Crear una en recursos único proyecto DLL, que contiene una referencia de enlace de recurso al archivo .res que contiene todas mis imágenes. Cada aplicación cargará el dll y leerá las imágenes necesarias que pueda necesitar en un TImageList o TImage según sus necesidades.

Pros: Permite mantener las imágenes en el repositorio en su formato original.

Contras: No podré ver las imágenes en tiempo de diseño, ya que solo se cargarán en tiempo de ejecución. También tendré que crear el mismo número de constantes que las imágenes o usar un conjunto con el mismo número de valores que las imágenes, de modo que cada imagen pueda referenciarse independientemente de su nombre en el archivo de recursos.


Idea 2:

crear un módulo de datos que se compila como BPL y se incluye como un paquete de tiempo de ejecución de todas las aplicaciones. Agregaría las imágenes a varios TImageList (dependiendo del tamaño de la imagen) o en una TPngImageList (que permite imágenes de varios tamaños en un solo componente).

Pros: Podré agregar este módulo de datos a todas las aplicaciones que necesito y ver en tiempo de diseño todas las imágenes que pueda necesitar.

Contras: Todas las imágenes se cargarán en la memoria incluso si solo necesito usar una. Necesito asegurarme de que el orden de las imágenes nunca cambie cuando agregue/modifique imágenes en TImageList/TPngImageList. Todas las imágenes se almacenarán en un solo .dfm.


Idea 3: (Nuevo)

Después de buscar en otras aplicaciones que también necesitan compartir imágenes entre exe compilados, he tenido otra idea. Guarde todas las imágenes compartidas como archivos png/ico simples en una subcarpeta donde están los archivos compilados (Datos, por ejemplo).

Pros: No es necesario cargar todas las imágenes en la memoria, solo puedo obtener las necesarias. Esto puede ser especialmente importante si el número total de imágenes es bastante grande (una aplicación que utiliza este método tiene 1400 imágenes en una subcarpeta de Datos).

Contras: Las imágenes estarán visibles/disponibles para cualquier persona. Puede consumir un poco más de espacio en disco en la máquina del usuario.


Me gustaría solicitar comentarios sobre estas dos ideas o cualquier otra sugerencia sobre cómo lograrlo.

Gracias!

+0

En cuanto a Idea 2: ¿Sería capaz de liberar las imágenes que no necesitará en tiempo de ejecución? – Jeff

+0

No creo que pueda liberar fácilmente las imágenes que no necesito en tiempo de ejecución, principalmente porque si elimino las que no necesito de TImageList, entonces no se asignará el índice de imagen correcto a ningún control quien usa el TImageList – smartins

Respuesta

11

Tengo una gran preferencia por la opción 1. Hacerlo de esta manera le permite mantener las imágenes en su repositorio de control de revisiones en su formato original. Con la opción 2, almacena imágenes en archivos .dfm que considero excesivamente insatisfactorios. La desventaja es que pierde la visualización del tiempo de diseño de las imágenes. Yo personalmente prefiero hacer esa compensación.

En mi software tengo una sola lista de imágenes globales que pueblan en tiempo de ejecución al cargar desde recursos, y por supuesto también asignar índices de imágenes en tiempo de ejecución. El otro beneficio que esto trae es la capacidad de elegir tamaños de imagen apropiados para la escala de la fuente. De lo contrario, debe tener listas de imágenes separadas para iconos de 16 píxeles, iconos de 20 píxeles, iconos de 24 píxeles, iconos de 32 píxeles, etc.

+0

Gracias David por su respuesta. No pensé en cómo se almacenaría cada solución en el repositorio, usted hace una observación válida sobre el problema dfm, que es otra estafa para la idea 2. Editaré la pregunta para incluir esto también. – smartins

7

Otra opción es escribir su propio componente TImage, con propiedades extra denominadas.

property dllname: string read fdllname write set_dllname; 
property resname: string read fresname write set_resname; 

En los procedimientos del colocador, a continuación, carga la imagen del recurso.
De esta forma, aún podrá ver las imágenes en tiempo de diseño.

Asegúrese de anular el mecanismo para guardar la imagen en el archivo dfm, para que su exe no se hinche con las imágenes que ya están en la dll.

No estoy 100% seguro de cómo hacerlo, pero si quiere seguir esa ruta, estoy seguro de que alguien tiene una respuesta fácil a esa pregunta.

+0

¿No hay una directiva 'almacenada' para las propiedades que también puede especificar como falsas? –

+0

@Marjan, buena llamada, ver: http://stackoverflow.com/questions/2072096/stored-keyword-in-delphi – Johan

Cuestiones relacionadas