精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>其他>>资源>>利用资源文件写 Delphi 程序(原创灌水篇)

主题:利用资源文件写 Delphi 程序(原创灌水篇)
发信人: linskystar(林民隆)
整理人: teleme(2002-03-17 18:23:39), 站内信件

资源脚本的格式 
格式: 资源名称 资源类型 真实资源的文件 
例子一(位图): MyBitmap BITMAP MyBitmap.bmp 
例子二(光标): MyCursor CURSOR MyCursor.cur 
同样的,还可以包含 AVI, WAV 和 ICO 文件等已经在 Windows 中预定义了的资源。 
对于其他类型的格式,你需要使用RC_DATA类型。 



RCDATA资源的读取 
RCDATA是一个用户定义的资源类型,读取RCDATA资源在Delphi中需要使用TResourceStream类: 
{一般在 Windows 中没有预定义的资源数据,都必须定义为 RCDATA 资源类型} 
var 
  RS: TResourceStream; 
begin 
  // 1: 按资源名字读取 
  RS := TResourceStream.Create( 
    HInstance,     // 你的应用程序或DLL实例句柄 
    ResourceName,  // 资源名字串 
    RT_RCDATA);    // 标识RCDATA资源类型 
  // 2: 按资源序号读取 
  RS := TResourceStream.CreateFromID( 
    HInstance,     // 同上 
    ResourceID,   // 资源 ID 标识 
    RT_RCDATA);    // 同上 
end; 
你现在可以从这个流中来读取数据,好象它来自一个文件一样。你不能对一个 TResourceStream 执行写入,象可执行文件嵌入的数据那样,它是只读的。 
[复制一个内含的文件到另外的Stream例子] 
复制内含的文件到另外的Stream (假定类型是 TStream) 你可以用如下方法: 
  AS.CopyFrom(RS, RS.Size); 
这个程序例子包含一个带有RCDATA资源的资源文件,这个RCDATA的数据是从Rich Text中复制而来的。我们的程序将提取出这个Rich Text数据进入一个Rich Edit组件。以下是代码: 
var 
  RS: TResourceStream; 
begin 
  // 以资源 ID 的方法从资源文件引入资源,创建流 (设,资源 ID 是 100) 
  RS := TResourceStream.CreateFromID(HInstance,100, RT_RCDATA); 
  try 
    RichEdit1.Lines.LoadFromStream(RS);// 将它装入 Rich edit 组件 
  finally 
    RS.Free; // Free the stream 
end; 



从资源文件中取得位图 
这个例子是在单击图片框控件时,从资源文件中分别提出 BMP1 和 BMP2 两幅位图。 
unit Unit1; 
interface 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; 
type 
  TForm1 = class(TForm) 
   Image1: TImage; 
    procedure FormCreate(Sender: TObject); 
    procedure Image1Click(Sender: TObject); 
  end; 
var 
  Form1: TForm1; 
  Switch:Boolean; // 这里声明了一个全局的开关变量,以区分正在显示的图片 
implementation 
{$R *.DFM} 
{$R BMPDemo.RES} // 将资源文件在这里引入 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
Switch:=False; 
{设,位图在资源文件中定义的资源名称分别为 BMP1 和 BMP2} 
{用资源名字的方法引入,这里没有进行资源锁定,而是直接提取。下同} 
Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'BMP1'); 
end; 
procedure TForm1.Image1Click(Sender: TObject); 
begin 
If Switch Then Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'BMP1') 
Else Image1.Picture.Bitmap.LoadFromResourceName(HInstance,'BMP2'); 
Switch:=Not Switch; 
end; 
end. 





----
我的主页  

[关闭][返回]