2013-02-01 56 views
0

我已经创建了一个Delphi 2007应用程序的资源文件。资源文件包含10个位图条目。我想知道是否有一种方法可以通过递归浏览资源文件来将所有位图加载到Imagelist中,或者我必须一次将它们拉出来。从资源文件递归导入德尔福2007

在此先感谢。

+1

您_recursively意思通过res文件?,我看不到任何递归可能在这里。 – jachguate

+1

也许*迭代*(?)或类似的东西将是一个更合适的词?.. –

+1

只需将它们拖出一个循环,并将它们添加到您的图像列表 –

回答

3

我猜测用“递归浏览资源文件”你想问的是有可能加载资源而不知道它们的名字。为此,有一些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; 
5

要从当前模块添加所有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;