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