⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delphi资源文件中级应用篇.txt

📁 学习(编程技巧_编程知识_程序代码),是学习编程不可多得的学习精验
💻 TXT
字号:
delphi资源文件中级应用篇
 

--------------------------------------------------------------------------------
 
第八军团 时间:2003-12-27 12:18:58 
   
上面我们已经知道如何把一副BMP图像从资源文件里面读出来,但是BMP文件太大了, 
JPG文件应用的相对较多.那么如何把JPG图像读出来呢?用资源文件加流方式即可。具体方法如下: 
(1)MyJpg JPEG My.JPG 
(2)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; 
读取其它图片文件也是一样的.比如说gif动画文件,当然前提是你有一个gif.pas, 
这个单元很多站点都有的,可以自己去找找。实际应用中我还发现用上面的代码可以直 
接显示资源文件中的ICON和BMP. 
说到图形处理,实际上还可以用Delphi创建、调用纯图标资源的DLL.比如说你可以看 
看超级解霸目录下的Dll,很多就是纯图标资源而已。具体方法如下: 
(1):创建一个Hicon.RES文件,这里不再重复. 
(2):新建一文本文件Icon.dpr,内容如下: 
library Icon; 
{$R Icon.RES} 
begin 
end. 
用Delphi打开编译即可得到Icon.dll. 
(3):实际调用方法如下: 
...... 
 Private 
  Hinst:THANDLE; 
...... 
 Var Hicon:THANDLE; 
begin 
 Hinst:=Loadlibrary(‘Icon.dll‘); 
 If Hinst=0 Then Exit; 
 Hicon:=Loadicon(Hinst,Pchar(Edit1.Text)); 
If Hicon<>0 Then Image1.Picture.Icon.Handle:=Hicon; 
 FreeLibrary(Hinst); 
end; 
如果你的程序想在国际上供使用不同语言的人使用的话, 
用Dll来存放字符资源将是一个好方法.因为Dll不象ini文件 
那样可以被人随便修改,特别是有时侯如果想保存一些版权信息 
的话用Dll就再好不过了。比如说你准备开发一个"汉字简繁体翻译器"软件, 
准备提供Gb32,Big5码和英文三种语言菜单给用户,那么你可以试试用Dll来保存字符资源. 
我们需要建立三个Dll.第一步当然是写Rc文件,举Gb32码为例,内容如下: 
/*MySc.rc*/ 
#define IDS_MainForm_Caption 1 
#define IDS_BtnOpen_Caption 2 
#define IDS_BtnSave_Caption 3 
#define IDS_BtnBig5_Caption 4 
#define IDS_BtnGb32_Caption 5 
#define IDS_BtnHelp_Caption 6 
#define IDS_Help_Shelp 7 
Stringtable 
{ 
IDS_MainForm_Caption,"汉字简繁体翻译器" 
IDS_BtnOpen_Caption,"打开文件" 
IDS_BtnSave_Caption,"保存文件" 
IDS_BtnBig5_Caption,"转换成Big5" 
IDS_BtnGb32_Caption,"转换成Gb32" 
IDS_BtnHelp_Caption,"帮助" 
IDS_Help_Shelp,"输入文字或打开文件后按需要点击按钮即可转换!" 
} 
第二步是Brcc32编译为Res文件后用上面的方法得到Dll文件, 
另外两个Dll用同样的方法生成.下面来应用一下: 
新建一个工程,放上五个Button:BtnOpen,BtnSave,BtnBig5,BtnGb32 
和BtnHelp.还有一个TComboBox:CbSelect用来选择语言种类的. 
具体代码如下: 
unit Unit1; 
interface 
...... 
private 
SHelp: string; 
function SearchLanguagePack: TStrings; 
procedure SetActiveLanguage(LanguageName: string); 
{ Private declarations } 
...... 
implementation 
procedure TForm1.CbSelectChange(Sender: TObject); 
begin 
SetActiveLanguage(CbSelect.Text);//调用相应Dll文件读取相应字符. 
end; 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
CbSelect.Items.AddStrings(SearchLanguagePack);//搜索当前目录下所有的Dll文件名称 
end; 
function TForm1.SearchLanguagePack: TStrings; 
var 
ResultStrings: TStrings; 
DosError: integer; 
SearchRec: TsearchRec; 
begin 
ResultStrings := TStringList.Create; 
DosError := FindFirst(ExtractFilePath(ParamStr(0)) + ‘*.dll‘, faAnyFile, SearchRec); 
while DosError = 0 do 
begin 
ResultStrings.Add(ChangeFileExt(SearchRec.Name, ‘‘)); 
DosError := FindNext(SearchRec); 
end; 
FindClose(SearchRec); 
Result := ResultStrings; 
end; 

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

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

Loadstring(hdll, 2, MyChar, 254); 
BtnOpen.Caption := MyChar; 

Loadstring(hdll, 3, MyChar, 254); 
BtnSave.Caption := MyChar; 

Loadstring(hdll, 4, MyChar, 254); 
BtnBig5.Caption := MyChar; 

Loadstring(hdll, 5, MyChar, 254); 
BtnGb32.Caption := MyChar; 

Loadstring(hdll, 6, MyChar, 254); 
BtnHelp.Caption := MyChar; 

Loadstring(hdll, 7, MyChar, 254); 
SHelp := MyChar; 

Freelibrary(hdll); 
Application.Title := Self.Caption; 
//------------------------ 
BtnOpen.Visible := True; 
BtnSave.Visible := True; 
BtnBig5.Visible := True; 
BtnGb32.Visible := True; 
BtnHelp.Visible := True; 
//------------------------ 
end; 
procedure TForm1.BtnHelpClick(Sender: TObject); 
begin 
Application.MessageBox(Pchar(SHelp), ‘Http://lovejingtao.126.com‘, MB_ICONINFORMATION); 
end; 
end. 
可能你会说,这种方法还不如我自己在程序中直接定义三种具体的值来的方便. 
甚至我自己自定义一个结构好了,用不着用DLL那么麻烦的。但是如果你的程序要 
用的字符很多呢?比如说Windows操作系统,本身就有简体中文,繁体中文,英文等等版本, 
用Dll的话只要直接替换DLL即可,而不用每发行一个版本就打开代码来修改一次。 
这样一来可以大大减少工作量和出错的机会.说到这里,再多说一句:Windows系统本身很多Dll 
带有了图片等资源,我们可以在程序中直接调用,这样一来我们的EXE也可以减少不少! 
当然最小的方法是实时生成技术.老外曾经写了一个67KB的程序就是利用了这个方法. 
感兴趣的朋友可以到http://go4.163.com/lovejingtao/ha1.exe下载.  
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -