zoukankan      html  css  js  c++  java
  • Delphi使用资源文件全攻略

    本文为原创,如需转载,请注明作者和出处,谢谢!

        在通常情况下使用delphi设计程序,都是将字符串、图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来 不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源。因此,这就需要一种新的引用资源的文件:资源文件。资源文件就是将 一些资源,如字符串、图像等信息进行编译,然后在程序中引用编译后的资源文件,最后和源程序一起编译生成可执行文件。由于在资源文件中的资源是在需要时加 载,因此,比较节省系统资源,而且,如果要做国际化版本的系统,只需要将资源文件一换,重新编译即可。下面就详细介绍delphi中资源文件的建立和使 用。

    一、建立资源文件

        资源文件的源文件是普通的文本文件,扩展名是*.rc。将资源文件的内容写入文件后,调用brcc32.exe将其编译后生成*.res文件。brcc32.exe在delphi的bin目录中。

    二、字符串资源

        字符串资源实际上是将一个字符串和一个数字索引对应,在装载字符串资源时,需要提供这个字符串资源所对应的数字索引。字符串资源文件以stringtable开头,使用一对begin和and将资源定义括起来。 字符串资源的格式是:数字索引,"资源字符串"。
    string.rc文件内容
    stringtable
    begin
    1001, "新建"
    1002, "保存"
    1003, "关闭"
    1004, "帮助"
    1005, "退出"
    1006, "资源文件测试"
    End
        然后调用命令:brcc32.exe string.rc ,生成string.res,最后在程序中加入{$R string.res}。以下所述的*.rc文件都需使用类似的方法进行编译和引用。

        在delphi中有两种方法可以装载字符串资源。
        1. 使用Windows API函数LoadString。使用这个函数需要定义一个char数组,调用的形式如下。

        LoadString(hInstance, 1001, buffer, 100); //100:buffer数组的最大长度,1001:数字索引

        2. 使用delphi自身的函数LoadStr。这个函数只需要一个数字索引就可得到相应的字符串资源。调用的形式如下。

        button2.Caption := LoadStr(1002);

    三、Bitmap资源

        位图资源的定义就相对简单得多。每个位图资源只需要定义三项:位图标识 位图类型 位图文件名 (这三项中间用空格或tab隔开)其中位图标识和字符串资源的数字索引类似,只是位图标识可以是字符串。位图类型是BITMAP。

        调用bitmap资源有两种比较常用的方法。
        1. 使用bitmap的LoadFromResourceName方法。
        2. 使用windows API函数LoadBitmap。这种方法的代码示例如下:
        bmp := TBitmap.Create ;
        bmp.Handle := LoadBitmap(Hinstance,'bmp');
        rect.Left := 0;
        rect.Top := 0;
        rect.Right := image2.Width;
        rect.Bottom := image2.Height;      
        rect1.Left := 0;                       
        rect1.Top := 0;
        rect1.Right := bmp.Width;
        rect1.Bottom := bmp.Height;
        image2.Canvas.CopyRect(rect, bmp.Canvas, rect1);
        第一种方法比较简单,但如果是拉伸装载时,第二种方法效果比较好。也可用类似的方法装载icon和cursor文件,其中装载icon使用LoadIcon,装载cursor使用LoadCursor。

    四、Jpeg资源

        装载Jpeg资源没有Windows API,但可以使用delphi提供的TResourceStream类。在定义资源文件时,资源类型使用RCDATA。示例代码如下:
       jpg := TJpegImage.Create ;
       rstream := TResourceStream.Create(Hinstance, 'jpg', RT_RCDATA) ;
       jpg.LoadFromStream (rstream) ;
       image3.Picture.Bitmap.Assign (jpg);

    五、装载任意文件

        资源文件中不仅可以存储已知类型的资源,如字符串、bitmap、jpeg等,还可以存储任意类型的文件。除了字符串,其它类型的资源文件的格式类似,只 是在资源类型上有所变化。除了已知的资源类型外,可以自定义资源类型。如jpeg资源可以不用RCDATA,而用JPEG,但在调用时需要做如下处理。
    rstream := TResourceStream.Create(Hinstance, 'jpg1', 'JPEG') ;

    六、从其它程序装载资源

        在上述的例子中的资源都是从当前的exe中装载,但有些时候需要从另外的exe或dll,而不是自身装载资源。对于这种需求只要在上述例子中将Hinstance改为LoadLibrary(exe或dll名)即可。
      rstream := TResourceStream.Create(LoadLibrary('project1.exe'), 'jpg1', 'JPEG') ;
      在装载后,可以使用TResourceStream的SaveToFile将资源保存成文件,或做其它处理。
  • 相关阅读:
    Power of Cryptography
    Radar Installation
    Emag eht htiw Em Pleh
    Help Me with the Game
    89. Gray Code
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    82. Remove Duplicates from Sorted List II
  • 原文地址:https://www.cnblogs.com/nokiaguy/p/1201100.html
Copyright © 2011-2022 走看看