88分,要想发,不离8!

解决方案 »

  1.   

    在Delphi项目中,通常有一个与项目名称主文件名相同的.RES文件,该文件用于保存应用程序图标等资源,对应于此文件,在项目文件中一定含有编译指示“{$R *.res}”,告诉编译器编译时需要包含与项目主文件名相同的.RES文件。同样,如果需要在应用程序中以资源形式包含任何文件类型,也可以利用.RES文件。本文将告诉你如何利用RES文件在Delphi程序内部包含文件。一创建.RES文件
    这里以一组音频文件为例。首先用记事本等任何文本编辑器编写文件“MyMusic.RC”。文件的格式及内容如下:
    SRC1 FILE1 OnlyYou.mp3
    SRC2 FILE2 YesterdayOnceMore.mp3
    SRC3 FILE3 MoonRiver.mp3
    其中,每一行表示声明一项资源,每一项资源的声明包含三个参数定义,第一个参数是资源的名称,第二个参数是资源的类型描述(本例定义了三类),第三个参数是文件名。参数之间必须由空格隔开。
    编写完成“MyMusic.RC”文件后,将其与上述三个.MP3文件放置在同一文件夹中(为了避免由设置路径带来的麻烦)。然后以下面的命令行运行应用程序brcc32.exe(位于..\Delphi6\Bin):brcc32 mymusic.rc需要注意的是,该命令只能在命令行方式下执行。如果系统的PATH环境变量中不包含Delphi的运行路径,那么你还需要将brcc32.exe与MyMusic.RC、三个.MP3文件放置在同一路径中进行。运行上述命令行后,将在同一路径中得到文件“MyMusic.RES”,这就是一个独立完整的资源文件,其格式是遵循Windows 标准的,因此可以在诸如VB、VC、CBuilder等多种开发环境中使用。二在程序中声明包含.RES文件
    你只需要在项目中的某个单元中(最好是你需要利用这些资源的单元,这样会使你的应用程序更具有可读性)加入如下编译指示:
    $R MyMusic.RES}
    { 尽管该编译指示可以位于单元的任何位置,但为了使你的源代码结构合理,最好还是将其并列位于编译指示“{$R *.dfm}”(每个含有窗体文件的单元中都含有该行编译指示)。这里的编译指示就明确告诉编译器,在编译应用程序时需要将资源文件“MyMusic.RES”包含到应用程序中。三在运行时获取资源
    上述两步工作仅仅是基础(但一定是必要的),利用资源才是根本目的。下面的过程将告诉你如何将应用程序中包含的资源(文件)重新还原。
    procedure MusicResToFile(const ResName, ResType,FileName: string);
    var
    Res: TResourceStream;
    begin
    Res := TResourceStream.Create(HInstance,ResName, PChar(ResType));
    Res.SaveToFile(FileName); //将资源保存为文件,即还原文件
    //你还可以进行其它的流操作,在内存中实现对资源利用而不必另存为文件
    Res.Free;
    end;
    调用该过程的示例如:
    MusicResToFile('SRC2', 'FILE2', 'TheSecondMusic.MP3'); 值得一提的是,利用此方法,你完全可以制作自己的安装程序,该安装程序仅包含一个可执行文件,在该可执行文件中以资源的形式包含所有将要安装的内容(文件)。此外,如果在你的应用程序中需要播放外部音频文件(如背景音乐、声音提示等),也可通过此方法将这些外部文件包含到应用程序中,从而避免用户误删这些音频文件导致应用程序的不完整。不知满意否?
      

  2.   

    资 源 是 存 放 在 扩 展 名.RES 的 文 件 里 的 二 进 制 数 据 结 构, 在DELPHI 中 资 源 文 件 可 以 使 用 图 象 编 辑 器 来 制 作(IMAGE EDITOR), 或 者 使 用 其 他 的 工 具。 如:BORLAND 公 司 提 供 的RAD PACK FOR DELPHI 中 的RESOURCE WORKSHOP 来 创 建。 资 源 文 件 中 通 常 存 放 的 是 应 用 程 序 可 以 随 时 存 取 的 一 些 对 象, 包 括:ICON、CURSOR、BITMAP、FONT 等 近 十 种。 大 部 分 的 资 源 在 通 常 的 情 况 下 可 以 保 留 在 磁 盘 当 中, 直 到 程 序 需 要 使 用 它 们 时 才 将 其 调 入, 可 以 大 大 的 节 省 内 存 资 源, 同 样, 资 源 文 件 也 是 可 以 共 享 的, 即: 多 个 程 序 可 以 共 享 一 个 资 源 文 件, 进 而 减 少 了 在 应 用 程 序 之 间 代 码 重 复 的 现 象, 使 程 序 的 代 码 得 到 很 大 的 优 化, 因 此 在 应 用 程 序 中 使 用 资 源 文 件 有 独 立 制 作、 方 便、 随 时 修 改 而 不 需 要 对 应 用 程 序 代 码 做 任 何 修 改 的 好 处。           一 般 来 说, 一 个 应 用 程 序 的 所 有 资 源 都 存 放 在 一 个RES 文 件 里, 然 后 在DELPHI 进 行 编 译 的 阶 段 将 资 源 文 件 的 内 容 与 最 终 的EXE 文 件 合 并 在 一 起, 因 此 编 译 后 的RES 文 件 并 没 有 什 么 作 用, 仅 仅 提 供 用 来 查 阅 使 用, 在 分 发 应 用 时 不 必 把RES 文 件 分 发 给 最 终 用 户。 当 然, 不 同 的 资 源 可 以 分 别 放 在 不 同 的 资 源 文 件 当 中, 而 且 资 源 文 件 越 小 调 入 内 存 的 速 度 越 快。 在 这 里 还 要 说 明 的 一 点 是: 在 修 改 了 原 来 的 资 源 文 件 之 后, 在 原 来 编 译 的EXE 文 件 中 加 入 的 资 源 不 会 随 之 而 更 新, 只 有 在 重 新 进 行 编 译 以 后, 才 能 将 新 的 资 源 加 入 到 新 的EXE 文 件 当 中 去。           下 面 我 们 通 过 两 个 例 子 来 说 明 在DELPHI 中 如 何 使 用 资 源 文 件( 在 这 里 我 们 不 讲 述 资 源 文 件 的 制 作 方 法)。  一、 如 何 在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 属 性。 如 何 实 现 则 可 以 按 以 下 步 骤 进 行:  使 用 资 源 文 件 编 辑 器(IMAGE EDITOR 或 者RESOURCE WORKSHOP) 编 写 资 源 文 件。  定 义 一 个 光 标 常 量, 注 意 这 个 常 量 不 能 与DELPHI 中 提 供 的 光 标 常 量 相 冲 突。  
    在FORMCREATE 事 件 中 使 用WINDOWS API 当 中 的LOADCURSOR 函 数 来 载 入 自 定 义 的CURSOR。  
    在 程 序 中 将 自 定 义 的CURSOR 分 配 给PANEL 的CURSOR 属 性。  
             下 面 说 明 如 何 将 自 定 义 的 一 只 手 的 鼠 标 光 标 赋 给PANEL1 的CURSOR 属 性。 首 先 使 用IMAGE EDITOR 建 立 一 个HAND.RES 的 文 件。 之 后 按 如 下 书 写 程 序 代 码:  implementation {$R *.DFM} constCrhand=2;procedure TForm1.FormCreate(Sender: TObject);beginscreen.cursors[crhand]:=loadcursor(Hinstance,'hand');panel1.cursor:=crhand;end;
             除 了 编 写 上 面 的 代 码 以 外, 我 们 还 需 要 做 的 一 项 工 作 是 将 资 源 文 件 加 入 到 项 目 文 件 当 中 去, 编 译 指 令 中 的{$R filename} 伪 指 令 让 我 们 来 增 加 资 源 文 件, 让 我 们 来 看 一 看 项 目 文 件 的 代 码。  program PCUR; uses  Forms,  HAND in 'HAND.pas' {Form1};
             {$R *.RES}// 这 里 的* 意 义 为 在 程 序 编 译 以 后 会 产 生 一 个 与 项 目 文 件 同 名 的 资 源 文 件, 在 这 里 为PCUR.RES 文 件, 这 部 分 是 自 动 产 生 的。           {$R hand.res}// 这 部 分 是 我 们 自 己 加 入 的 自 定 义 资 源 文 件, 这 两 个 资 源 文 件(HAND.RES 和//PCUR.RES 中 的 资 源 都 会 附 加 在 可 执 行 文 件PCUR.EXE 的 后 面。  begin  Application.Initialize;  Application.CreateForm(TForm1, Form1);  Application.Run;end.
    二、 资 源 文 件 在 编 写 动 画 程 序 中 的 应 用 
             上 面 的 例 子 使 用 的 是 在 资 源 文 件 中 存 储 的CURSOR 资 源 , 在 下 面 的 例 子 中 我 们 将 使 用 的 是 在 资 源 文 件 中 提 供 的ICON 资 源 来 编 写 一 个 小 小 的 动 画 程 序。 在 这 里 动 画 的 产 生 是 利 用 定 时 器 在 一 定 的 时 间 间 隔 内 产 生TIMER 事 件 将 存 储 在 资 源 文 件 中 的ICON 依 次 的 绘 制 在FORM 的 同 一 处 而 产 生 的。 这 时 要 用 到 画 布CANVAS 的DRAW 方 法, 其 声 明 如 下:           procedure Draw(X, Y: Integer; Graphic: TGraphic);           在 这 个 方 法 当 中 的 参 数GRAPHIC 可 以 为:BITMAPS、ICONS、METAFILES。 具 体 的 实 现 方 法 为: 建 立DEMO.RES 文 件, 其 中 含 有 名 为ICON1 —ICON6 的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    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementationvarwicon:array[0..5]of Ticon;        // 建 立TICON 类 型 的 数 组 存 储ICON 文 件idx:integer; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject);variconname:string;piconame:pchar;beginpiconame:=stralloc(7);          // 建 立PCHAR 类 型 的 字 符 串for idx:=0 to 5 dobeginwicon[idx]:=ticon.create;// 建 立TICON 型 对 象iconname:='icon'+inttostr(idx);strpcopy(piconame,iconname);          // 将STRING 类 型 转 换 成PCHAR 类 型wicon[idx].handle:=loadicon(hinstance,piconame);            // 调 用WINDOWS API 中 的LOADICON 函 数            // 载 入 资 源 中 的ICONend;strdispose(piconame);//PCHAR 类 型 的 删 除form1.canvas.draw(3,3,wicon[1]);         // 调 用DRAW 的 方 法 在FORM 上 画 出ICON1idx:=1;form1.setbounds(0,0,100,100);       // 固 定FORM 的 大 小 和 位 置end; procedure TForm1.Timer1Timer(Sender: TObject);             // 形 成 动 画 的 定 时 器 事 件beginidx:=idx+1;if idx=6then idx:=1;form1.canvas.draw(3,3,wicon[0]);form1.canvas.draw(3,3,wicon[idx]);end; end.
             以 上 可 以 作 为 一 个 通 用 的 动 画 程 序, 我 们 只 需 要 修 改 不 同 的ICON 以 及 增 加IDX 的 大 小 就 可 以 编 出 不 同 的 动 画 应 用( 同 样 在 资 源 中 可 以 有 其 他 形 式 的 图 形 如:BITMAPS 这 时 需 要 动 态 创 建 的 是TBITMAPS 对 象 而 不 是TICON 对 象)。 在 两 个 例 子 中 我 们 都 用 到 了WINDOWS API 函 数, 这 些 函 数 在WINDOWS 单 元 中 均 有 说 明 在 这 里 不 加 赘 述。 以 上 的 两 个 例 子 只 是 资 源 文 件 的 一 点 点 应 用, 要 真 正 的 掌 握 资 源 文 件 在 程 序 设 计 中 的 强 大 作 用, 还 要 靠 自 己 在 实 践 中 不 断 的 总 结。  
      

  3.   

    看看这里吧,保证不会让你失望:http://bit.2best.cc/
      

  4.   

    主  题:  怎样能把JPEG图打包到资源文件中?在线等待 
    作  者:  Liusp (夜深千帐灯)  
    等  级:    
    信 誉 值:  100 
    所属论坛:  Delphi 基础类 
    问题点数:  50 
    回复次数:  12 
    发表时间:  2002-11-12 15:31:12 
       
     
       
    请有经验的朋友帮忙!先谢啦!
      
     
     
     回复人: ChinaOk(授人以鱼,不如授人以渔) ( ) 信誉:100  2002-11-12 15:44:00  得分:0 
     
     
      这个其实只要搜索一下就可以找到答案。一个例子http://www.ChinaOK.net/Down/big_res.zip
      
     
    Top 
     
     回复人: wzrlover(流光逝水) ( ) 信誉:100  2002-11-12 15:57:00  得分:0 
     
     
      打开记事本写入:
    MYJPEG JPEG "d:\1.jpg" 
    另存为d:\Myres.txt;在MSDOS中调用Delphi\bin目录下执行
    brcc32 d:\Myres.txt就可以生成Myres.res调用:
      1)在.dpr中引用Myres.res
      program xxxx;  uses
       .....  {$R *.res}
      {$R MyRes.res}
      begin
        Application.Initialize;
        ......
        Application.Run;
      end.
    2)在单元中添加这个过程
    procedure LoadJPEGFromRes(TheJPEG : string; ThePicture : TPicture);
    var
      ResHandle : THandle;
      MemHandle : THandle;
      MemStream : TMemoryStream;
      ResPtr : PByte;
      ResSize : Longint;
      JPEGImage : TJPEGImage;
    begin 
      ResHandle := FindResource(hInstance, PChar(TheJPEG), 'JPEG'); 
      MemHandle := LoadResource(hInstance, ResHandle); 
      ResPtr := LockResource(MemHandle); 
      MemStream := TMemoryStream.Create; 
      JPEGImage := TJPEGImage.Create; 
      ResSize := SizeOfResource(hInstance, ResHandle); 
      MemStream.SetSize(ResSize); 
      MemStream.Write(ResPtr^, ResSize); 
      FreeResource(MemHandle); 
      MemStream.Seek(0, 0); 
      JPEGImage.LoadFromStream(MemStream); 
      ThePicture.Assign(JPEGImage); 
      JPEGImage.Free; 
      MemStream.Free; 
    end;在form.oncreate中:
      LoadJPEGFromRes('MyJPEG',Image1.Picture);
      
     
    Top 
     
     回复人: blueshu() ( ) 信誉:100  2002-11-12 16:03:00  得分:0 
     
     
      新建一言语本文件内容为
    1 jpg myjpg.jpg
    改其扩展名为.rc
    然后用brcc32.exe *.rc就行了  
     
    Top 
     
     回复人: My_first(海浪) ( ) 信誉:100  2002-11-14 08:34:00  得分:0 
     
     
      点击project-->resources-->
    点击右击,-->new--user date出现一个条目,弹出一对话框,选择你的.jpg文件,好了把资源默认的资源标识改为'Myjpg',点右键就可以改的了Var
       Stream:TStream;
       MyJpg:TJpegImage;
      Begin
       Stream:=TResourceStream.Cceat(HINSTANCE,'MyJpg','JPEG');
       Try
         MyJpg:=TJpegImage.Create;
        Try
          MyJpg.LoadfromStream(Stream);
          Image1.Picture.Assignc(MyJpg);
        Finally
          MyJpg.Free;
        end;
       Finally
        Stream.Free;
       end;
      end;
      
     
    Top 
     
     回复人: Liusp(夜深千帐灯) ( ) 信誉:100  2002-11-14 11:42:00  得分:0 
     
     
      我的资源要打包在DLL中,然后主程序通过DLL来调用,怎么实现呢?
      
     
    Top 
     
     回复人: My_first(海浪) ( ) 信誉:100  2002-11-14 16:07:00  得分:0 
     
     
      昨天看到的。
    可以制作纯粹的资源DLL文件,如library Pictures;
    {$R Test.res }
    begin
    end.即可将其编译为一个DLL文件!然后
    var hDll:Hmodule;hDll:= LoadLibrary('Test.dll');
    //可以用LoadString,LoadIcon,LoadCursor等载入资源
    如:
    Hicon:=Loadicon(hDll,'TestIcon');Wav音乐直接播放的话可以用PlaySound,未知数据类型可用流,如:
    Stream:=TResourceStream.Create
      
     
    Top 
     
     回复人: Liusp(夜深千帐灯) ( ) 信誉:100  2002-11-14 18:03:00  得分:0 
     
     
      问题我要的是打包JPG图啊!
      
     
    Top 
     
     回复人: My_first(海浪) ( ) 信誉:100  2002-11-15 09:11:00  得分:0 
     
     
      user date在程序里调用 Stream:TStream;
       MyJpg:TJpegImage;
      Begin
       Stream:=TResourceStream.Cceat(HINSTANCE,'MyJpg','JPEG');
       Try
         MyJpg:=TJpegImage.Create;
        Try
          MyJpg.LoadfromStream(Stream);其它文件也一样。通过数据流的方式什么格式的文件都可以。
      
     
    Top 
     
     回复人: Liusp(夜深千帐灯) ( ) 信誉:100  2002-11-15 09:26:00  得分:0 
     
     
      我很感谢楼上兄弟的热心,可是这样能让EXE从DLL中调用JPG资源吗?EXE中应该怎样写?DLL中又应该怎样写啊
      
     
    Top 
     
     回复人: My_first(海浪) ( ) 信誉:100  2002-11-15 09:29:00  得分:0 
     
     
      然后
    var hDll:Hmodule;hDll:= LoadLibrary('Test.dll');
    //可以用LoadString,LoadIcon,LoadCursor等载入资源
    如:
    Hicon:=Loadicon(hDll,'TestIcon');Wav音乐直接播放的话可以用PlaySound,未知数据类型可用流,如:
    Stream:=TResourceStream.Create  
     
    Top 
     
     回复人: abomb(随风而逝) ( ) 信誉:100  2002-11-15 09:44:00  得分:0 
     
     
      作rc文件
    TEST1 DLLRES "test1.dll"
    TEST2 EXERES "test2.exe"
    TEST3 BPLRES "test3.bpl"
    然后,将这个RC文件加入到Project中。程序运行时,取出资源文件并存成文件。
    bool SaveResToFile(LPCSTR ResName, LPCSTR ResType, LPCSTR FileName)
    {
        int hFile;
        HRSRC hRes;
        HANDLE hMem;    hRes = FindResource(HInstance,
            ResName, ResType);
        if (hRes==NULL) return false;    if (FileExists(FileName))
            DeleteFile(FileName);
        hFile = FileCreate(FileName);
        if (hFile==-1) return false;
        hMem = LoadResource(HInstance,hRes);
        FileWrite(hFile, LockResource(hMem),
            SizeofResource(HInstance,hRes));
        FileClose(hFile);  return true;
    }调用这个函数,将资源存成文件:
    SaveResToFile("TEST1", "DLLRES", "Test1.dll");
      
     
    Top 
     
     回复人: ly_liuyang(Liu Yang) ( ) 信誉:100  2002-11-15 10:15:00  得分:0 
     
     
      My_first(海浪) 是最好的
    现在写RC文件是效率低的笨办法!
    Delphi的IDE可以直接实现资源的引入!
      
     
    Top