在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
delphi读取ini文件 INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以 可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其 中Delphi中操作INI文件,最为简洁,这是因为Delphi提供了一个TInifile类, 使我们可以非常灵活的处理INI文件 一.INI文件的结构 [小节名]ini文件 关键字1=值1 关键子2=值2 INI文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是该关键字 的值。 值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时 没有引号,布尔真值用1表示,布尔假值用0表示。 二、定义 入等操作了。 ,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。 值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini 文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的 方法是:为其指定完整的路径及文件名。下面的两条语句可以完成这个功能: Filename:=ExtractFilePath(Paramstr(0))+program.ini; myinifile:=Tinifile.Create(filename); 五、写入INI文件 型数及布尔类型的关键字。
六、删除关键字 方法: myinifile.DeleteKey(小节名,关键字);
myinifile.readsection(小节名,TStrings变量);可将指定小节中的所有关键字 名读取至一个字符串列表变量中; myinifile.readsections(TStrings变量);可将INI文件中所有小节名读取至一个 字符串列表变量中去。 myinifile.readsectionvalues(小节名,TStrings变量);可将INI文件中指定小节 的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。 八、释放 的小节,有3个关键字“用户名称”“已运行时间”“是否正式用户”。运行效 果,可以在edit1里边填入“用户名称”;edit2显示时间,不可以改变数值; checkbox1通过打勾,保存时间和“用户名称”进入myini.ini文件里边,重新打 开应用程序时,显示的时保存下来的时间和填入的“用户名称”,如果在 myini.ini文件里边修改,效果和在程序运行过程中修改时一样的。unit Unit1;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,inifiles, StdCtrls, ExtCtrls; {调用inifiles 类}
TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Edit1: TEdit; Edit2: TEdit; Timer1: TTimer; CheckBox1: TCheckBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
Form1: TForm1;
var myinifile:TInifile; {定义一个类的实例} {$R *.dfm}
filename:string;
{下面两行的书写形式,在应用程序的路径下创建ini文件} filename:=ExtractFilePath(paramstr(0))+myini.ini; myinifile:=TInifile.Create(filename); edit1.Text:=myinifile.ReadString(newini,用户名称,胡长浩); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end;
Form1: TForm1;
var myinifile:TInifile; {定义一个类的实例} {$R *.dfm}
filename:string;
{下面两行的书写形式,在应用程序的路径下创建ini文件} filename:=ExtractFilePath(paramstr(0))+myini.ini; myinifile:=TInifile.Create(filename); edit1.Text:=myinifile.ReadString(newini,用户名称,胡长浩); 一、引言 越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置, 但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍 给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行, 而且在切换的时候不会出现界面的闪烁。 二、InI文件格式说明 1、语种定义 [Language] //语言 DefaultLang = ChineseGB //界面的默认语种(InI文件名,不带扩展名) Language = 语种 //菜单标题 ChineseGB = 简体中文 //相应语种文件名 ChineseBig = 繁体中文 English = 英文 ⑴ 如果DefaultLang项没有设置,则为语种目录中所寻找到的InI的第一个文件 ,做为当前界面语种,所有Ini文件都要设置成一样; ⑵ Language为菜单界面上所显示的标题,不设置时,默认为‘Language’; ⑶ 如果Language以下项没有设置,则相应语种的菜单标题为文件名(不带扩展 名)。 2、窗体界面定义 [FormName] //需要变换的窗口 .Caption = 演示窗体 //本窗口的属性,表示为:[窗口名].属性名 = 语言 Button1.Hint = 按钮说明 //控件的属性,表示为:控件名.属性名 = 语言 ComboBox1.Items = 简体中文||英文 //其中“||”为分隔符 注:⑴ 在InI文件中每行“//”开始的说明文字不要输入; ⑵ 对继承自TStrings的属性,其各个项目之间需用“||”分隔; ⑶ 设计思想来源于KeyZhang所编写的《多语言切换函数 For Delphi》组件。 三、实现原理 RTTI的基本设计思想是在运行时访问给定数据类型的信息,该类型可以是类也可 以是简单的Pascal数据类型(int、string、char等)。本文便是通过RTTI在运 行期,获取组件的相应属性,并进行动态设置,达到多语言切换功能。
四、各个函数的定义及实现 1、程序运行时,我们查找语种目录下所有的语言配置文件(*.ini),为了达到 这个目的,我编写了如下的函数搜索目录下所有的语言配置文件的文件名,然后 将文件名去掉ini扩展名保存返回: procedure SearchLanguagePack (lngStrings: TStrings); var DosError: Integer; SearchRec: TsearchRec; begin DosError := FindFirst (ExtractFilePath (ParamStr (0)) 'Language\*.ini', faAnyFile, SearchRec); while DosError = 0 do begin { 返回的文件名并去掉末尾的.ini字符 } lngStrings.Add (ChangeFileExt (SearchRec.Name, '')); DosError := FindNext (SearchRec); end; FindClose(SearchRec); end; 2、实现界面的多语言切换函数: function ChangeLanguage (Form: TForm; Lngfile: string): Boolean; var INIF: TIniFile; //InI文件 SL: TStringList; // InI文件中读出的相应窗体的信息 TmpSL: TStringList; //将每一行信息,以“=”分隔的信息 Key: string; //“=”左边的信息 Value: string; //“=”右边的信息 CompName: string; //组件名 CompProp: string; //组件属性名 I: Integer; AComponent: TComponent; //相应组件
串分隔 var P, L, C: Integer; begin R.Clear; L := Length (S); //确定分隔符的长度,以便删除字符串中的相应字符 C := Length (SplitChar); //循环分隔字符串 repeat P := Pos (SplitChar, S); //如果在字符串中没有找到分隔符,说明为最后一个 if P = 0 then C := 1; R.Add (Copy (S, P C, L)); Delete(S, P, L); until P = 0; end;
procedure SetPropertyValue (AComponent: TComponent; sProperty, sValue: string); var PropInfo: PPropInfo; AStrings: TStringList; begin if AComponent <> nil then begin PropInfo := GetPropInfo(AComponent, sProperty); if PropInfo <> nil then begin case PropInfo.PropType^.Kind of tkString, tkLString: //字符串属性 SetStrProp(AComponent, PropInfo, sValue); tkInteger: //序数属性 SetOrdProp(AComponent, PropInfo, StrToInt(sValue)); else if PropInfo.PropType^.Name = 'TStrings' then //列表属性 begin AStrings := TStringList.Create; try Split (sValue, '||', AStrings); SetOrdProp (AComponent, PropInfo, Integer (AStrings)); finally AStrings.Free; end; // end try end; // end if PropInfo.PropType^.Name = 'TStrings' end; // end case end; // end if PropInfo <> nil end; // end if AComponent <> ni end;
Result := True; SL := TStringList.Create; try INIF := TIniFile.Create (LngFile); // 打开语种初始化文件 try INIF.ReadSectionValues (Form.Name, SL); // 读取相应窗体信息 finally INIF.Free; end; TmpSL := TStringList.Create; try for I := 0 to SL.Count - 1 do // 分隔每一行信息 begin Split (SL.Strings[I], '=', TmpSL); Key := Trim (TmpSL.Strings[1]); CompName := Trim (Copy(Key, 1, Pos ('.', Key) - 1)); if CompName = '' then // 确定组件 AComponent := Form else AComponent := Form.FindComponent (CompName); CompProp := Trim (Copy (Key, Pos ('.', Key) 1, Length (Key))); Value := Trim (TmpSL.Strings[0]); SetPropertyValue (AComponent, CompProp, Value); // 设置属性 end; finally TmpSL.Free; end; finally SL.Free; end; end;
3、在Form显示的事件中添加代码,将目录下所有的语言文件名加入菜单项: procedure TForm1.FormShow(Sender: TObject); var lngStrings, tmpStrings: TStrings; I: Integer; lngMenu: TMenuItem; Filename: string; IniF: TIniFile; begin lngStrings := TString.Create; try SearchLanguagePack (lngStrings); // 查找语种文件 if lngStrings.Count = 0 then // 没有找到语种文件直接退出 exit; Filename := ExtractFilePath (ParamStr (0)) 'Language\' lngStrings.Strings[0] '.ini'; IniF := TIniFile.Create (Filename); Filename := IniF.ReadString('Language', ' DefaultLang ', '');// 设置为 默认语种 if Filename <> '' then begin Filename := ExtractFilePath (ParamStr (0)) 'Language\' Filename '.ini'; if FileExists (Filename) then begin IniF.Free; IniF := TIniFile.Create (Filename); end; end; lngMenu := TMenuItem.Create (self); lngMenu.Name := 'Language'; lngMenu.Caption := IniF.ReadString('Language', 'Language', 'Language'); MainMenu1.Items[MainMenu1.Items. Count].Add (lngMenu); // 语种菜单放到 主菜单的最后 tmpStrings := TString.Create; try for I := 0 to lngStrings.Count – 1 do // 动态创建菜单项 begin lngMenu := TMenuItem.Create (self); lngMenu.Name := lngStrings.Strings[I]; // 将菜单项的名称赋予文件名 lngMenu.Caption := IniF.ReadString('Language', lngStrings.Strings[I], lngStrings.Strings[I]'); lngMenu.onClick := lngMenuClick; // 菜单事件 Language.Insert (Language.Items.Count, lngMenu); // 添加到语种菜单的最 后一项上 end; finally tmpStrings.Free; end; finally lngStrings.Free; end; ChangeLanguage (Form1, IniF); // 改变界面语种 IniF.Free; end; 4、窗体中语种菜单的事件响应: procedure TForm1.lngMenuClick (Sender: TObject); var Filename: string; begin if Sender is TMenuItem then begin // 确定语种文件,菜单项名称为语种文件名 Filename := ExtractFilePath (ParamStr (0)) 'Language\' (Sender as TMenuItem).Name '.ini'; ChangeLanguage (Form1, Filename); end; end; 五、结束语 通过本次学习,让读者初步了解Delphi编程中运行时类型信息的应用技巧,同时 掌握如何在程序运行时动态创建菜单。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论