【问题标题】:Recursively Import From Resource File Delphi 2007从资源文件递归导入 Delphi 2007
【发布时间】:2013-02-01 22:18:57
【问题描述】:

我为 Delphi 2007 应用程序创建了一个资源文件。资源文件包含 10 个位图条目。我想知道是否有一种方法可以通过递归遍历资源文件将所有位图加载到 Imagelist 中,或者我必须一次将它们拉出一个。

提前致谢。

【问题讨论】:

  • 你所说的递归通过 res 文件是什么意思?,我在这里看不到任何可能的递归。
  • 也许迭代地 (?) 或者类似的词更合适?...
  • 循环拉出它们并将它们添加到您的图像列表中
  • 我在想我不想识别所有的文件名。在到达文件末尾之前,我不确定是否可以将它像文本文件一样逐行放入列表中。
  • @T.J.,那么您是否要将RT_BITMAP资源类型的所有文件加载到图像列表中?

标签: delphi delphi-2007


【解决方案1】:

要将当前模块中的所有 RT_BITMAP 资源类型图像添加到图像列表中,我会使用这个:

uses
  CommCtrl;

function EnumResNameProc(hModule: HMODULE; lpszType: LPCTSTR; lpszName: LPTSTR;
  lParam: LONG_PTR): BOOL; stdcall;
var
  BitmapHandle: HBITMAP;
begin
  Result := True;
  BitmapHandle := LoadBitmap(HInstance, lpszName);
  if (BitmapHandle <> 0) then
  begin
    ImageList_Add(HIMAGELIST(lParam), BitmapHandle, 0);
    DeleteObject(BitmapHandle);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnumResourceNames(HInstance, RT_BITMAP, @EnumResNameProc,
    LONG_PTR(ImageList1.Handle));
end;

【讨论】:

    【解决方案2】:

    我猜想通过“递归遍历资源文件”,您想问是否可以在不知道资源名称的情况下加载资源。为此,有一类 API 函数允许您枚举给定模块中的资源。有关更多信息,请参阅 "Resource Overviews, Enumerating Resources" 主题。

    但是,由于您自己将位图嵌入到 exe 中,因此更容易为它们命名以便于迭代,即在 RC 文件中:

    img1 BITMAP foo.bmp
    img2 BITMAP bar.bmp
    

    这里的名称“模式”是img + 数字。现在很容易循环加载图像:

    var x: Integer;
        ResName: string;
    begin
      x := 1;
      ResName := 'img1';
      while(FindResource(hInstance, PChar(ResName), RT_BITMAP) <> 0)do begin
         // load the resource and do something with it
         ...
         // name for the next resource
         Inc(x);
         ResName := 'img' + IntToStr(x);
      end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 2016-04-09
      • 2019-09-03
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多