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

Delphi 在多个应用程序之间共享图像的最佳方式,delphi,Delphi,我正在从事一个由几个编译的Delphi应用程序(超过20个exe和dll)组成的项目,我需要在所有这些应用程序之间共享60多个图像(16x16、24x24、32x32等) 我已经考虑过在所有应用程序之间共享图像的两种不同方式,但我不确定哪种方式更好: 想法1: 创建仅限资源的DLL项目,该项目包含对包含所有“我的图像”的.res文件的资源链接引用。每个应用程序将依次加载dll,并根据需要将其可能需要的必要图像读取到TImageList或TImage中 优点:允许将存储库中的图像保留为其本机格式

我正在从事一个由几个编译的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个图像),则这一点可能特别重要

缺点:图像将对任何人可见/可用。可能会占用用户计算机上稍多的磁盘空间


我想就这两个想法征求意见,或者就如何更好地实现这一目标提出任何其他建议


谢谢

我非常喜欢选项1。通过这种方式,您可以将修订控制存储库中的图像保持为其本机格式。使用选项2,您将图像存储在.dfm文件中,我发现这非常不令人满意。缺点是,在设计时无法查看图像。我个人更愿意做出这样的权衡


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

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

property dllname: string read fdllname write set_dllname;
property resname: string read fresname write set_resname;
在setter过程中,然后从资源加载图像。
这样,您仍然可以在设计时看到图像

确保覆盖在dfm文件中保存图像的机制,以便exe不会因dll中已有的图像而膨胀


不完全确定如何做到这一点,但如果你想沿着这条路线走,我相信有人对这个问题有一个简单的答案。

关于想法2:你能在运行时释放你不需要的图像吗?我认为我不能轻易地释放运行时不需要的图像,主要是因为如果我从TImageList中删除我不需要的那些,那么它将不会为任何使用TImageList的控件分配正确的imageindex。谢谢David的回答。我没有想到每个解决方案将如何存储在存储库中,您对dfm问题提出了一个有效的观点,这是idea 2的另一个缺点。我将对问题进行编辑,将其也包括在内。对于您也可以指定为false的属性,是否有
存储的
指令?@Marjan,很好的调用,请参阅: