在多个应用程序之间共享图像的最佳方式

时间:2011-08-29 15:42:50

标签: delphi

我正在开发一个由几个已编译的Delphi应用程序(超过20个exe和dll)组成的项目,我将需要在所有应用程序之间共享60多个图像(16x16,24x24,32x32,...)它们。

我有两种不同的方式在所有应用程序之间共享图像,但我不确定哪种更好:


创意1:

创建一个仅限资源的DLL项目,其中包含对包含所有图像的.res文件的资源链接引用。每个应用程序将依次加载dll并根据需要将其可能需要的图像读入TImageList或TImage。

优点:允许以原生格式将图像保存在存储库中。

缺点:我无法在设计时看到图像,因为它们只会在运行时加载。我还必须创建与图像相同数量的常量,或使用与图像具有相同数量的值的集合,以便可以独立于资源文件上的名称引用每个图像。


创意2:

创建一个数据模块,该数据模块编译为bpl,并作为运行时包包含在所有应用程序中。我会将图像添加到几个TImageList(取决于图像大小)或TPngImageList(允许在单个组件上使用多种尺寸的图像)。

优点:我将能够将此数据模块添加到我需要的所有应用程序中,并在设计时查看我可能需要使用的所有图像。

缺点:即使我只需要使用一张图像,所有图像都会被加载到内存中。在将图像添加/修改到TImageList / TPngImageList时,我需要确保图像的顺序永远不会改变。所有图像都将存储在单个.dfm中。


创意3:(新)

在查看了其他需要在编译的exe之间共享图像的应用程序之后,我还有另外一个想法。 将所有共享图像保存为普通的png / ico文件,保存在编译文件所在的子文件夹中(例如,数据)。

优点:无需将所有图像加载到内存中,我可以获得所需的图像。如果图像的总数相当大(使用此方法的一个应用程序在数据子文件夹上有1400个图像),这可能会特别重要。

缺点:任何人都可以看到/可以使用图像。可能会在用户计算机上占用更多的磁盘空间。


我想就这两个想法提出意见或就如何更好地实现这一点提出任何其他建议。

谢谢!

2 个答案:

答案 0 :(得分:11)

我非常喜欢选项1.这样做可以让您以原生格式保留修订控制存储库中的图像。使用选项2,您可以将图像存储在.dfm文件中,我发现这些文件非常不令人满意。缺点是您丢失了查看图像的设计时间。我个人更喜欢做出这种权衡。

在我的软件中,我有一个全局图像列表,我在运行时通过从资源加载来填充,当然还在运行时分配图像索引。这带来的另一个好处是能够选择适合字体缩放的图像大小。否则,您需要为16px图标,20px图标,24px图标,32px图标等单独的图像列表。

答案 1 :(得分:7)

另一种选择是编写自己的TImage组件,并调用额外的属性。

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

在setter过程中,然后从资源加载图像 这样您仍然可以在设计时看到图像。

确保覆盖在dfm文件中保存图像的机制,这样你的exe就不会因为dll中已有的图像而变得臃肿。

不是100%肯定如何做到这一点,但如果你想遵循这条路线,我相信有人可以轻松回答这个问题。