zoukankan      html  css  js  c++  java
  • Delphi 操作ini文件+TStrings用法 (转)

    INI 文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如VB、VC、VFP Delphi等都提供了读写 INI 文件的方法,其中 Delphi 中操作 INI 文件,最为简洁,这是因为 Delphi 提供了一个 TInifile 类,使我们可以非常灵活的处理 INI 文件。

     

    一、了解 INI 文件的结构 :

     

      ; 注释

     

      [ 小节名 ]

     

      关键字 = 值

     

      ......

     

    -- 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 文件支持的字符串、整型数值、布尔值三种数据类型 ,TINIfiles 类提供了三种不同的对象方法来读取 INI 文

     

       件中关键字的值。

     

    -- 假设已定义变量 vs 、 vi 、 vb 分别为 string 、  integer 、 boolean 类型。

     

         vs:=myinifile.Readstring(' 小节名 ',' 关键字 ',缺省值 );

     

         vi:=myinifile.Readinteger(' 小节名 ',' 关键字 ',缺省值 );

     

         vb:=myinifile.Readbool(' 小节名 ',' 关键字 ',缺省值 );

     

    -- 其中缺省值为该 INI 文件不存在该关键字时返回的缺省值。

     

     

    五、写入 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;

     

     

    九、实例

     

    Var

      MyIni: TIniFile;

      FileName : string; //文件名与路径

      ValStr : string;   //字符串值

      ValInt : integer;  //整数值

      ValBool : Boolean; //布尔值

     

    //读ini文件内容

    begin

      //取得应用程序当前路径和INI文件名

      FileName := ExtractFilePath(Paramstr(0)) + 'MyIni.ini';

      MyIni := TIniFile.Create(FileName);

      try

        ValStr := MyIni.ReadString('MySection' ,'ValStr' ,'');

        ValInt := MyIni.ReadInteger('MySection' ,'ValInt' ,0);

        ValBool := MyIni.ReadBool('MySection' ,'ValBool' ,False);

        edtStr.Text := ValStr;

        edtInt.Text := IntToStr(ValInt);

        cbxBool.Checked := ValBool;

        ShowMessage('Read Successful!')

      finally

        MyIni.Free;

      end;

    end.

     

    //写ini文件内容

    begin

      FileName := ExtractFilePath(Paramstr(0)) + 'MyIni.ini';

      MyIni := TIniFile.Create(FileName);

      ValStr := edtStr.Text;

      ValInt := StrToInt(edtInt.Text);

      ValBool := cbxBool.Checked;

      try

        MyIni.WriteString('MySection' ,'ValStr' ,ValStr);

        MyIni.WriteInteger('MySection' ,'ValInt' ,ValInt);

        MyIni.WriteBool('MySection' ,'ValBool' ,ValBool);

        ShowMessage('Write Successful!')

      finally

        MyIni.Free;

      end;

     ################################################################33

    对于TStrings类型变量,需要使用TStringList.Create;创建[luther.gliethttp],否则提示 abstract error错误

    TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。
    常规的用法大家都知道,现在来讨论它的一些高级的用法。
    先把要讨论的几个属性列出来:
    1、CommaText
    2、Delimiter & DelimitedText
    3、Names & Values & ValueFromIndex

    先看第一个:CommaText。怎么用呢?用代码说话:
    const
    constr :String = 'aaa,bbb,ccc,ddd';
    var
    strs :TStrings;
    i :Integer;
    begin
    strs := TStringList.Create;
    strs.CommaText := constr;
    for i := 0 to Strs.Count-1 do
        ShowMessage(Strs[i]);
    end;
    执行了这段代码后,可以看到ShowMessage显示出来的分别是:aaa bbb ccc ddd。
    也就是说,strs.CommaText := constr这一句的作用,就是把一个字符串以','为分割符,分段添加到TStrings中。
    那么如果不是以','来分割,又该怎么做呢?现在看第二个例子。使用Delimiter和DelimitedText。
    const
    constr :String = 'aaa\bbb\ccc\ddd';
    var
    strs :TStrings;
    i :Integer;
    begin
    strs := TStringList.Create;
    strs.Delimiter := '\';
    strs.DelimitedText := constr;
    for i := 0 to Strs.Count-1 do
        ShowMessage(Strs[i]);
    end;
    可以看到, 显示的效果和第一个例子是一模一样的。解释一下:
    Delimiter为分隔符,默认为:','。DelimitedText就是按Delimiter为分隔符的一个串,得到赋值后回把这个字符串按Delimiter的字符添加到TStrings中。
    说到这里,有想起一个属性,QuoteChar。其默认值为:'"'(不包括单引号)
    有何用呢?看例子:
    const
    constr :String = '"aaa"\"bbb"\"ccc"\"ddd"';
    var
    strs :TStrings;
    i :Integer;
    begin
    strs := TStringList.Create;
    strs.Delimiter := '\';
    strs.DelimitedText := constr;
    for i := 0 to Strs.Count-1 do
        ShowMessage(Strs[i]);
    end;
    显示出来的仍然是aaa bbb ccc ddd。为什么不是:"aaa" "bbb" "ccc" "ddd"呢?
    再来看一个例子:
    const
    constr :String = '|aaa|\|bbb|\|ccc|\|ddd|';
    var
    strs :TStrings;
    i :Integer;
    begin
    strs := TStringList.Create;
    strs.Delimiter := '\';
    strs.QuoteChar := '|';
    strs.DelimitedText := constr;
    for i := 0 to Strs.Count-1 do
        ShowMessage(Strs[i]);
    end;
    显示出来的又是aaa bbb ccc ddd。对比一下,应该不难明白吧?这个就不多说了,用得也不多。
    但是还要多说一句,当Delimiter为:','而QuoteChar为:'"'时,DelimitedText和CommaText是同等的。
    最后要说的三个是:Names & Values & ValueFromIndex。
    看看下面的代码:
    const
    constr :String = '0=aaa,1=bbb,2=ccc,3=ddd';
    var
    strs :TStrings;
    i :Integer;
    begin
    strs := TStringList.Create;
    strs.CommaText := constr;
    for i := 0 to strs.Count-1 do
    begin
        ShowMessage(strs.Names[i]);
        ShowMessage(strs.Values[strs.Names[i]]);
        ShowMessage(strs.ValueFromIndex[i]);
    end;
    end;
    通过这个例子不难看出:
    这个时候strs中的内容是:
    0=aaa
    1=bbb
    2=ccc
    3=ddd
    而Names中则是:
    0
    1
    2
    3
    在Values中则是:
    aaa
    bbb
    ccc
    ddd
    这几个属性用来处理ini文件是非常好用的。
    另外说一句,在Delphi6下似乎没有ValueFromIndex这个属性

  • 相关阅读:
    COCOS2D-X中UI动画导致闪退与UI动画浅析
    使用cocos2d-x3.4结合cocos2.1.5制作小游戏《亲亲小熊》
    algorithm 学习之 for_each
    cocos2dx 3.2 Touch Listen和menu回调实现截屏
    Lua 中string.gsub(sourceString, pattern, replacementString) 返回值有两个
    python 装饰器模式 我的理解
    Https SSL Knowledge & how to get a self-signed certificate on ubuntu.
    公钥和私钥的理解
    Openwrt UCI 快捷切换SS 配置
    iptables ipset 实用命令
  • 原文地址:https://www.cnblogs.com/ljjphysics/p/2052449.html
Copyright © 2011-2022 走看看