delphi----IniFile

Windows 中的应用程序极大多数拥有自己的初始化文件,如 PowerBuilder、Office及Cstar等。因此 初始化文件的读写是每个高级程序员必须掌握的技术。虽然初始化文件的读写也可用 Object Pascal 中的文本文件一样读写,但因初始化文件不同于一般的文本文件,它有自己固定的格式(见下面的初始化文件是 ucdos 中提供的 rdfnt.ini 文件),如果用文本文件的方式读写,不仅格式转换十分繁琐,且很容易出现错误,为了方便程序员读写初始化文件中的数据, Delphi 中向用户提供了一个 TIniFile 类,通过 TiniFile 类就可十分方便地读写初始化文件。

Ucdos rdfnt.ini 文件的内容为:

[True Type fonts directory]

Dir=C:WINDOWSSYSTEM

 

[True Type fonts list]

ARIAL.TTF=64

ARIALBD.TTF=65

ARIALI.TTF=66

ARIALBI.TTF=67

TIMES.TTF=68

TIMESBD.TTF=69

TIMESI.TTF=70

TIMESBI.TTF=71

COUR.TTF=72

COURBD.TTF=73

COURI.TTF=74

COURBI.TTF=75

 

[Use All True Type fonts]

All=0

 

TiniFile 类不是一个 Delphi 的部件,因此不能在 Delphi VCL 模板中找到,它在 Delphi 系统中的 inifiles 单元中定义,因此要使用 TiniFile 类,必须在使用该类的单元文件中用 Uses  inifiles 指令明确地说明。

TiniFile 类中定义了许多成员函数,这里介绍几个使用频率较高的成员函数:

    Create ()

    函数定义为:   constructor Create(const FileName: string);

该函数建立 TiniFile 类的对象。参数 FileName 是要读写的初始化文件名。

若读写的文件在 Windows 的目录里(如 system.ini 文件),则可以直接写文件名而不必指定路径,否则就必须指定路径(如 d:ucdos dfnt.ini )。

如按以下规则在规定的目录中存在该文件,则打开该初始化文件;否则在规定的目录里创建该初始化文件。

    ReadSections ()

    过程定义为:   procedure ReadSections(Strings: TStrings);

该过程将从所建立的 TiniFile 类的对象(即与之关联的初始化文件)中读取所有的节点名(即用 [] 括号括起的那部分,如 rdfnt.ini 文件中的 [True Type fonts list] )存入字符串列表中。参数 Strings 即为字符串列表的变量名。

    ReadSectionValues()

    过程定义为:   procedure ReadSectionValues(const Section: string; Strings: TStrings);

    该过程将参数 Section 的值所对应的节点(如 rdfnt.ini 文件中的 [True Type fonts list] )中的各个关键字(如 ARIALBI.TTF )及其所含的值(如 ARIALBI.TTF 关键字值为 67 )读入参数 Strings 指明的字符串列表中。

    ReadSection()

过程定义为:   procedure ReadSection(const Section: string; Strings: TStrings);

该过程将参数 Section 的值所对应的节点中的各个关键字读入参数 Strings 指明的字符串列表中。与 ReadSectionValues() 不同的是它没有读取各个关键字的对应值。

    ReadString()

    函数定义为:   function ReadString(const Section, Ident, Default: string): string;

该函数返回以参数 Section 的值为节点名、参数 Ident 的值为关键字名所对应的关键字值(如 [True Type fonts list] 节中 ARIALBI.TTF 关键字的值为 67 )。当指定的节点或节内的关键字不存在时,则函数返回参数 Default 的缺省值。返回的值是一个字符串型数据。

当指定节点中关键字值的数据类型不是字符串时,则可用 ReadInteger() 成员函数读取一个整型值,用 ReadBool() 成员函数读取一个布尔值。

    WriteString()

过程定义为:   procedure WriteString(const Section, Ident, Value: string);

该过程将参数 Section 的值为节点名、参数 Ident 的值为关键字名的关键字值设置为参数 Value 的值。该过程设置的是字符串型数据。

当指定节点和关键字均存在时,则用 Value 的值替代原值;如指定节点不存在,则在关联的初始化文件中自动增加一个节点,该节点的值为参数 Section 的值,并在该节点下自动增加一个关键字,关键字名为参数 Ident 的值,该关键字对应的值为参数 Value 的值;若节点存在,但关键字不存在,则在该节点下自动增加一个关键字,关键字名为参数 Ident 的值,该关键字对应的值为参数 Value 的值。

若要设置整型值,可调用 WriteInteger() 成员函数;用 WriteBool() 成员函数设置布尔值。

知道了以上函数的作用,要建立或读写一个初始化文件就不难了。下面以一个实际例子说明初始化文件的读取方法,步骤如下:


  在需要读写初始化文件的窗体( Form )上放置名为 SectionComboBox IdentComboBox 的两个组合式列表框,其中 SectionComboBox 存放节点名, IdentComboBox 存放所选择节点的关键字名。一个名为 IdentValueEdit 的输入框,存放对应关键字的值。名为 CmdChang 的修改命令钮可以用来修改关键字的值,修改后用名为 CmdSave 的存储命令钮将修改后的关键字的值存入关联的初始化文件。窗体对应的单元名设为 IniUnit ,窗体名设为 IniForm ,窗体布局如下图一所示:

 


  IniUnit 单元的 interface 部分用 uses inifiles; 说明要引用的 TiniFile 类所定义的单元名。并在变量说明部分定义 TiniFile 类的对象,如

var  IniFile:  TiniFile;

  建立窗体的 OnCreate 事件过程。使用 TIniFile 类的 Create 成员函数创建 TIniFile 对象,用该对象读写 d:ucdos 目录中的 rdfnt.ini 初始化文件,并将该初始化文件中的所有节点通过 ReadSections() 成员函数读入 SectionComboBox 组合式列表框中,用 ReadSection() 成员函数将第一个节点中的所有关键字读入 IdentComboBox 组合式列表框,用 ReadString() 成员函数将第一个关键字的值送入 IdentValueEdit 输入框。

  建立 SectionComboBox 组合式列表框的 OnChange 事件过程。当该选择列表框中的不同项目(即不同的节点名)时,用 ReadSection() 成员函数将选节点中的所有关键字读入 IdentComboBox 组合式列表框,并用 ReadString() 成员函数将第一个关键字的值送入 IdentValueEdit 输入框。

  建立 IdentComboBox 组合式列表框的 OnChange 事件过程。当该选择列表框中的不同项目(即不同的关键字名)时,用 ReadString() 成员函数将该关键字的值送入 IdentValueEdit 输入框。

  建立 命令钮 CmdChang的OnClick 事件过程。使 IdentValueEdit 输入框中的内容可以修改(不按该命令钮, IdentValueEdit 输入框是不能修改的),并设置命令钮 CmdSave 有效,可以将修改后的关键字值存入关联的初始化文件中。

  建立 命令钮 CmdSave OnClick 事件过程。如果关键字值已改变,则调用 WriteString() 成员函数将修改后的关键字的值存盘。

  建立窗体的 OnDestroy 事件过程。当窗体失效时,将建立的 TIniFile 对象释放,以释放该对象所战用的系统资源。

至此,运行该工程,初始化文件的读写已能顺利进行。当然还可以使用 EraseSection() 成员函数删除指定的节,也可用 DeleteKey() 成员函数删除指定的关键字,因篇幅有限,这里就不详细介绍了,有兴趣的可参考 Delphi 的使用帮助。

下面是该单元的源程序代码:

unit IniUnit;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  StdCtrls, inifiles;

 

type

  TIniForm = class(TForm)

    SectionComboBox: TComboBox;

    Label1: TLabel;

    CmdSave: TButton;

    CmdChang: TButton;

    IdentComboBox: TComboBox;

    IdentValueEdit: TEdit;

    Label2: TLabel;

    Label3: TLabel;

    procedure FormCreate(Sender: TObject);

    procedure SectionComboBoxChange(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    procedure CmdChangClick(Sender: TObject);

    procedure CmdSaveClick(Sender: TObject);

    procedure IdentComboBoxChange(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  IniForm: TIniForm;

{ Delphi 中通过 TIniFile 类读写 Windows 的初始化文件 }

  IniFile:      TIniFile;

 

implementation

 

{$R *.DFM}

 

procedure TIniForm.FormCreate(Sender: TObject);

begin

{ 使用 TIniFile 类的 Create 成员函数建立 TIniFile

象,该对象用来读写 d:ucdos 目录中的 rdfnt.ini 文件,

如果读写的文件在 Windows 的目录里(如 system.ini ),

则可以直接写文件名而不必指定路径 }

  IniFile:=TIniFile.Create('d:ucdos dfnt.ini');

{ TIniFile 对象关联的初始化文件 system.ini 中的所

有节(即用 [] 括号括起的那部分)的节名送入下拉式组

合列表框 SectionComboBox }

  SectionComboBox.Clear;

  IniFile.ReadSections(SectionComboBox.Items);

{ 选择 system.ini 文件的第一个节名 }

  SectionComboBox.ItemIndex:=0;

  SectionComboBoxChange(Sender);

  CmdSave.Enabled:=False;

end;

 

{ 将组合列表框 IniComboBox 中所选择节中对应的各个

变量及对应的值送入多行文本编辑器 IniMemo }

procedure TIniForm.SectionComboBoxChange(Sender: TObject);

begin

  IdentComboBox.Clear;

  IniFile.ReadSection(SectionComboBox.Text,

                  IdentComboBox.Items);

  IdentComboBox.ItemIndex:=0;

  IdentComboBoxChange(Sender);

end;

 

procedure TIniForm.IdentComboBoxChange(Sender: TObject);

begin

  IdentValueEdit.Enabled:=False;

  { 将选择的关键字值读入 }

  IdentValueEdit.Text:=

      IniFile.ReadString(SectionComboBox.Text,

      IdentComboBox.Text,');

end;

 

procedure TIniForm.CmdChangClick(Sender: TObject);

begin

  CmdSave.Enabled:=True;

  IdentValueEdit.Enabled:=True;

  IdentValueEdit.SetFocus;

end;

 

procedure TIniForm.CmdSaveClick(Sender: TObject);

begin

  if IdentValueEdit.Modified then begin

    IniFile.WriteString(SectionComboBox.Text,

                        IdentComboBox.Text,

                        IdentValueEdit.Text);

  end;

  IdentValueEdit.Enabled:=False;

  CmdSave.Enabled:=False;

end;

 

procedure TIniForm.FormDestroy(Sender: TObject);

begin

  IniFile.Free;  { 释放创建的对象 }

end;

 

end.

以上方法在 Windows 95 下用 Delphi 3.0 调试通过。

posted on 2006-06-01 16:47 青蛙學堂 阅读(907) 评论(0)  编辑 收藏 引用 所属分类: 軟件布袋

只有注册用户登录后才能发表评论。
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿(8)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜