//----------------------------------------------------------//
//-------  Delphi对保存数据库连接信息的Ini文件的操作类 ------//
//-------  作用:封装对ini文件的操作                   ------//
//-------  类名称: IniOptions                         ------//
//-------  属性如下:                                  ------//
//-------    FconfigAutoLogon: Boolean (是否自动登录)  ------//
//-------    FconfigAuthenticationStyle: string        ------//
//-------    (表示身份验证方式,WindowsNT/SQLServer)   ------//
//-------    FconfigServerName: string  (服务器名称)   ------//
//-------    FconfigUserID: string      (登录名)       ------//
//-------    FconfigPassword: string    (登录密码)     ------//
//-------    FconfigDataBaseName: string(数据库名)   ------//
//-------  方法如下:                                  ------//
//-------    Function getIniFileAbsolutePath():string; ------//
//-------        1.获取Ini文件的绝对路径               ------//
//-------    Function IniFileExists():Boolean;         ------//
//-------        2.判断Ini文件是否存在                 ------//
//-------    Function createNewIniFile():Boolean;      ------//
//-------        3.创建新的Ini文件(默认配置)         ------//
//-------    procedure LoadSettings(Ini: TIniFile);    ------//
//-------        4.从Ini文件中读取配置信息到属性值中   ------//
//-------    procedure SaveSettings(Ini: TIniFile);    ------//
//-------        5.将属性值保存到Ini文件中             ------//
//-------    procedure LoadFromIniFile();              ------//
//-------        6.从Init文件中读取信息,调用1,2,3,4    ------//
//-------    procedure SaveToIniFile();                ------//
//-------        7.保存到Ini文件,调用1,2,3,5          ------//
//-------    作者: 苏贵阳    2010-8-15                ------//
//-----------------------------------------------------------//
//-------           IniOptions    使用说明             ------//
//-------  1.调用单元   uses IniOptionsUnit;           ------//
//-------  2.IniOptions.LoadFromIniFile();             ------//
//------- CB_FWQMC.Text := IniOptions.configServerName ------//
//----- 3. IniOptions.configDataBaseName:=CB_SJKM.Text; -----//
//-------  IniOptions.SaveToIniFile();                 ------//
//-----------------------------------------------------------//

unit IniOptionsUnit;

interface

uses    //使用到的包
  Classes, SysUtils, IniFiles, Forms, Windows, Messages,Dialogs;

const   //---常量定义

  IniFileRelativePath = 'ADOConnConfInfo.ini';        //---默认的Ini文件名

  //---配置文件中的关键字名称
  csIniconfigSection = 'config';
  {Section: config}
  csIniconfigAutoLogon = 'AutoLogon';
  csIniconfigAuthenticationStyle = 'AuthenticationStyle';
  csIniconfigServerName = 'ServerName';
  csIniconfigUserID = 'UserID';
  csIniconfigPassword = 'Password';
  csIniconfigDataBaseName = 'DataBaseName';

type
  TIniOptions = class(TObject)     //---定义类

  private

    //---属性定义
    {Section: config}
    FconfigAutoLogon: Boolean;
    FconfigAuthenticationStyle: string;
    FconfigServerName: string;
    FconfigUserID: string;
    FconfigPassword: string;
    FconfigDataBaseName: string;

  public

    //---方法定义
    Function getIniFileAbsolutePath():string;
    Function IniFileExists():Boolean;
    Function createNewIniFile():Boolean;
    procedure LoadSettings(Ini: TIniFile);
    procedure SaveSettings(Ini: TIniFile);
    procedure LoadFromIniFile();
    procedure SaveToIniFile();

    {Section: config}

    //--- 对属性值进行读取和保存操作,如 Get和Set
    property configAutoLogon: Boolean read FconfigAutoLogon write FconfigAutoLogon;
    property configAuthenticationStyle: string read FconfigAuthenticationStyle write FconfigAuthenticationStyle;
    property configServerName: string read FconfigServerName write FconfigServerName;
    property configUserID: string read FconfigUserID write FconfigUserID;
    property configPassword: string read FconfigPassword write FconfigPassword;
    property configDataBaseName: string read FconfigDataBaseName write FconfigDataBaseName;

  end;

var
  IniOptions: TIniOptions = nil;   //--- 生成一个对象IniOptions属于类TIniOptions

implementation

Function TIniOptions.getIniFileAbsolutePath():string;
//-------------------------------------------------------//
//------       getIniFileAbsolutePath 说明         ------//
//------  函数作用:获取Ini文件的绝对路径          ------//
//------  返回值:Ini文件的绝对路径                ------//
//-------------------------------------------------------//
var
  IniFileAbsolutePath : string;
begin
  IniFileAbsolutePath:= ExtractFilePath(application.ExeName); //获取INI文件路径。
  if IniFileAbsolutePath[length(IniFileAbsolutePath)]='' then
    IniFileAbsolutePath := IniFileAbsolutePath + IniFileRelativePath
  else
    IniFileAbsolutePath := IniFileAbsolutePath + IniFileRelativePath ;
  result := IniFileAbsolutePath ;
end;

Function TIniOptions.IniFileExists():Boolean;
//-------------------------------------------------------//
//------              IniFileExists 说明           ------//
//------  函数作用:判断Ini文件是否存在            ------//
//------  返回值:存在返回true,不存在返回false    ------//
//-------------------------------------------------------//
begin
  if FileExists(getIniFileAbsolutePath()) then
    result := True
  else   result := False;
end;

Function TIniOptions.createNewIniFile():Boolean;
//-------------------------------------------------------//
//------            createNewIniFile 说明          ------//
//------  函数作用:如果Ini文件不存在就创建新文件  ------//
//------  返回值:已存在返回false,创建成功返回TRUE------//
//-------------------------------------------------------//
var
  _file :Textfile;
  filehandle:Thandle;
begin
  if IniFileExists() then
  begin
    result := False;
  end
  else
  begin
    FileHandle:=FileCreate(getIniFileAbsolutePath());
    fileclose(FileHandle);
    AssignFile(_file,getIniFileAbsolutePath());
    rewrite(_file);
    try
      Writeln(_file,';AutoLogon用来表示是否自动登录');
      Writeln(_file,';AuthenticationStyle表示身份验证方式,WindowsNT/SQLServer');
      Writeln(_file,';ServerName表示SQL服务器名称');
      Writeln(_file,';UserID 表示登录名');
      Writeln(_file,';Password表示密码');
      Writeln(_file,';DataBaseName表示数据库名');
      Writeln(_file,'[config]');
      Writeln(_file,'AutoLogon=1');
      Writeln(_file,'AuthenticationStyle=SQLServer');
      Writeln(_file,'ServerName=(local)');
      Writeln(_file,'UserID=sa');
      Writeln(_file,'Password=');
      Writeln(_file,'DataBaseName=master');
    finally
      Closefile(_file);
    end;
    result := True;
  end;
end;

procedure TIniOptions.LoadSettings(Ini: TIniFile);
//-------------------------------------------------------//
//------              LoadSettings  说明           ------//
//------  作用:从Ini文件中读取配置信息到属性值中  ------//
//------  返回值:无                               ------//
//-------------------------------------------------------//
begin
  if Ini <> nil then
  begin
    {Section: config}
    FconfigAutoLogon := Ini.ReadBool(csIniconfigSection, csIniconfigAutoLogon, True);
    FconfigAuthenticationStyle := Ini.ReadString(csIniconfigSection, csIniconfigAuthenticationStyle, 'SQLServer');
    FconfigServerName := Ini.ReadString(csIniconfigSection, csIniconfigServerName, 'local');
    FconfigUserID := Ini.ReadString(csIniconfigSection, csIniconfigUserID, 'sa');
    FconfigPassword := Ini.ReadString(csIniconfigSection, csIniconfigPassword, '');
    FconfigDataBaseName := Ini.ReadString(csIniconfigSection, csIniconfigDataBaseName, 'master');
  end;
end;

procedure TIniOptions.SaveSettings(Ini: TIniFile);
//-------------------------------------------------------//
//------              SaveSettings  说明           ------//
//------  作用:将属性值保存到Ini文件中            ------//
//------  返回值:无                               ------//
//-------------------------------------------------------//
begin
  if Ini <> nil then
  begin
    {Section: config}
    Ini.WriteBool(csIniconfigSection, csIniconfigAutoLogon, FconfigAutoLogon);
    Ini.WriteString(csIniconfigSection, csIniconfigAuthenticationStyle, FconfigAuthenticationStyle);
    Ini.WriteString(csIniconfigSection, csIniconfigServerName, FconfigServerName);
    Ini.WriteString(csIniconfigSection, csIniconfigUserID, FconfigUserID);
    Ini.WriteString(csIniconfigSection, csIniconfigPassword, FconfigPassword);
    Ini.WriteString(csIniconfigSection, csIniconfigDataBaseName, FconfigDataBaseName);
  end;
end;

procedure TIniOptions.LoadFromIniFile();
//-------------------------------------------------------//
//------            LoadFromIniFile  说明          ------//
//------  作用:从Init文件中读取信息,调用1,2,3,4   ------//
//------  返回值:无                               ------//
//-------------------------------------------------------//
var
  Ini: TIniFile;
  FileName : string;
begin
  FileName := getIniFileAbsolutePath();
  if not IniFileExists() then createNewIniFile();
  Ini := TIniFile.Create(FileName);
  try
    LoadSettings(Ini);
  finally
    Ini.Free;
  end;
end;

procedure TIniOptions.SaveToIniFile();
//-------------------------------------------------------//
//------             SaveToIniFile  说明           ------//
//------  作用:保存到Ini文件,调用1,2,3,5         ------//
//------  返回值:无                               ------//
//-------------------------------------------------------//
var
  Ini: TIniFile;
  FileName : string;
begin
  FileName := getIniFileAbsolutePath();
  if not IniFileExists() then createNewIniFile();
  Ini := TIniFile.Create(FileName);
  try
    SaveSettings(Ini);
  finally
    Ini.Free;
  end;
end;

initialization
  IniOptions := TIniOptions.Create;

finalization
  IniOptions.Free;
end.

//---------------------------------------ADOConnConfInfo.ini-----------------------------------------//

;AutoLogon用来表示是否自动登录
;AuthenticationStyle表示身份验证方式,WindowsNT/SQLServer
;ServerName表示SQL服务器名称
;UserID 表示登录名
;Password表示密码
;DataBaseName表示数据库名
[config]
AutoLogon=1
AuthenticationStyle=WindowsNT
ServerName=111
UserID=sa
Password=
DataBaseName=111