TIniFile および TMemIniFile の使用
ini ファイル形式は今も広く使用されており、多くの構成ファイル(たとえば .dsk デスクトップ設定ファイルなど)がこの形式です。 この形式は、構成情報の保存に必ずしもシステム レジストリを利用できるとは限らないようなアプリケーションで特に役に立ちます。 VCL/RTL には、ini ファイルの読み書きを非常に簡略化する 2 つのクラス TIniFile および TMemIniFile が用意されています。
TIniFile
がディスク上の ini ファイルを直接操作するのに対して、TMemIniFile
では変更内容をすべてメモリにバッファリングし、UpdateFile メソッドが呼び出されて初めて、それらをディスクに書き込みます。
- メモ:
TMemIniFile
で作業する際、AutoSave プロパティを使用sるうと、メモリ内の変更が自動的に ini ファイルに保存されます。 このプロパティを使用することで、UpdateFile メソッドを呼び出す前に destructor を呼び出した際に発生する可能性のある情報を欠落を避けることができます。
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 :
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
イベントで書き戻されます。