3

我需要在资源文件中循环并使用以下语句加载所有 BMP 文件;bBitmap.Handle := LoadBitmap(hInstance, 'IMAGE_NAME');

如何循环资源文件;我是否必须进行常规 IO 操作并将其视为文本文件?我可以读取每一行并创建一个位图名称列表,而不是在单独的循环中执行上述语句来加载位图。或者 Delphi 库中是否有内置方法来执行此操作?

FILE_NAME_1 BITMAP "btnFile1.bmp"
FILE_NAME_2 BITMAP "btnFile2.bmp"
....

4

2 回答 2

5

我建议您看一下 Delphi 安装中包含的资源浏览器演示。您可以在“c:\Users\Public\Documents\RAD Studio\9.0\Samples\Delphi\VCL\resXplor\resxplor.dpr”中找到它(针对不同的路径/Delphi 版本进行调整)。在 ExeImage.pas 文件中有一些类可以让您轻松地将资源分配给 TPicture 等。

于 2012-12-03T23:23:10.443 回答
2

Ken White 建议的 EnumResourceNames 工作得很好,而且实现起来非常简单。无法接受它作为答案,因为他只留下了评论。

这是我使用该建议的解决方案;

在加载图像的过程中,我添加了以下代码行;

var
  returnVal:bool;
  hMdl: HMODULE;
begin
  hMdl:=LoadLibraryEX('FileNameWithResources.exe',0,LOAD_LIBRARY_AS_DATAFILE);
  // I load bitmaps so RT_BITMAP parameter is chosen
  returnVal:=EnumResourceNames(hMdl,RT_BITMAP,@Callback,0);

@callback 函数返回一个布尔值。你必须把它放在类级别,在类的实现代码之前。没有声明。我的类是单例的,所以我调用一个类级别的过程来将值添加到 TStringList。如果您有更复杂的 if 语句并且想要循环所有内容,请不要返回 false。如果您在任何时候返回 false,则对该函数的调用将结束,您将无法获得其余的资源名称。

function Callback(handle:THandle;ResType:PChar;ResName:Pchar;long:Lparam):bool;stdcall;
var
      tempString: string;    
begin  
      tempString := resname;
      if length(tempString) > 0 then begin
        MyClassName.AddToResourceNames(tempString);
        result := true;
      end else
        result := false;
end;
于 2012-12-04T17:20:20.127 回答