当前位置: 首页 > news >正文

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将资源保存成文件,或做其它处理。






 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/215401,如需转载请自行联系原作者


相关文章:

  • 检查邮件服务器的postfix-pop3-mysql服务状态的脚本
  • 华为交换机忘记console的密码,怎么恢复出厂设置
  • 1星《微信软文营销实战技巧》:标题党,作者没有实战经验
  • Windows 2008 R2 Sp1平台整合部署Ex2010与Lync Server 2010参考(三)v1.0
  • O(1)时间内删除指定链表结点
  • 关于项目自动化测试架构的改良计划 - DataProviderEngine架构
  • 读《程序员的SQL金典》[3]--表连接、子查询
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 建造者模式(Java与Kotlin版)
  • oracle无密码登录
  • UNIX/Linux系统取证之信息采集案例
  • 配置Operations Manager与Active Directory集成
  • 安全共享我有招:WindoXP提高共享资源安全
  • [IE技巧] 如何让IE 启动的时候不加载任何插件
  • Linux命令(3):date命令
  • 30天自制操作系统-2
  • Angular 响应式表单 基础例子
  • canvas 高仿 Apple Watch 表盘
  • ComponentOne 2017 V2版本正式发布
  • eclipse(luna)创建web工程
  • httpie使用详解
  • JS专题之继承
  • Redis字符串类型内部编码剖析
  • Terraform入门 - 3. 变更基础设施
  • ucore操作系统实验笔记 - 重新理解中断
  • 订阅Forge Viewer所有的事件
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 使用 @font-face
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 携程小程序初体验
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2022 CVPR) Unbiased Teacher v2
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (四)汇编语言——简单程序
  • (算法)Travel Information Center
  • (转)shell调试方法
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)从 Java 代码到 Java 堆
  • . Flume面试题
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET的微型Web框架 Nancy
  • .net中的Queue和Stack
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @RequestMapping处理请求异常
  • @Transactional类内部访问失效原因详解
  • [<MySQL优化总结>]
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...