Lazarus研究--应用程序中使用资源文件

/*
昨天,我想把一个图片和一个exe文件编译进自己的程序中,需要时才提取出来,我想到了使用资源文件。
在LAZARUS中使用资源文件简单,只需要在程序中加入

{$R myrc.rc}  或
{$R myres.res } 

即可在程序中引入资源文件,LAZARUS 会自动编译进可执行文件中。
rc 是文本文件,可用lazarus 编写。
res 是二进制文件,可用winres等工具创建

Lazarus RTL提供了许多方法使用资源文件:
	EnumResourceTypes 枚举资源类型
	EnumResourceNames 枚举资源名称
	EnumResourceLanguages 枚举资源中的语言
	FindResource	查找资源
	FindResourceEx
	LoadResource	导入资源
	SizeofResource	
	LockResource
	UnlockResource
	FreeResource

以下例子演示如何使用
*/

/* 资源描述文件  myrc.rc          */
LOGO1_CON ICON   "logo1.ico"
HELLO_EXE RCDATA "hello.exe" 

/* 被包含在资源文件中可执程序代码  hello.exe */
program hello;

{$mode objfpc}{$H+}

uses
          {$IFDEF UNIX}{$IFDEF UseCThreads}
          cthreads,
          {$ENDIF}{$ENDIF}
          Classes, SysUtils
          { you can add units after this };


begin

  writeln('hello,world');

end.


/* 宿主程序  project1.exe  */
program project1;

{$mode objfpc}{$H+}

uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms,
  Unit1 { you can add units after this };

{$R *.res}

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

/* 主窗口 unit1.pas * /
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Image1: TImage;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
	procedure Button3Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

uses LCLType;

{$R *.lfm}
{$R myrc.rc}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  // 导出资源中 logo1.con 并显示在 image1 中
  image1.Picture.Icon.LoadFromResourceName(HInstance, 'LOGO1_ICO');
end;

// 导出资源中 unit1.pas 并显示在memo1 中
procedure TForm1.Button2Click(Sender: TObject);
var
  stm: TResourceStream;

begin
  memo1.Clear;
  stm := nil;
  try
    stm := TResourceStream.Create(HInstance, 'UNIT1_PAS', RT_RCDATA);
    memo1.Lines.LoadFromStream(stm);
  finally
    if stm <> nil then
      stm.Free;
  end;

end;

// 导出资源中的hello.exe,并存盘为hello2.exe
procedure TForm1.Button3Click(Sender: TObject);
var
  stm: TResourceStream;
  f: TFileStream;
begin
  stm := nil;
  f:=nil;
  try
    stm := TResourceStream.Create(HInstance, 'HELLO_EXE', RT_RCDATA);
    f:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'hello2.exe',fmCreate);
    f.CopyFrom(stm,stm.Size );

  finally
    if stm <> nil then
      stm.Free;
    if f<>nil then
      f.free;
  end;
end;

end.

你可能感兴趣的:(Lazarus,LAZARUS,资源文件)