TIniFile と TMemIniFile の使い方
RTL の利用:インデックス への移動
ini ファイルフォーマットは今も広く使用されており,多くの環境設定ファイル(DSK デスクトップ設定ファイルなど)も ini ファイルフォーマットです。クロスプラットフォームアプリケーションの場合,必ずしもシステムレジストリを使って環境設定情報を保存できるとは限りません。このため,ini ファイルフォーマットは特にクロスプラットフォームアプリケーションで使用すると便利です。VCL/RTL には,ini ファイルの読み書きを簡単にするための TIniFile と TMemIniFile という 2 つのクラスがあります。
TIniFile がディスク上の ini ファイルを直接操作するのに対して,TMemIniFile は変更内容をバッファリングし,UpdateFile メソッドが呼び出されてからディスクに書き込みます。
TIniFile オブジェクトか TMemIniFile オブジェクトをインスタンス化するときに,パラメータとして ini ファイルの名前をコンストラクタに渡します。その名前のファイルが存在しなければ,自動的に作成されます。その後は,ReadString,ReadDate,ReadInteger,ReadBool などの読み出しメソッドを使って値を読み出せます。別の方法として ReadSection メソッドを使用すれば,ini ファイルのセクション全体を読み出すことができます。同様に,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 TIniFile.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 TIniFile.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
2 回め以降の起動では,フォーム作成時に ini ファイルの値が読み出され,OnClose イベント中に再び書き込まれます。