Delphi的资源文件

 

学习使用资源文件[1] - 入门

更多有关资源的问题参考API应用相关篇章
资源文件(*.res)通过编译指令 $R 关联, 譬如工程文件 Project1 中的 {$R *.res} 就是关联 Project1.res 资源文件, 我们直接写作 {$R Project1.res} 不会有问题(但如果工程文件改名时, 你也得随着改才行). 譬如:


program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R Project1.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

这个资源文件中至少包含着文件图标, 假如我们删除 {$R *.res} 后编译, 看前后对比图:



这时我们可以通过代码, 调用其他图标:


procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.Icon.LoadFromFile('c:/temp/my.ico');
end;



这样还是不好, 如果运行程序的电脑没有这个文件呢? 最好让程序携带着它, 这就要通过资源文件. 让我们从头来过:

1、新建一个 VCL Forms Application; 并 Save All;

2、并通过菜单 Project → View Souse 打开工程源文件;

3、删除 {$R *.res}

4、如图新建一个 Text 文件

5、文件编辑如下:
MainIcon ICON "c:/temp/my.ico"

注意: 其中的 c:/temp/my.ico 可以随便定义, 但文件必须存在; 另外其中的所有大小写无关, 路径两边的双引号也可以省略.

6、把它保存为: Project1.rc ; 注意要保存在程序相同目录, 文件名和工程文件名相同, 后缀是 rc

7、如图把 Project1.rc 添加到工程组:

8、这时工程文件自动添加了一行: {$R 'Project1.res' 'Project1.rc'}

9、好了, 编译执行程序, 如图:



注释:

1、*.rc 文件算是资源文件(*.res) 的源文件, 在程序编译过程中会编译成同名的 res 文件;

2、上面的例子是个特例, 一般我们不能使用和工程同名的资源文件;

3、MainIcon ICON "c:/temp/my.ico" 中的 ICON 说明这是一个图标资源, MainIcon 是该资源的标识符, 这个标识符应该是可以自定义的, 不过在这个特例中, 只能使用 MainIcon , 因为程序要从同名的资源文件中查找标识为 MainIcon 的资源做图标.

 

学习使用资源文件[2] - Ico

现在要做一个携带两个图标的资源文件, 并调用的例子.

1、首先建新工程, 保存, 注意这次我们不删除 {$R *.res}

2、复制两个 ico 文件到工程目录, 譬如文件是: IcoFile_1.ico、IcoFile_2.ico

3、建立文本文件输入:
ico1 ICON IcoFile_1.ico
ico2 ICON IcoFile_2.ico

然后保存为: MyRes.rc, 并 Add 到工程中, 如图:

4、此时的工程文件会自动插入: {$R 'MyRes.res' 'MyRes.rc'}

5、添加四个按钮, 实现代码如下:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//使用资源中的第一个自定义图标
procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.Icon.Handle := LoadIcon(HInstance, 'ico1');
{
  HInstance 当前程序实例的句柄, 调用资源文件一定要用到它;
  ico1 是资源文件的标识符;
  LoadIcon 是个 API 函数, 专门用于调用资源中的 ico 文件, 它返回的是指定 ico 文件的句柄.
}
end;

//使用资源中的第二个自定义图标
procedure TForm1.Button2Click(Sender: TObject);
begin
  Application.Icon.Handle := LoadIcon(HInstance, 'ico2');
end;

//使用资源中默认的程序图标
procedure TForm1.Button3Click(Sender: TObject);
begin
  Application.Icon.Handle := LoadIcon(HInstance, 'MainIcon');
end;

//不使用图标(会显示 Windows 系统的默认图标)
procedure TForm1.Button4Click(Sender: TObject);
begin
  Application.Icon := nil;
end;

end.

//效果图:



注释:

1、此时的 MyRes.rc 被编译成了 MyRes.res;

2、此时的 IcoFile_1.ico、IcoFile_2.ico 文件被编译进 MyRes.res;

3、此时的 MyRes.res 文件也被编译到 Project1.exe 中了.

学习使用资源文件[3] - 用 Image 显示资源中的图片

首先编辑 rc 文件如下(假定图片文件放在程序目录下的 img 文件夹下):
bmp1 BITMAP img/bmpFile1.bmp
bmp2 BITMAP img/bmpFile2.bmp

或者:
bmp1,BITMAP,img/bmpFile1.bmp
bmp2,BITMAP,img/bmpFile2.bmp

然后在窗体上添加一个 Image、两个 Button, 代码如下:



unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.AutoSize := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'bmp1');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'bmp2');
end;

end.

//效果图:

学习使用资源文件[4] - 用资源中的图片做背景、使用 LoadFromResourceID

首先编辑 rc 文件如下(假定图片文件放在程序目录下的 img 文件夹下):
1 BITMAP img/bmpFile1.bmp
2 BITMAP img/bmpFile2.bmp

或者:
1,BITMAP,img/bmpFile1.bmp
2,BITMAP,img/bmpFile2.bmp

这次我们是给每个资源做了编号, 没有取标识名称; 然后在窗体上添加两个 Button, 代码如下:



unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  bit: TBitmap;

procedure TForm1.FormCreate(Sender: TObject);
begin
  bit := TBitmap.Create;
end;

//对只有编号的图片资源需要用 LoadFromResourceID 调用
procedure TForm1.Button1Click(Sender: TObject);
begin
  bit := TBitmap.Create;
  bit.LoadFromResourceID(HInstance, 1);
  Self.Brush.Bitmap := bit;
  Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  bit := TBitmap.Create;
  bit.LoadFromResourceID(HInstance, 2);
  Self.Brush.Bitmap := bit;
  Repaint;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  bit.Free;
end;

end.

//效果图:

 


 

学习使用资源文件[5] - 鼠标指针资源


//rc 文件:
cur1 CURSOR cur/kyodai.cur
cur2 CURSOR cur/static.cur

//或者
cur1,CURSOR,cur/kyodai.cur
cur2,CURSOR,cur/static.cur

//程序代码:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.Cursors[1] := LoadCursor(HInstance, 'cur1');
  Screen.Cursors[2] := LoadCursor(HInstance, 'cur2');

  Panel1.Cursor := TCursor(1); //Panel1.Cursor := 1; 也可, 因为 TCursor 就是个数字类型.
  Panel2.Cursor := TCursor(2);
end;

end.

//效果图:

学习使用资源文件[6] - 菜单资源

//rc 文件:MyMenu1 MENUbeginPopup "File"beginMenuItem "&Open"MenuItem "&Save"MenuItem SeparatorMenuItem "E&xit"endend{严格的头可能是这样写: MyMenu1 MENU PRELOAD DISCARDABLE}



//程序代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  hm: HMENU;
begin
  hm := LoadMenu(HInstance, 'MyMenu1');
  SetMenu(Handle, hm);
end;

end.

//效果图:

学习使用资源文件[7] - 字符串资源

//rc 文件:StringTablebegin0 "AAAA"1 "BBBB"2 "CCCC"3 "DDDD"end//也可以这样写:StringTablebegin0,"AAAA"1,"BBBB"2,"CCCC"3,"DDDD"end//还可以这样写:StringTable{0,"AAAA"1,"BBBB"2,"CCCC"3,"DDDD"}{严格的头可能是这样写: STRINGTABLE DISCARDABLE}



//程序代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  with Memo1.Lines do
  begin
    Add(LoadStr(0));
    Add(LoadStr(1));
    Add(LoadStr(2));
    Add(LoadStr(3));
  end;
end;

end.

//效果图:

学习使用资源文件[9] - WAVE 资源


//rc 文件:
sound1 WAVE "SoundFile1.wav"
sound2 WAVE "SoundFile2.wav"

//代码:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses MMSystem; {下面用到的 sndPlaySound、PlaySound 都是在此单元声明的}

procedure TForm1.Button1Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.Create(HInstance, 'sound1', 'WAVE');
  sndPlaySound(rs.Memory, SND_ASYNC or SND_MEMORY);
  rs.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.Create(HInstance, 'sound2', 'WAVE');
  PlaySound(rs.Memory, HInstance, SND_ASYNC or SND_MEMORY);
  rs.Free;
end;

end.
 

学习使用资源文件[10] - 嵌入和提取任何类型的文件


//下面是 Windows 支持的资源格式:
RT_CURSOR       = MakeIntResource(1);
RT_BITMAP       = MakeIntResource(2);
RT_ICON         = MakeIntResource(3);
RT_MENU         = MakeIntResource(4);
RT_DIALOG       = MakeIntResource(5);
RT_STRING       = MakeIntResource(6);
RT_FONTDIR      = MakeIntResource(7);
RT_FONT         = MakeIntResource(8);
RT_ACCELERATOR  = MakeIntResource(9);
RT_RCDATA       = Types.RT_RCDATA; //MakeIntResource(10);
RT_MESSAGETABLE = MakeIntResource(11);
   DIFFERENCE   = 11;
RT_GROUP_CURSOR = MakeIntResource(DWORD(RT_CURSOR + DIFFERENCE));
RT_GROUP_ICON   = MakeIntResource(DWORD(RT_ICON + DIFFERENCE));
RT_VERSION      = MakeIntResource(16);
RT_DLGINCLUDE   = MakeIntResource(17);
RT_PLUGPLAY     = MakeIntResource(19);
RT_VXD          = MakeIntResource(20);
RT_ANICURSOR    = MakeIntResource(21);
RT_ANIICON      = MakeIntResource(22);

//尽管 Windows 规定 RCDATA 用作自定义格式, 我们也可以自定义格式名称, 譬如本例(rc 文件):
MyFile1 RCDATA "c:/Windows/system32/notepad.exe"
MyFile2 MyRes "c:/Windows/System32/calc.exe"

{上面把 notepad.exe 时指定为 RCDATA 格式; 把 calc.exe 就指定成了自定义的 MyRes 格式}

//本例在资源中嵌入了记事本和计算器, 然后提取并调用:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.Create(HInstance, 'MyFile1', RT_RCDATA);
  rs.SaveToFile('c:/temp/pad.exe');
  WinExec('c:/temp/pad.exe', 1);
  rs.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  rs: TResourceStream;
begin
  rs := TResourceStream.Create(HInstance, 'MyFile2', 'MyRes');
  rs.SaveToFile('c:/temp/sum.exe');
  WinExec('c:/temp/sum.exe', 1);
  rs.Free;
end;

end.
 

学习使用资源文件[11] - DLL 中的资源文件

本例将把一张 bmp 图片, 以资源文件的方式嵌入 dll, 然后再调用.



第一步: 建一个 DLL 工程, 如图:

然后保存, 我这里使用的名称都是默认的.



第二步: 建一个资源原文件, 如图:

编辑内容如下(路径中的文件一定要存在):
img1 BITMAP "c:/temp/test.bmp"

然后, 取个名(后缀须是 rc, 我这里取名为 Res.rc), 保存在工程目录下.



第三步: 在 DLL 工程中添加这个资源原文件, 如图:

此时, 工程源文件中会添加一句: {$R 'Res.res' 'Res.rc'}, 我们需要的源文件这样即可:

library Project1;

{$R 'Res.res' 'Res.rc'}

begin
end.

然后 Ctrl+F9 编译; 此时在工程目录下会生成我们需要的 Project1.dll.



第四步: 把刚才的 Project1.dll 文件复制到 c:/temp 下.
这样过会我们可以通过 c:/temp/Project1.dll 找到这个文件. 至此 DLL 制作完毕.



第五步: 重新建一个 VCL Forms Application 工程, 代码如下:


unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormPaint(Sender: TObject);
var
  h: THandle;
  bit: TBitmap;
begin
  h := LoadLibrary('c:/temp/Project1.dll'); {载入 DLL}

  bit := TBitmap.Create;
  bit.LoadFromResourceName(h, 'img1');      {提取资源}

  Canvas.Draw(10, 10, bit);                 {在窗体上绘制图片}

  FreeLibrary(h);                           {载卸 DLL}
  bit.Free;
end;

end.

//效果图:

时间: 2024-09-16 08:31:48

Delphi的资源文件的相关文章

Delphi使用资源文件全攻略

本文为原创,如需转载,请注明作者和出处,谢谢!     在通常情况下使用delphi设计程序,都是将字符串.图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来 不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源.因此,这就需要一种新的引用资源的文件:资源文件.资源文件就是将 一些资源,如字符串.图像等信息进行编译,然后在程序中引用编译后的资源文件,最后和源程序一起编译生成可执行文件.由于在资源文件中的资源是在需要时加 载,因

打包Activiti的流程资源文件(bpmn20.xml、form、png)

1.资源文件介绍 Activiti的流程定义文件可以直接部署bpmn20.xml.zip.bar文件,其中后面的zip和bar类型一样都是压缩文件格式,bpmn20.xml是符合bpmn2.0规范的xml定义. 今天要解决的问题就是帮助大家打包流程资源文件,其中肯能包括:bpmn20.xml.png.form等文件. 大多数开发人员都是用Activiti Designer来设计流程定义,可能业务人员使用了其他的流程设计器来描述业务,然后开发人员用Activiti Designer来"深加工&qu

Struts资源文件支持中文之第一招---掏肠换肚

中文         前几日突然右眼跳,不一会MP3坏了,不祥之照啊.本来时间就紧,又得费时间去修了,哎,天意弄人.不过自己还不会为这个而郁闷几日的哦,不值得,人嘛,死的时候什么都带不走的,呵呵.准备明天去修.        时间荏苒(小时候写作文经常用这个词,当时觉得还挺酷的,呵呵,现在继续沿用一下,找找童年时的感觉:0),星期五一天,忘了,不知道怎么过的,星期六本来全校停电停水,打算出去和哥们到紫竹园游玩一下,天有不测风云,周五晚上突然又说不停了,又玩我一把,无奈取消计划,周六上午睡个懒觉,

系统多种资源文件代码示例

示例 (一).功能  当一个系统有了一定规模,可能要销售到国外其它国家,这时候要实现多种资源文件.  本代码示例将介绍怎样实现: 一个系统同时具有简体,繁体,英文等不同资源文件.  实现原理:   将多资源文件存储在多个*.txt文件(例如CN.txt En.txt等)中,程序根据当前当前浏览器  语言设置 读取相应的资源文件(二).具体步骤如下  1. 创建一个资源文件     a.建立一个记事本文件: a.txt,并在里面写入:  _name=姓名       b.选"文件"-&g

深入剖析Asp.net资源文件

asp.net 一.资源文件的定义 简单点的说法就是程序中可以使用的数据,象:字符串,图片或二进制数据等等,实际上可以包含任何类型的文件. 资源文件可以有多个语言版本,这样在开发全球化应用程序时就很重要.这个特性是通过System.Resources空间下的ResourceManager类来完成需要在什么时候调用那个版本的.在VS.NET中将一个文件的属性设置为Embedded Resource就可以使资源被嵌入到Assembly中了. 二.资源文件包含那些类型? System.Resource

资源文件说明:resourcefiles

<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %><%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%> <!-- #include vir

从资源文件里加载文件(C#)

加载 1.概述: 资源文件很早就有了,在.Net时代里这个东西也不算稀奇,在进行多国语言化的时候通常把不同翻译的文字存放到资源包里.以前资源文件除了放字符串以外,还可以放文件.不过在C#的工程里面,资源管理面板是空的(vc++工程里资源面板可以使用),无法直接编辑资源属性,不过每个WinForm都会带一个.resx的文件,这个文件就是WinForm的资源文件.如果通过添加新项目的方法,给工程里添加资源文件的话,产生的也是.resx文件.估计.resx文件是.net给c#新设计的资源文件格式..r

C#创建和使用资源文件

创建 创建资源文件    资源文件顾名思义就是存放资源的文件.资源文件在程序设计中有着自身独特的优势,他独立于源程序,这样资源文件就可以被多个程序使用.同时在程序设计的时候,有时出于安全或者其他方面因素的考虑,把重要东西存放在资源文件中,也可以达到保密.安全的效果.那么Visual C#所使用的资源文件中到底存放哪些东西呢?在用Visual C#创建资源文件大致可以存放三种类型的数据资源,分别是字节数组.各种对象和字符串.本文将结合一个程序例子来具体说明用Visual C#是如何创建资源文件的.

在VB项目中使用资源文件

项目 很多VB项目使用的数据存储在扩展文件中,包括bmp图片,icons图标,指针和wav文件.在你的安装中这些元素作为分开的单独文件有两个缺点. 首先,它可能在大量的文件中混乱安装:但是,如果一个用户删除或者不经意的移动文件中的任何内容,程序就不会正常运行.第二,文件中的材料对于用户来说使用是非常自由的,有可能用户所使用的方法是你不希望的. 你可以使用资源文件来避免上面的这些问题.使用资源文件的另外一个好处就是你可以创造特别版本的资源文件包括在不同的地方安装. 一个VB项目仅仅只有一个和它相关