zoukankan      html  css  js  c++  java
  • delphi读取ini文件

    delphi读取ini文件 

    INI文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以

    可视化的编程一族,如VB、VC、VFP、Delphi等都提供了读写INI文件的方法,其

    中Delphi中操作INI文件,最为简洁,这是因为Delphi提供了一个TInifile类,

    使我们可以非常灵活的处理INI文件

    一.INI文件的结构

    [小节名]ini文件

            关键字1=值1

            关键子2=值2

    INI文件允许有多个小节,每个小节又允许有多个关键字,“=”后面是该关键字

    的值。

    值的类型有三种:字符串、整型数值和布尔值。其中字符串存贮在INI文件中时

    没有引号,布尔真值用1表示,布尔假值用0表示。

    二、定义
    1、            在Interface的Uses节增加IniFiles;
    2、            在Var变量定义部分增加一行: myinifile:Tinifile;
    定义类的一个实例。然后,就可以对变量myinifile进行创建、打开、读取、写

    入等操作了。
    三、打开INI文件
    myinifile:=Tinifile.create(program.ini);
    上面这一行语句将会为变量myinifile与具体的文件program.ini建立联系,然后

    ,就可以通过变量myinifile,来读写program.ini文件中的关键字的值了。

    值得注意的是,如果括号中的文件名没有指明路径的话,那么这个Program.ini

    文件会存储在Windows目录中,把Program.ini文件存储在应用程序当前目录中的

    方法是:为其指定完整的路径及文件名。下面的两条语句可以完成这个功能:

    Filename:=ExtractFilePath(Paramstr(0))+program.ini;

    myinifile:=Tinifile.Create(filename);

    五、写入INI文件
    同样的,TInifile类也提供了三种不同的对象方法,向INI文件写入字符串、整

    型数及布尔类型的关键字。


    myinifile.writestring(小节名,关键字,变量或字符串值);
    myinifile.writeinteger(小节名,关键字,变量或整型数值);
    myinifile.writebool(小节名,关键字,变量或True或False);
    当这个INI文件不存在时,上面的语句还会自动创建该INI文件。

    六、删除关键字
    除了可用写入方法增加一个关键字,Tinifile类还提供了一个删除关键字的对象

    方法:

    myinifile.DeleteKey(小节名,关键字);
    七、小节操作
    增加一个小节可用写入的方法来完成,删除一个小节可用下面的对象方法:


    myinifile.EraseSection(小节名);
    另外Tinifile类还提供了三种对象方法来对小节进行操作:

    myinifile.readsection(小节名,TStrings变量);可将指定小节中的所有关键字

    名读取至一个字符串列表变量中;

    myinifile.readsections(TStrings变量);可将INI文件中所有小节名读取至一个

    字符串列表变量中去。

    myinifile.readsectionvalues(小节名,TStrings变量);可将INI文件中指定小节

    的所有行(包括关键字、=、值)读取至一个字符串列表变量中去。

    八、释放
    在适当的位置用下面的语句释放myinifile:
    myinifile.distory;
    下面是具体例子。源代码如下。创建了一个myini.ini文件,有一个名为newini

    的小节,有3个关键字“用户名称”“已运行时间”“是否正式用户”。运行效

    果,可以在edit1里边填入“用户名称”;edit2显示时间,不可以改变数值;

    checkbox1通过打勾,保存时间和“用户名称”进入myini.ini文件里边,重新打

    开应用程序时,显示的时保存下来的时间和填入的“用户名称”,如果在

    myini.ini文件里边修改,效果和在程序运行过程中修改时一样的。unit Unit1;


    interface


    uses

       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

    Forms,

       Dialogs,inifiles, StdCtrls, ExtCtrls;

       {调用inifiles 类}


    type

       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;


    var

       Form1: TForm1;


    implementation

    var

    myinifile:TInifile;

    {定义一个类的实例}

    {$R *.dfm}


    procedure TForm1.FormCreate(Sender: TObject);


    var

    filename:string;


    begin

    {下面两行的书写形式,在应用程序的路径下创建ini文件}

    filename:=ExtractFilePath(paramstr(0))+myini.ini;

    myinifile:=TInifile.Create(filename);

    edit1.Text:=myinifile.ReadString(newini,用户名称,胡长浩);
        CheckBox1: TCheckBox;

         procedure FormCreate(Sender: TObject);

         procedure FormDestroy(Sender: TObject);

         procedure Timer1Timer(Sender: TObject);

       private

         { Private declarations }

       public

         { Public declarations }

       end;


    var

       Form1: TForm1;


    implementation

    var

    myinifile:TInifile;

    {定义一个类的实例}

    {$R *.dfm}


    procedure TForm1.FormCreate(Sender: TObject);


    var

    filename:string;


    begin

    {下面两行的书写形式,在应用程序的路径下创建ini文件}

    filename:=ExtractFilePath(paramstr(0))+myini.ini;

    myinifile:=TInifile.Create(filename);

    edit1.Text:=myinifile.ReadString(newini,用户名称,胡长浩);
    利用INI文件实现界面无闪烁多语言切换

    熊斌 landragon@tom.com

    一、引言

    越来越多的程序使用了多国语言切换,虽然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在运

    行期,获取组件的相应属性,并进行动态设置,达到多语言切换功能。


    利用INI文件实现界面无闪烁多语言切换

    熊斌 landragon@tom.com

    四、各个函数的定义及实现

    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; //相应组件


    procedure Split (S: string; SplitChar: string; R: TStrings); //将字符

    串分隔

    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;


    begin

    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;


    利用INI文件实现界面无闪烁多语言切换

    熊斌 landragon@tom.com

    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编程中运行时类型信息的应用技巧,同时

    掌握如何在程序运行时动态创建菜单。

  • 相关阅读:
    github的使用
    QPalette的用法
    QTimer的用法
    QStatusBar的用法
    QWhatsThis的用法
    QString::​arg的用法
    qt中ui的 使用介绍
    安全协议IPSEC
    安全协议ssl
    对称加密和非对称加密
  • 原文地址:https://www.cnblogs.com/zhangzhifeng/p/2270536.html
Copyright © 2011-2022 走看看