知识大全 谈Delphi编程中资源文件的应用

Posted 文件

篇首语:成功需要付出代价,不成功需要付出更高的代价。。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 谈Delphi编程中资源文件的应用相关的知识,希望对你有一定的参考价值。

谈Delphi编程中资源文件的应用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 初级应用篇  资源文件一般为扩展名为res的文件 在VC中资源文件用得非常普遍 但Delphi在其联机帮助中对资源文件没作什么介绍 其实利用其自带的资源编译工具BRCC EXE(一般位于\\Delphi\\BIN目录下) 我们完全可以做出跟VC一样效果的文件来     资源文件最大的好处是能将一些在必要时才调用的文件跟可执行文件一起编译 生成一个文件 这样做最大的好处就是使外部文件免遭破坏 例如在一条程序中你要临时调用一幅图片 一般作法是把图片放在某一路径下(通常是主程序所在路径) 但如果用户路径误删你的图片文件 则可能使程序找不到相应文件而出错崩溃 另外 如果你想自己的程序界面美观 想用一些自定义光标 也要用到资源文件     资源文件的使用步骤为      编写rc脚本文本    用记事本或其它文本编辑器编写一个扩展名为rc的文件 例如  

mycur cursor move cur //加入光标  mypic Bitmap Water BMP //加入位图  mywav WAVE happy wav //加入声音  myAVI AVI EPOEN AVI //加入视频  myIco ICON CJT ICO //加入图标 

  格式分别为在资源文件中的名称 >类型 >实际文件名称 例如上面第一行定义一个名为mycur的光标 实际名称为加入光标move cur      将rc文件编译成res资源文件    将脚本文件和实际文件拷到Brcc EXE所在目录 执行DOS命令 格式为 Brcc 脚本文件(回车) 例如有一名为myfirst rc的脚本文件 则执行 Brcc myfirst rc(回车)即可 如果你是懒人 也可新建一批处理文件 内容只有一行 Brcc mufist rc (因为Delphi安装后一般会在自动批处理文件中指明搜索路径的 )如果编译成功 则会生成一个结尾为res的文件 这个文件就是我们需要的资源文件      在Delphi单元中加入资源文件    将生成的res资源文件拷贝到你所编程序的路径下 在单元文件$R *DFM后加上一句$R mufirst res 则将res文件加入去 编译后资 源文件即已包含在可执行文件中了 若你有多个资源文件 也按上法依次加入      在Delphi程序中调用资源文件      资源文件在Delphi中的关键字为hinstance 下面给出具体用法     < >光标的调用    首先在程序中定义一个值大于 的常量 因为Delphi本身用 负 来索引默认的光标 所以我们制定的光标应从表面上 开始索引 然后在窗口的Oncreat事件中添加以下代码   screen cursor[ ]:=Loadcursor (hinstance mycur );    其中 为大于 的常量 mycur为光标在资源文件中的名字 如果希望在其他控件上使用定制光标 例如Panel控件 只需在程序的适当处加入以下代码   Panel cursor:= ;    < >位图的调用    新建一项工程 添加一Timage控件 在需要显示的地方写以下代码   Var mymap:Hbitmap;  begin  mymap:=LoadBitmap(hinstance mypic );  Image picture Bitmap Handle:=mymap   end;    其中 mypic 为位图资源文件中的名称     〈 〉AVI文件的调用    新建一工程 添加一Animate控件 在需要的地方加入   animater resname:= myAVI ;  animater Active:=true;    其中myAVI为视频文件在资源文件中的名称     〈 〉调用WAV文件    在uses中加入mmsystm单元 以便在程序中播放WAV文件 播放时Playsound(pchar( mywav ) hinstance sndsync or snd_resource);其中mywav为声音文件在资源中的名称     〈 〉加入光标    加入光标比较容易 只要将res文件加入单元文件中即可 但需注意 名称最好取 W WW 等 使第一个字母尽量靠后 以免与主程序的图标顺序颠倒 这样一来 别人在使用你的程序时如果想选择其它图标就有很多选择了   补充      资源类型除上述类型外 还可以字体文件 字符串文件等      资源文件不但可以在标准图形界面下使用还可在控制台下使用     下面我们来试验一下     新建一工程 将唯一的一个Form删除 然后修改工程文件 增加一句$Apptype console 在uses子句中加入mmsystem 并将其它引用单元删掉 将Begin和end之间语句删掉 至此 我们就可和Turbo PASCAL下编程序一样 且还可以调用windows的API和资源 将资源文件 $R myfist res加入 在Begin和end之间写下   writeln( 演示程序 按任意键开始! );  readln;  playsound(pchar( mywav ) hinstance snd_sync or snd_resource);  writeln( 演示结束! );    运行程序 将弹出一个标准DOS窗口 按任意键播放声音文件 是不是很COOL呢!我曾下载过一个播放器 在其安装目录下我发现有一 DOS程序 用鼠标双击它便弹出一个DOS窗口 显示DOS时代特有的画图 并有背景音乐!可能就是用这个方法做的      Delphi本身自带了一个叫Image Editor的工具 同样可以编辑资源文本 但和本文的方法比较 可得出下表  

   Image Editor  Brcc BMP 只支持 位色 任意色  光标 黑白两色 任意色 ICO  只支持 位色  任意色  AVI  不支持  支持  WAV  不支持  支持 

字体字符串其他

不支持  支持 

  上面说的是直接在程序本身的调用 其实资源文件还有其它用法 比如说在你的程序携带其它文件 要用的时候释放出来     例如: myexe exefile ha exe //脚本文件    下面是自定义释放函数ExtractRes 本例中使用如下:  ExtractRes( exefile myexe c:\\new exe );    就把ha exe以new exe为名字保存到C盘根目录下了  

function TForm ExtractRes(ResType ResName ResNewName: string): boolean;  var  Res: TResourceStream;  begin  try  Res := TResourceStream Create(Hinstance Resname Pchar(ResType));  try  Res SavetoFile(ResNewName);  Result := true;  finally  Res Free;  end;  except  Result := false;  end;      二 中级应用篇  上面我们已经知道如何把一副BMP图像从资源文件里面读出来 但是BMP文件太大了 JPG文件应用的相对较多 那么如何把JPG图像读出来呢?用资源文件加流方式即可 具体方法如下:    ( )MyJpg JPEG My JPG    ( )Var     Stream:TStream;     MyJpg:TJpegImage;    Begin     Stream =TResourceStream Cceat(HINSTANCE MyJpg JPEG );     Try       MyJpg:=TJpegImage Create;      Try        MyJpg LoadfromStream(Stream);        Image Picture Assignc(MyJpg);      Finally        MyJpg Free;      end;     Finally      Stream Free;     end;    end;    读取其它图片文件也是一样的 比如说gif动画文件 当然前提是你有一个gif pas 这个单元很多站点都有的 可以自己去找找 实际应用中我还发现用上面的代码可以直接显示资源文件中的ICON和BMP     说到图形处理 实际上还可以用Delphi创建 调用纯图标资源的DLL 比如说你可以看看超级解霸目录下的Dll 很多就是纯图标资源而已 具体方法如下:    ( ):创建一个Hicon RES文件 这里不再重复     ( ):新建一文本文件Icon dpr 内容如下:  library Icon;  $R Icon RES  begin  end     用Delphi打开编译即可得到Icon dll     ( ):实际调用方法如下:     Private    Hinst:THANDLE;     Var Hicon:THANDLE;  begin   Hinst:=Loadlibrary( Icon dll );   If Hinst=  Then Exit    Hicon:=Loadicon(Hinst Pchar(Edit Text));  If Hicon<>  Then Image Picture Icon Handle:=Hicon;   FreeLibrary(Hinst);  end;    如果你的程序想在国际上供使用不同语言的人使用的话 用Dll来存放字符资源将是一个好方法 因为Dll不象ini文件那样可以被人随便修改 特别是有时侯如果想保存一些版权信息的话用Dll就再好不过了 比如说你准备开发一个 汉字简繁体翻译器 软件 准备提供Gb Big 码和英文三种语言菜单给用户 那么你可以试试用Dll来保存字符资源     我们需要建立三个Dll 第一步当然是写Rc文件 举Gb 码为例 内容如下:  /*MySc rc*/  #define IDS_MainForm_Caption   #define IDS_BtnOpen_Caption   #define IDS_BtnSave_Caption   #define IDS_BtnBig _Caption   #define IDS_BtnGb _Caption   #define IDS_BtnHelp_Caption   #define IDS_Help_Shelp   Stringtable    IDS_MainForm_Caption 汉字简繁体翻译器   IDS_BtnOpen_Caption 打开文件   IDS_BtnSave_Caption 保存文件   IDS_BtnBig _Caption 转换成Big   IDS_BtnGb _Caption 转换成Gb   IDS_BtnHelp_Caption 帮助   IDS_Help_Shelp 输入文字或打开文件后按需要点击按钮即可转换!       第二步是Brcc 编译为Res文件后用上面的方法得到Dll文件 另外两个Dll用同样的方法生成 下面来应用一下:    新建一个工程 放上五个Button:BtnOpen BtnSave BtnBig BtnGb 和BtnHelp 还有一个TComboBox:CbSelect用来选择语言种类的   具体代码如下:  unit Unit ;  interface    private  SHelp: string;  function SearchLanguagePack: TStrings;  procedure SetActiveLanguage(LanguageName: string);  Private declarations     implementation  procedure TForm CbSelectChange(Sender: TObject);  begin  SetActiveLanguage(CbSelect Text);//调用相应Dll文件读取相应字符   end;  procedure TForm FormCreate(Sender: TObject);  begin  CbSelect Items AddStrings(SearchLanguagePack);//搜索当前目录下所有的Dll文件名称  end;  function TForm SearchLanguagePack: TStrings;  var  ResultStrings: TStrings;  DosError: integer;  SearchRec: TsearchRec;  begin  ResultStrings := TStringList Create;  DosError := FindFirst(ExtractFilePath(ParamStr( )) + * dll faAnyFile SearchRec);  while DosError = do  begin  ResultStrings Add(ChangeFileExt(SearchRec Name ));  DosError := FindNext(SearchRec);  end;  FindClose(SearchRec);  Result := ResultStrings;  end; 

procedure TForm SetActiveLanguage(LanguageName: string);  var  Hdll: Hmodule;  MyChar: array[ ] of char;  DllFileName: string;  begin  DllFileName := ExtractFilePath(ParamStr( )) + LanguageName + dll ;  if not FileExists(DllFileName) then Exit;  Hdll := loadlibrary(Pchar(DllFileName)); 

Loadstring(hdll MyChar );  Self Caption := MyChar;  //读取字符资源 表示资源文件中定义的   Loadstring(hdll MyChar );  Self Caption := MyChar; 

Loadstring(hdll MyChar );  BtnOpen Caption := MyChar; 

Loadstring(hdll MyChar );  BtnSave Caption := MyChar; 

Loadstring(hdll MyChar );  BtnBig Caption := MyChar; 

Loadstring(hdll MyChar );  BtnGb Caption := MyChar; 

Loadstring(hdll MyChar );  BtnHelp Caption := MyChar; 

Loadstring(hdll MyChar );  SHelp := MyChar; 

Freelibrary(hdll);  Application Title := Self Caption;  //   BtnOpen Visible := True;  BtnSave Visible := True;  BtnBig Visible := True;  BtnGb Visible := True;  BtnHelp Visible := True;  //   end;  procedure TForm BtnHelpClick(Sender: TObject);  begin  Application MessageBox(Pchar(SHelp) Http://lovejingtao MB_ICONINFORMATION);  end;  end     可能你会说 这种方法还不如我自己在程序中直接定义三种具体的值来的方便 甚至我自己自定义一个结构好了 用不着用DLL那么麻烦的 但是如果你的程序要用的字符很多呢?比如说Windows操作系统 本身就有简体中文 繁体中文 英文等等版本 用Dll的话只要直接替换DLL即可 而不用每发行一个版本就打开代码来修改一次 这样一来可以大大减少工作量和出错的机会 说到这里 再多说一句:Windows系统本身很多Dll带有了图片等资源 我们可以在程序中直接调用 这样一来我们的EXE也可以减少不少!当然最小的方法是实时生成技术 老外曾经写了一个 KB的程序就是利用了这个方法 感兴趣的朋友可以到//go /lovejingtao/ha exe下载        三 高级应用篇  Delphi是个很有效率的开发工具 但是它有一个缺点就是生成的EXE文件太大 一个程序就算只有一个空窗口体积也有 KB 如果直接用API来写的话程序体积是小了 但是又太繁琐 无法立即看到界面效果 根本谈不上是可视化开发 其实并非 鱼与熊掌不可兼得 利用资源文件我们就可以轻松达到这个目的     在开始之前 我们需要一个可以编辑资源文件的工具 这类工具很多 比如说Resource WorkShop就是非常好的一个 如果一时找不到 利用VC的编辑器来也是可以的 下面我们就以VC的为例示范如何创建一个窗口资源文件 运行VC 打开菜单File >New 将出现一个多项选择页 我们选择Files >ResourceTemplate 在右边的File填上Demo Location选择保存路径 然后点击按钮OK返回VC开发环境     选择菜单Insert >Resource 将出现一个资源类型选择框 我们把鼠标移到Dialog上面 不用展开 点击右边的New即可 这时候返回VC开发环境并出现一个只有关闭按钮和两个Button的窗体 将鼠标选定窗体 击右键选择最后一项Properties 将出现一个设置窗口 将ID改为 MAINFORM (注意:跟下面添加的其它控件的属性设置方法不同 主窗口的ID必须把双引号写上去 而且名称必须为大写 否则程序将找不到资源 程序会一运行就退出了 )Caption改为 安装程序 这时候可以立刻看到窗口的标题变成了 安装程序 把Styles的Minimize box选上 More Styles的Center勾上使程序运行时的位置居中 当然你也可以设置它的坐标 其它保留默认值即可 回到开发环境 在控件框里面分别选择一个Static Text 一个Edit Box 一个Button和一个Group Box添加到窗体上面 把它们按照自己的爱好排列整齐 然后逐个修改它们的属性 方法就是按照上面说的选定控件后击右键选择最后一项Properties 在出现的属性框里面修改 其中属性如下:Group Box的Caption属性清空 Static Text的Caption属性改为 请选择安装目录: Edit Box的ID改为 第一个Button的ID为 Caption属性为 选择 第二个Button的ID为 Caption属性为 安装 第三个Button的ID为 Caption属性为 退出 为了使程序更加完美 我们为它再添加一个菜单IDR_MENU 选择Insert >Resource >Menu 我们这里只简单添加一项 文件 >退出 其中 退出 的ID为 然后在主窗口的属性Menu设定为IDR_MENU 即可     为了使程序更加美观 我们再添加一个小图标 同时这也将是我们程序的图标 选择Insert >Resource >Icon >Import 选择一个图标文件 并将它的ID设置为 MAINICON (注意:必须把双引号写上而且字母为大写) 为窗口添加一个Picture控件并设置它的属性Type:Icon Image下拉选择刚才的图标MainIcon即可     如果你想为程序在鼠标添加一些信息也是可以的 选择Insert >Resource >Version即可     到这里我们已经完成了一个简单的 安装程序 的窗体设计 实际上我们现在就可以在Delphi中调用它了 我们先把 劳动成果 保存起来 选择File >Save As 在文件类型里选择 bit Resource File( res) 保存为 Demo res 文件大小大约为 KB     新建一个扩展名为dpr的文本文件MyDemo Dpr 键入如下代码:  Uses Windows Messages;  $R Demo Res  function MainDialogProc(DlgWin:hWnd;DlgMessage:UINT;DlgWParam:WPARAM;DlgLParam:LPARAM):integer;stdcall;  begin  Result := ;  case DlgMessage of  WM_Close:  begin  PostQuitMessage( );  Exit;  end;  end;  end;  begin  DialogBox(hInstance MAINFORM @MainDialogProc);  end     用Delphi打开它编译一次即可产生一个大小为 KB的EXE 是不是很小!实际上 你甚至只用一行代码就把它Show出来 不过程序无法关闭而已   Uses Windows;  $R Demo Res  function MainDialogProc: integer;  begin  Result := ;  end;  begin  DialogBox(hInstance MAINFORM @MainDialogProc);  end     上面的程序只不过是一个空窗口而已 现在我们来写代码响应按下相应按钮响应的事件 完整代码如下:  program MyDemo;  uses Windows Messages shlobj;  const  ID_Edit = ;  ID_Selet = ;  ID_Setup = ;  ID_Quit = ;  ID_Exit = ;  $R Demo Res  var  MainWin: HWND; 

function My_Gettext: string;  var  Textlength: Integer;  Text: PChar;  s: string;  begin  TextLength := GetWindowTextLength(GetDlgItem(MainWin ID_Edit));  GetMem(Text TextLength + );  GetWindowText(GetDlgItem(MainWin ID_Edit) Text TextLength + );  s := text;  FreeMem(Text TextLength + );  Result := s;  end; 

function Getmyname: string;  var  i j: integer;  begin  J := ;  for i := to length(ParamStr( )) do  if ParamStr( )[i] = \\ then J := I;  Result := copy(ParamStr( ) J + length(ParamStr( )) J);  end; 

function SelectDirectory(handle: hwnd; const Caption: string; const Root:WideString;outDirectory:string): Boolean;  var  lpbi: _browseinfo;  buf: array[ MAX_PATH] of char;  id: ishellfolder;  eaten att: cardinal;  rt: pitemidlist;  initdir: pwidechar;  begin  result := false;  lpbi hwndOwner := handle;  lpbi lpfn := nil;  lpbi lpszTitle := pchar(caption);  lpbi ulFlags := BIF_RETURNONLYFSDIRS + BIF_EDITBOX;  SHGetDesktopFolder(id);  initdir := pwchar(root);  id ParseDisplayName( nil initdir eaten rt att);  lpbi pidlRoot := rt;  getmem(lpbi pszDisplayName MAX_PATH);  try  result := shgetpathfromidlist(shbrowseforfolder(lpbi) buf);  except  freemem(lpbi pszDisplayName);  end;  if result then  begin  directory := buf;  if length(directory) <> then directory := directory + \\ ;  end;  end; 

function MainDialogProc(  DlgWin: hWnd;  DlgMessage: UINT;  DlgWParam: WPARAM;  DlgLParam: LPARAM  )  : integer; stdcall;  var  MyIcon: HICON;  Sdir: string;  begin  Result := ;  case DlgMessage of  WM_INITDIALOG:  begin  MyIcon := LoadIcon(hInstance MainIcon );  SetClassLONG(DlgWin GCL_HICON MyIcon);  MainWin := DlgWin;  end;  WM_Close:  begin  PostQuitMessage( );  Exit;  end;  WM_MAND:  case LOWORD(DlgWParam) of 

cha138/Article/program/Delphi/201311/24946

相关参考

知识大全 实现应用程序的文件拖放功能

  在Delphi中有许多控件支持拖放操作但仅限于应用程序内部而不能实现从Windows环境里向应用程序拖放文件本文将要介绍的就是如何用Delphi编写支持文件拖放的应用程序由于主要使用Windows

知识大全 数据访问部件的应用及编程(三)[1]

DELPHI基础教程:数据访问部件的应用及编程(三)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据浏览部件的应用及编程(一)[2]

DELPHI基础教程:数据浏览部件的应用及编程(一)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据浏览部件的应用及编程(一)[1]

DELPHI基础教程:数据浏览部件的应用及编程(一)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据浏览部件的应用及编程(二)[3]

DELPHI基础教程:数据浏览部件的应用及编程(二)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据浏览部件的应用及编程(二)[2]

DELPHI基础教程:数据浏览部件的应用及编程(二)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据浏览部件的应用及编程(二)[1]

DELPHI基础教程:数据浏览部件的应用及编程(二)[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据访问部件的应用及编程(三)[2]

DELPHI基础教程:数据访问部件的应用及编程(三)[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据访问部件的应用及编程(一)[4]

DELPHI基础教程:数据访问部件的应用及编程(一)[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 数据访问部件的应用及编程(一)[3]

DELPHI基础教程:数据访问部件的应用及编程(一)[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一