TIniFile および TMemIniFile の使用

提供: RAD Studio
移動先: 案内検索

Ini ファイルとシステム レジストリの操作 への移動

ini ファイル形式は今も広く使用されており、多くの構成ファイル(たとえば .dsk デスクトップ設定ファイルなど)がこの形式です。 この形式は、構成情報の保存に必ずしもシステム レジストリを利用できるとは限らないようなアプリケーションで特に役に立ちます。 VCL/RTL には、ini ファイルの読み書きを非常に簡略化する 2 つのクラス TIniFile および TMemIniFile が用意されています。

TIniFile がディスク上の ini ファイルを直接操作するのに対して、TMemIniFile では変更内容をすべてメモリにバッファリングし、UpdateFile メソッドが呼び出されて初めて、それらをディスクに書き込みます。

メモ: TMemIniFile で作業する際、AutoSave プロパティを使用sるうと、メモリ内の変更が自動的に ini ファイルに保存されます。 このプロパティを使用することで、UpdateFile メソッドを呼び出す前に destructor を呼び出した際に発生する可能性のある情報を欠落を避けることができます。

TIniFile または TMemIniFile オブジェクトをインスタンス化する際に、ini ファイルの名前をパラメータとしてコンストラクタに渡します。 その名前のファイルが存在しなければ、自動的に作成されます。 その後は、ReadStringReadDateReadIntegerReadBool などのさまざまな読み取りメソッドを使って値を自由に読み取ることができます。 あるいは、ini ファイルの全セクションを読み取る場合は、ReadSection メソッドを使用できます。 同様に、WriteBoolWriteIntegerWriteDateWriteString などのメソッドを使って値を書き込むことができます。

次の例では、フォームの OnCreate イベント ハンドラで INI ファイルから構成情報を読み取り、OnClose イベント ハンドラで値を書き込みます。

Delphi:
 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Top     := Ini.ReadInteger( 'Form', 'Top', 100 );
     Left    := Ini.ReadInteger( 'Form', 'Left', 100 );
     Caption := Ini.ReadString( 'Form', 'Caption', 'New Form' );
     if Ini.ReadBool( 'Form', 'InitMax', false ) then
       WindowState := wsMaximized
     else
       WindowState := wsNormal;
   finally
     Ini.Free;
   end;
 end;
 
 procedure TForm1.FormClose(Sender: TObject; var Action TCloseAction)
 var
   Ini: TIniFile;
 begin
   Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, '.INI' ) );
   try
     Ini.WriteInteger( 'Form', 'Top', Top);
     Ini.WriteInteger( 'Form', 'Left', Left);
     Ini.WriteString( 'Form', 'Caption', Caption );
     Ini.WriteBool( 'Form', 'InitMax', WindowState = wsMaximized );
   finally
     Ini.Free;
   end;
 end;
C++:
 __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner)
 {
    TIniFile *ini;
    ini = new TIniFile( ChangeFileExt( Application->ExeName, ".INI" ) );
    Top    =  ini->ReadInteger( "Form", "Top", 100 );
    Left   =  ini->ReadInteger( "Form", "Left", 100 ); 
    Caption = ini->ReadString ( "Form", "Caption", "Default Caption" );
    ini->ReadBool( "Form", "initMax", false ) ?
          WindowState = wsMaximized :
          WindowState = wsNormal;

    delete ini;
  }

  void __fastcall TForm1::FormClose)TObject *Sender, TCloseAction &Action)
  {
    TIniFile *ini;
    ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
    ini->WriteInteger( "Form", "Top", Top );
    ini->WriteInteger( "Form", "Left", Left );
    ini->WriteString ( "Form", "Caption", Caption );
    ini->WriteBool   ( "Form", "InitMax", WindowState == wsMaximized );

  delete ini;
  }

各 Read ルーチンは 3 つのパラメータを取ります。 第 1 パラメータでは、ini ファイルのセクションを識別します。 第 2 パラメータでは、読み取る値を識別します。第 3 パラメータは、指定したセクションまたは値が ini ファイルに存在しない場合のデフォルト値です。 セクションや値が存在しない場合でも Read ルーチンが正常に処理するのと同様に、Write ルーチンもセクションや値が存在しなければ作成します。 上記のコード例では、初めて実行されたときに、次のような ini ファイルが作成されます。

[Form]
Top=100
Left=100
Caption=Default Caption
InitMax=0

次回以降、このアプリケーションを実行したとき、ini ファイルのこれらの値は、フォーム作成時に読み取られ、OnClose イベントで書き戻されます。

関連項目