TIniFile および TMemIniFile の使用
ini ファイル形式は今も広く使用されており、多くの構成ファイル(たとえば .dsk デスクトップ設定ファイルなど)がこの形式です。この形式は、構成情報の保存に必ずしもシステム レジストリを利用できるとは限らないようなアプリケーションで特に役に立ちます。VCL/RTL には、ini ファイルの読み書きを非常に簡略化する 2 つのクラス TIniFile および TMemIniFile が用意されています。
TIniFile がディスク上の ini ファイルを直接操作するのに対して、TMemIniFile では変更内容をすべてメモリにバッファリングし、UpdateFile メソッドが呼び出されて初めて、それらをディスクに書き込みます。
TIniFile オブジェクトまたは TMemIniFile オブジェクトをインスタンス化する際に、ini ファイルの名前をパラメータとしてコンストラクタに渡します。その名前のファイルが存在しなければ、自動的に作成されます。その後は、ReadString、ReadDate、ReadInteger、ReadBool などのさまざまな読み取りメソッドを使って値を自由に読み取ることができます。あるいは、ini ファイルの全セクションを読み取る場合は、ReadSection メソッドを使用できます。同様に、WriteBool、WriteInteger、WriteDate、WriteString などのメソッドを使って値を書き込むことができます。
フォームの OnCreate イベント ハンドラで ini ファイルから構成情報を読み取り、OnClose イベント ハンドラで値を書き込む例を以下に示します。
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;
__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 :
WindowSate = wsNormal;
delete ini;
}
void __fastcall TForm1::FormClose)TObject *Sender, TCloseAction &Action)
{
TIniFile *int;
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 イベントで書き戻されます。