善用资源文件

  资源是存放在扩展名.RES的文件里的二进制数据结构,在DELPHI中资源文件可以使用图象编辑器来
制作(IMAGEEDITOR),或者使用其他的工具。如:BORLAND公司提供的RADPACKFORDELPHI中的
RESOURCEWORKSHOP来创建。资源文件中通常存放的是应用程序可以随时存取的一些对象,包括:ICON、
CURSOR、BITMAP、FONT等近十种。大部分的资源在通常的情况下可以保留在磁盘当中,直到程序需要使
用它们时才将其调入,可以大大的节省内存资源,同样,资源文件也是可以共享的,即:多个程序可以
共享一个资源文件,进而减少了在应用程序之间代码重复的现象,使程序的代码得到很大的优化,因此
在应用程序中使用资源文件有独立制作、方便、随时修改而不需要对应用程序代码做任何修改的好处。
一般来说,一个应用程序的所有资源都存放在一个RES文件里,然后在DELPHI进行编译的阶段将资
源文件的内容与最终的EXE文件合并在一起,因此编译后的RES文件并没有什么作用,仅仅提供用来查阅
使用,在分发应用时不必把RES文件分发给最终用户。当然,不同的资源可以分别放在不同的资源文件
当中,而且资源文件越小调入内存的速度越快。在这里还要说明的一点是:在修改了原来的资源文件之
后,在原来编译的EXE文件中加入的资源不会随之而更新,只有在重新进行编译以后,才能将新的资源
加入到新的EXE文件当中去。
  下面我们通过两个例子来说明在DELPHI中如何使用资源文件(在这里我们不讲述资源文件的制作方法)。

  1、如何在DELPHI中使用定制的光标。

  在使用DELPHI进行编程时,有一个很重要的对象──TSCREEN,它是用来管理和操纵运行时期屏幕
的不可视构件。它的CURSOR属性是用来指定各个不同的构件光标形状,声名为:

  PROPERTY CURSORS[INDEX: INTEGER]:HCURSOR;

  这个只读的特性返回应用程序支持的光标组成的一个HCURSOR类型的数组,它存储了屏幕上所有的
鼠标光标的身份代码(HCURSOR就是光标的HANDLE句柄),数组下标从0开始,在DELPHI预定义了一些代表
不同光标的常量,它的值是从0到-17,您可以直接指定程序使用的光标。如:

  FORM1.CURSOR := -3 表示FORM1采用的光标是CRCROSS(十字)。

  大家可能都会发现构件的CURSOR的属性最多提供十八种常用的CURSOR值,这在很多的情况下是不够
的,如:当光标进入一个PANEL面板时光标的形状为一只手,那么PANEL的CURSOR就不能满足这种要求,
这时就需要我们自定义一个手的光标并将其赋给PANEL的CURSOR属性。如何实现则可以按以下步骤进行:

  1)使用资源文件编辑器(IMAGE EDITOR或者RESOURCE WORKSHOP)编写资源文件。

  定义一个光标常量,注意这个常量不能与DELPHI中提供的光标常量相冲突。在FORMCREATE事件中使
用WINDOWSAPI当中的LOADCURSOR函数来载入自定义的CURSOR。

  2)在程序中将自定义的CURSOR分配给PANEL的CURSOR属性。

  下面说明如何将自定义的一只手的鼠标光标赋给PANEL1的CURSOR属性。首先使用IMAGEEDITOR建立
一个HAND.RES的文件。之后按如下书写程序代码:

implementation

{$R*.DFM}

const
Crhand=2;

procedure TForm1.FormCreate(Sender:TObject);
begin
screen.cursors[crhand]:=loadcursor(Hinstance,‘hand‘);
 panel1.cursor:=crhand;
end;

除了编写上面的代码以外,我们还需要做的一项工作是将资源文件加入到项目文件当中去,编译指令
中的{$Rfilename}伪指令让我们来增加资源文件,让我们来看一看项目文件的代码。

program PCUR;

uses
Forms,
HANDin‘HAND.pas‘{Form1};

{$R*.RES}
//这里的*意义为在程序编译以后会产生一个与项目文件同名的资源文件,在这里为PCUR.RES文件,这部
//分是自动产生的。

{$Rhand.res}
//这部分是我们自己加入的自定义资源文件,这两个资源文件(HAND.RES和//PCUR.RES中的资源都会附加
//在可执行文件PCUR.EXE的后面。

begin
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
end.

  2、资源文件在编写动画程序中的应用

  上面的例子使用的是在资源文件中存储的CURSOR资源,在下面的例子中我们将使用的是在资源文件
中提供的ICON资源来编写一个小小的动画程序。在这里动画的产生是利用定时器在一定的时间间隔内产
生TIMER事件将存储在资源文件中的ICON依次的绘制在FORM的同一处而产生的。这时要用到画布CANVAS
的DRAW方法,其声明如下:

  procedureDraw(X,Y:Integer;Graphic:TGraphic);

  在这个方法当中的参数GRAPHIC可以为:BITMAPS、ICONS、METAFILES。具体的实现方法为:建立
DEMO.RES文件,其中含有名为ICON1桰CON6的ICON。并将DEMO.RES加到项目原代码中去(如:上面例子的
方法)。

  动画程序的具体代码如下:

unit donghua;

interface

uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,
Dialogs,ExtCtrls;

type
TForm1=class(TForm)
Image1:TImage;
Timer1:TTimer;
procedure FormCreate(Sender:TObject);
procedure Timer1Timer(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;

var
Form1:TForm1;

implementation

var
wicon:array[0..5] of Ticon;
//建立TICON类型的数组存储ICON文件
idx:integer;

{$R*.DFM}

procedure TForm1.FormCreate(Sender:TObject);
var
iconname:string;
piconame:pchar;
begin
piconame:=stralloc(7);
//建立PCHAR类型的字符串
for idx:=0 to 5 do
begin
wicon[idx]:=ticon.create; //建立TICON型对象
iconname:=‘icon‘+inttostr(idx);
strpcopy(piconame,iconname); //将STRING类型转换成PCHAR类型
wicon[idx].handle:=loadicon(hinstance,piconame); //调用WINDOWSAPI中的LOADICON函数
  //载入资源中的ICON
 end;
strdispose(piconame); //PCHAR类型的删除
form1.canvas.draw(3,3,wicon[1]); //调用DRAW的方法在FORM上画出ICON1
idx:=1;
form1.setbounds(0,0,100,100); //固定FORM的大小和位置
end;

procedure TForm1.Timer1Timer(Sender:TObject);
//形成动画的定时器事件
begin
idx:=idx+1;
if idx=6 then idx:=1;
form1.canvas.draw(3,3,wicon[0]);
form1.canvas.draw(3,3,wicon[idx]);
end;

end.

以上可以作为一个通用的动画程序,我们只需要修改不同的ICON以及增加IDX的大小就可以编出不
同的动画应用(同样在资源中可以有其他形式的图形如:BITMAPS这时需要动态创建的是TBITMAPS对象而
不是TICON对象)。在两个例子中我们都用到了WINDOWSAPI函数,这些函数在WINDOWS单元中均有说明在
这里不加赘述。以上的两个例子只是资源文件的一点点应用,要真正的掌握资源文件在程序设计中的强
大作用,还要靠自己在实践中不断的总结。

时间: 2024-12-28 12:06:02

善用资源文件的相关文章

.Net 多语言 与资源文件

目前很多网站都支持多语言,特别是中英文.而.Net网站中的多语言就要用到资源文件.资源文件分为全局资源文件(App_GlobalResource)以及本地资源文件(App_LocalResource). 创建资源文件 对于一个项目,我们一般都会创建全局资源文件以及本地资源文件.我们可以首先新建两个文件夹:App_GlobalResource,App_LocalResource. 1. 创建本地资源文件(App_LocalResource) 本地资源文件是针对于某个页面资源信息.所以,原则上我们应

iOS工程 与 资源文件 和 Bundle

在简单的app中,可能只会用到工程,但是项目越大,越复杂,就会需要拆分项目,将各个功能拆散到各个工程中. 可以使用worksapce来管理工程集合. 但是资源文件却不好管理,因为xcode默认只能添加自己工程内,或者子工程的资源文件到target中. 如果是平级的工程,怎么添加呢?可以使用bundle bundle虽然是os x中的资源类型,但是是兼容iOS的 我们可以先创建一个os x的bundle,然后修改其编译类型为iOS的 调整base sdk即可 然后添加资源文件(png,xib,st

win10 uwp 读取resw资源文件

ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetSubtree("my"); // Here you load the resource you need var

Spring boot 国际化自动加载资源文件问题

Spring boot 国际化自动加载资源文件问题 最近在做基于Spring boot配置的项目.中间遇到一个国际化资源加载的问题,正常来说只要在application.properties文件中定义正确的资源文件路径,Spring boot就启动时就会自动加载资源. spring.messages.basename=i18n/message 但是我的项目修改后获取消息时系统报错,找不到对应语言的资源配置.于是试图找到原因.Google好久都没找到,简直好像就我一个人遇到这鬼问题一样??.只好自

Solidity编程 三 之 资源文件的组成

3.1 版本语句 源文件可以用版本语句拒绝高版本编译器编译.其中一些高版本可能引入了不兼容的特性,导致编译后出现不可预知的结果.我们希望把这种版本变化控制在最小范围内,同时尽量要求语法和语义同步修改,这个要求很难达到.所以,我们需要去阅读每个版本的修改日志,这些版本都是以 0.X.0或是X.0.0来命名. 版本语句使用如下: pragma solidity ^0.4.0; 这样的源文件不会被0.4.0以前的编译器编译,同时在0.5.0版本以上(包括0.5.0)编译器上也不能编译(使用了 ^ 进行

struts2官方 中文教程 系列七:消息资源文件

介绍 在本教程中,我们将探索使用Struts 2消息资源功能(也称为 resource bundles 资源绑定).消息资源提供了一种简单的方法,可以将文本放在一个视图页面中,通过应用程序,创建表单字段标签,并根据用户的语言环境将文本更改为特定的语言. 贴个本帖的地址,以免被爬:struts2官方 中文教程 系列七:消息资源文件  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 信息资源属性文件 在Struts2 we

二、添加资源文件

Qt资源系统是一个跨平台的资源机制,可以将各种类型的文件以二进制的方式存储与可执行文件内部.使用Qt Creator可以很方便的创建资源文件.在工程上点击右键选择"添加新文件",可在Qt分类中找到Qt资源文件(Qt Resource File),如下图所示,将其命名为res: 创建完成后会自动打开资源文件,在界面右侧编辑区,有个添加按钮 .如下图: 我们需要先添加前缀,点击添加选择添加前缀,默认前缀是"/new/prefix1",这个可以随便更改但是不要使用中文字符

解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法

建立好一个Maven项目后,如果Java Resources资源文件下没有src/main/java文件夹,并且在手动创建这个文件时提示“已存在文件”. 这说明,在这个项目配置中已经有了src/main/java这个文件夹,至于为什么不显示,我暂时也还不清楚,希望谁明白了跟我下,谢了.(已解决) 第一种方法: 打开项目的classpath文件:如下 <?xml version="1.0" encoding="UTF-8"?><classpath&g

andriod 资源文件之存取操作

来自:http://blog.csdn.net/jianghuiquan/article/details/8569235 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&quo