INI文件的结构如下
[小节名]
关键字=值
uses IniFiles; {操作Ini文件需要引用TIniFile 的单元}
常用的方法
WriteString 写入字符串
WriteInteger 写入数字
WriteBool 写入布尔值
ReadString 读取字符串值
ReadInteger 读取数字
ReadBool 读取布尔值
ReadSections 读取小节列表
ReadSection 读取某小节下关键字列表
ReadSectionValues 读取某小节下所有内容列表,包括关键字和值
写入
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
var
F:TIniFile;
begin
F := TIniFile.Create('c:/A.ini'); //如果文件存在则打开,如果不存在,当向其中写入数据时,将创建ini文件
F.WriteString('PersonInfo','姓名','张三');
F.WriteInteger('PersonInfo','年龄',20);
F.WriteBool('PersonInfo','婚否',False);
end;
var
F:TIniFile;
begin
F := TIniFile.Create('c:/A.ini'); //如果文件存在则打开,如果不存在,当向其中写入数据时,将创建ini文件
F.WriteString('PersonInfo','姓名','张三');
F.WriteInteger('PersonInfo','年龄',20);
F.WriteBool('PersonInfo','婚否',False);
end;
读取:读取方法的第三个参数表示,当读取失败时,返回的结果,
view plaincopy to clipboardprint?
var
F:TIniFile;
name:string;
age:Integer;
merry:Boolean;
begin
F := TIniFile.Create('c:/A.ini');
name := F.ReadString('PersonInfo','姓名','无名氏'); //当读取失败时,返回'无名氏',否则返回读取的值
age := F.ReadInteger('PersonInfo','年龄',20);
merry := F.ReadBool('PersonInfo','婚否',False);
end;
var
F:TIniFile;
name:string;
age:Integer;
merry:Boolean;
begin
F := TIniFile.Create('c:/A.ini');
name := F.ReadString('PersonInfo','姓名','无名氏'); //当读取失败时,返回'无名氏',否则返回读取的值
age := F.ReadInteger('PersonInfo','年龄',20);
merry := F.ReadBool('PersonInfo','婚否',False);
end;
读取小节的列表
view plaincopy to clipboardprint?
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSections(List); //将小节依次读取到List中
ShowMessage(List.Text); //显示小节列表内容
finally
List.Free;
F.Free;
end;
end;
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSections(List); //将小节依次读取到List中
ShowMessage(List.Text); //显示小节列表内容
finally
List.Free;
F.Free;
end;
end;
读取某小节下的关键字列表
view plaincopy to clipboardprint?
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSection('PersonInfo',List); //将小节依次读取到List中
ShowMessage(List.Text); //显示'PersonInfo'小节下关键字列表内容
finally
List.Free;
F.Free;
end;
end;
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSection('PersonInfo',List); //将小节依次读取到List中
ShowMessage(List.Text); //显示'PersonInfo'小节下关键字列表内容
finally
List.Free;
F.Free;
end;
end;
读取某小节下所有内容列表,包括关键字和值
view plaincopy to clipboardprint?
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSectionValues('PersonInfo',List); //将小节依次读取到List中
ShowMessage(List.Text); //读取某小节下所有内容列表,包括关键字和值
finally
List.Free;
F.Free;
end;
end;
var
F:TIniFile;
List:TStringList;
begin
try
List := TStringList.Create;
F := TIniFile.Create('c:/A.ini');
F.ReadSectionValues('PersonInfo',List); //将小节依次读取到List中
ShowMessage(List.Text); //读取某小节下所有内容列表,包括关键字和值
finally
List.Free;
F.Free;
end;
end;
其它常用方法
EraseSection 删除某个小节
DeleteKey 删除关键字
SectionExists 判断某个章节是否存在
ValueExists 判断某个小节下的某个关键字是否存在
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bdmh/archive/2009/05/04/4147104.aspx
一、INI文件的结构:
; 注释
[小节名]
关键字=值
INI文件允许有多个小节,每个小节又允许有多个关键字, “=”后面是该关键字的值。
值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时没有引号,布尔真值用1表示,布尔假值用0表示。
注释以分号“;”开头。
二、定义
1、在Interface的Uses节增加IniFiles;
2、在Var变量定义部分增加一行:
myinifile:Tinifile;
然后,就可以对变量myinifile进行创建、打开、读取、写入等操作了。
三、打开INI文件
Filename:=ExtractFilePath(Paramstr(0))+’program.ini’;
myinifile:=Tinifile.Create(filename);
四、读取关键字的值
针对INI文件支持的字符串、整型数值、布尔值三种数据类型,TINIfiles类提供了三种不同的对象方法来读取INI文件中关键字的值。
vs:=myinifile.Readstring(’小节名’,’关键字’,缺省值); string类型
vi:=myinifile.Readinteger(’小节名’,’关键字’,缺省值);integer类型
vb:=myinifile.Readbool(’小节名’,’关键字’,缺省值); boolean类型
五、写入INI文件
myinifile.writestring(’小节名’,’关键字’,变量或字符串值); string类型
myinifile.writeinteger(’小节名’,’关键字’,变量或整型数值);integer类
myinifile.writebool(’小节名’,’关键字’,变量或True或False);boolean类型
当这个INI文件不存在时,上面的语句还会自动创建该INI文件。
六、删除关键字
myinifile.DeleteKey(’小节名’,’关键字’);
七、小节操作
增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:myinifile.EraseSection(’小节名’);另外Tinifile类还提供了三种对象方法来对小节进行操作:
myinifile.readsection(’小节名’,TStrings变量);
可将指定小节中的所有关键字名读取至一个字符串列表变量中;
myinifile.readsections(TStrings变量);
可将INI文件中所有小节名读取至一个字符串列表变量中去。
myinifile.readsectionvalues(’小节名’,TStrings变量);
可将INI文件中指定小节的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。
八、释放
在适当的位置用下面的语句释放myinifile:
myinifile.distory;
2005-8-24 15:07 回复
pathog
0位粉丝
2楼
利用Windows API函数WritePrivateProfileString 和GetPrivateProfileString可对.INI文件进行读写操作。其实,对.INI文件的读写完全可以利用Delphi的内置函数来实现。下面就介绍一些对.INI文件读写时相关的类及其属性方法。
1、TIniFile对象
以Delphi中,定义了一个TIniFile对象,将.INI文件封装在其中,并提供一些方法,专门用来对INI文件进行读写操作。如果在程序中要用到TIniFile类或其方法属性,就必须在程序单元的uses语句中手工加入对IniFiles单元的引用。
2、Create方法
该方法用来创建一个处理INI文件的TIniFile类型实例。
方法声明:constructor Create(const FileName:string);
参数说明:FileName指明待创建的INI文件的文件名;
注释:在使用TIniFile对象之前,必须先用此方法创建一个INI文件的实例。FileName中可以包含路径名,缺省时为Windows所在目录(一般就是C:windows,对于Windows NT来说,则一般是c:winnt)。用Create方法创建的实例,在使用完之后,调用Free方法释放内存。
3、ReadSection方法
该方法从INI文件中读出指定段的所有子键名,并存入Strings参数指定的字符串列表对象中。
方法声明:procedure ReadSection(const Section:string; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放子键名的字符串列表;
注释:ReadSection方法仅读入指定段的所有子键名,但不读入子键的值。
4、ReadSections方法
该方法从INI文件中读取所有段名,并存入Strings参数指定的字符中列表中。
方法声明:procedure ReadSections(Strings:TStrings);
参数说明:Strings参数指明存放段名的字符串列表;
注释:ReadSections方法将INI文件中所有段的段名读出,存入一指定的字符串列表中,此字符串列表可以直接使用某个列表框的Items属性。
5、ReadSectionValues方法
该方法从INI文件中读入指定段的所有子键名及其键值,并存入Strings参数指定的字符串列表中。
方法声明:procedure ReadSectionValues(const Section:String; Strings:TStrings);
参数说明:Section指明要读取段的段名;
Strings指明存放段名的字符串列表;
注释:ReadSectionValues方法与ReadSection方法的区别在于后者仅读入子键名,面前者除了读取子键名之外,还读取该子键对应的键值。读入的子键名及键值在字符串列表中的存放方法与在文件中的显示方法一致,即"Key=Value"形式。
6、EraseSection方法
该方法删除INI文件中指定的一个整段。
方法声明:procedure EraseSection(const Section:string);
参数说明:Section指明待删除段的段名;
注释:EraseSection方法不仅删除指定段的段名,面且同时将该段的所有子键及键值删除。
7、DeleteKey方法
该方法删除指定段中的某个指定的子键。
方法声明:procedure DeleteKey(const Section,Key:string);
参数说明:Section指明待删除子键据段的段名;
Key指明待删除子键的键名;
注释:DeleteKey方法删除整个子键(包括键名和键值),也就是删除该子键所在的一行。
8、ReadBool方法
该方法读取指定段的某个子键的布尔值。
方法声明:function ReadBool(const Section,Key:string;Default:Boolean):Boolean;
参数说明:Section指明待读子键所在段的段名;
Key指明待读子键的键名;
Default参数指明缺省时的返回值。
注释:ReadBool方法用于读取一个子键的布尔型值,当键值为"1"时,返回True,键值为"0"时,返回False.
9、WriteBool方法
该方法向指定段的某个子键写入布尔值。
方法声明:procedure WriteBool(const Section, Key:string; Value:Boolean);
参数说明:Senction指明待写入子键所在段的段名;
Key参数指明待写入值的子键键名;
Value指明待写入的布尔值;
注释:WriteBool 方法用于写入一个子键的布尔值,当Value为"True"时,写入"1"。Value为"Flase"时,写入"0"。若在写入时,指定的段或键名不存在,则自动创建该段和键名。
10、ReadInteger方法
该方法读取指定段的某个子键的整型值。
方法声明:function ReadInteger(const Section,Key:string; Default:longint):longint;
注释:此方法与ReadBool方法类似,只是变量类型不同。
11、WriteInteger方法
该方法向指写段的某个子键写放整型值。
方法声明:procedure WriteInteger(const Section,Key:string; Value:longint);
注释:此方法与WriteBool方法类似,只是变量灰型不同。
12、ReadString方法
该方法读取指定段的某个子键的字符串型 值。
方法声明:function ReadString(const Section,Key:string; Default:string):string;
注释;此方法与ReadBool方法类似,只是变量类型不同。
13、WriteString方法
该方法向指写段的某个子键写入整型值。
方法声明:procedure WriteString(const Section,Key:string; Value:string);
注释:此方法与WriteBool方法类似,只是变量类型不同。
14、FileName属性
该属性指明被封装在TIniFile对象中的INI文件的文件名。
属性声明:property FileName:string;
注释:FileName属性是一个运行时的只读属性。
由一面的介绍,我们可以看到,强大的Delphi对INI文件的支持是非常全面的。我们在编写涉及此类操作的程序时,几乎无需使用Windows API函数
2005-8-24 15:09 回复
pathog
0位粉丝
3楼
越来越多的程序使用了多国语言切换,虽然DELPHI自带多语言包的添加和配置,但是那种方法在切换语言时界面会出现闪烁,而且实现起来很麻烦,这里我介绍给大家的是利用INI文件来读取界面的语种文字,用这种方法,不但简单易行,而且在切换的时候不会出现界面的闪烁。
我们从一个例子出发,看看怎么实现语言的切换。首先建立一个新工程。
放置如下组件:
MainMenu1: TMainMenu;
File1: TMenuItem;
Exit1: TMenuItem;
Label1: TLabel;
Button1: TButton;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
Button2: TButton;
Label2: TLabel;
ComboBox1: TComboBox;
Label3: TLabel;
由于要读取Ini文件,所以在USES中加入声明IniFiles;然后将Button1和Button2的ShowHint属性设置为True;其中我们用ComboBox1来显示可供选择的语言和用来选择语言。
我们在程序的目录下编辑如下的Chinese GB.Ini文件:
;///////////////////////////////////////////////////////////////////
;
; 翻译的一些规则:
; 翻译前,拷贝 Chinese GB.ini 改名到 yourlanguage.ini
; 仅仅翻译符号'='后的文字
;
;
[Translations]
;
Label1.Caption =文字1
Label2.Caption =文字2
Label3.Caption =语言
Button1.Caption =按钮1
Button2.Caption =按钮2
Button1.Hint =按钮1_提示
Button2.Hint =按钮2_提示
CheckBox1.Caption =复选框1
CheckBox2.Caption =复选框2
File1.Caption =文件
Exit1.Caption =退出
;
[Messages]
;
M1 =信息框测试
;
;//////////////////////////////////////////////////////////////////
同样的方法编辑一个名为English.ini的文件,将“=”左边的文字改为英文。
例如:Label1.Caption =Label1
程序运行时,我们查找当前目录下所有的语言配置文件(*.ini),为了达到这个目的,我编写了如下的函数搜索目录下所有的语言配置文件的文件名,然后将文件名去掉ini扩展名保存返回:
function TForm1.SearchLanguagePack:TStrings;
var
ResultStrings:TStrings;
DosError:integer;
SearchRec:TsearchRec;
begin
ResultStrings:=TStringList.Create;
DosError:=FindFirst(ExtractFilePath(ParamStr(0))+'*.ini', faAnyFile, SearchRec);
while DosError=0 do
begin
{ 返回的文件名并去掉末尾的.ini字符 }
ResultStrings.Add(ChangeFileExt(SearchRec.Name,'));
DosError:=FindNext(SearchRec);
end;
FindClose(SearchRec);
Result:=ResultStrings;
end;
在Form建立的事件中添加代码,将目录下所有的语言文件名加入选择列表框中。
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Items.AddStrings(SearchLanguagePack);
end;
程序的重点在如何切换语言,在ComboBox1的OnChange事件中进行切换操作。这里我写了SetActiveLanguage过程用于实现这一操作。
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
SetActiveLanguage(ComboBox1.Text);
end;
其中SetActiveLanguage代码如下:
procedure TForm1.SetActiveLanguage(LanguageName:string);
const
Translation_s='Translations';
Messages='Messages';
var
frmComponent:TComponent;
i:Integer;
begin
with TInifile.Create(ExtractFilePath(ParamStr(0))+LanguageName+'.ini') do
begin
for i:=0 to ComponentCount-1 do { 遍历Form组件 }
begin
frmComponent:=Components[i];
if frmComponent is TLabel then { 如果组件为TLabel型则当作TLabel处理,以下同 }
begin
(frmComponent as TLabel).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TLabel).Caption);
end;
if frmComponent is TCheckBox then
begin
(frmComponent as TCheckBox).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TCheckBox).Caption);
end;
if frmComponent is TButton then
begin
(frmComponent as TButton).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TButton).Caption);
(frmComponent as TButton).Hint:=
ReadString(Translations,frmComponent.Name+'.Hint',(frmComponent as TButton).Hint);
end;
if frmComponent is TMenuItem then
begin
(frmComponent as TMenuItem).Caption:=
ReadString(Translations,frmComponent.Name+'.Caption',(frmComponent as TMenuItem).Caption);
end;
end;
M1:=ReadString(Messages,'M1',M1);
end;
end;
在这个过程中,我们遍历了Form中的所有组件,根据他们的类别和组件名动态的从ini配置文件中读出应该显示的语言文字。
用遍历组件的方法比一个一个写出具体的组件维护起来要方便很多,代码的适应性也更强。
其中M1为一个字符串变量,这样提示消息也能切换,比如在Button1的Click事件中
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(M1);
end;
就可以根据不同的语言给出不同的提示文字。