2010-10-28 49 views
0

我在我的应用程序中使用了一组约100个图标,这些都是使用固定参考号进行访问的,这些数字也可供用户选择图标。所需的三种分辨率是16x16,32x32和48x48。这些解决方案中的每一个都保存在TPngImageList中,并且使用TDataModule创建了一个“图标库”,而不是包含这三个图像列表(TArtImageLibraryImageLists)。当需要任何图像列表时,一个简单的“首次使用时创建”方法会实例化此TDataModule。任何需要访问图像列表的控件的LargeImages或somesuch属性都可以通过调用所需的分辨率函数来设置。如何提高德尔福TPngImageList(或TImageList)的加载时间

问题是程序启动时的加载时间,在快速机器上约为1秒。显然,最糟糕的罪魁祸首是48x48图像列表,但我想知道是否有更好的加载机制(例如使用资源文件?),这会加快速度。或者有什么方法可以重新格式化图像列表?我仍然需要在运行时TImageList,例如我的TreeView等。

谢谢, 布赖恩。

var 
    FInstance : TArtImageLibraryImageLists; 

function ArtImageLibraryImageLists : TArtImageLibraryImageLists; 
begin 
    If not Assigned(FInstance) then 
    FInstance := TArtImageLibraryImageLists.Create(nil); 
    Result := FInstance; 
end; 


function ArtIconLibraryImageList16 : TImageList; 
begin 
    Result := ArtImageLibraryImageLists.ImageList16; 
end; 

function ArtIconLibraryImageList32 : TImageList; 
begin 
    Result := ArtImageLibraryImageLists.ImageList32; 
end; 

function ArtIconLibraryImageList48 : TImageList; 
begin 
    Result := ArtImageLibraryImageLists.ImageList48Shadow; 
end; 
+0

您似乎在启动时需要数据模块,但启动时是否需要48x48映像? – 2010-10-28 09:56:25

回答

0
  1. 你说“一个简单的‘创建在第一次使用’方法实例化这个TDataModule”,但随后说,问题是启动时间。当datamodule实际创建时?
  2. 你是否描述该应用程序以确保图像列表正在加载该问题?
  3. 如果问题实际上是图像列表,你需要PNG吗?如果它们按照这种方式存储,则需要将它们解码并添加到图像列表位图中。 ImageList_LoadImage()可以在一个步骤中加载位图。
+0

1是的,它是在第一次分配图像列表引用时创建的。 2 - 是的。它是包含我的3个图像列表的数据模块的DFM资源的加载缓慢。 3. PNG的 - 我用透明度,但这是一个很好的观点,也许我会看看其他格式。谢谢。 – 2010-10-28 16:48:06