IniFile で行こう

世の中 Windows95 以降は、設定はレジストリに保存するのが一般になったようです。
しかし、いまだにこだわりを持って INI ファイルを使っているソフトはいくつもあります。
その理由は

テキストファイルなので気軽に編集できる。
レジストリに触ることは、初心者に薦めることが出来ないため困ることがあります。
気軽に設定を持ち運べる。
大学や職場等に自宅の設定を気軽に持ち込めます。
何しろフロッピーでもさくっと入りますから。
レジストリは Windows でしか使えない。
UNIX 等でも動くソフトとなるとレジストリは使えません。
INI ファイルなら所詮テキストなのでなんとでもなります。
まぁ、Delphi で移植性を考えてどうすると言われたらそれまでですが(苦笑)

と言うわけでレジストリよりも魅力的な点がいくつかあるのです。

以上の利点を理解した上、利用してみようという話です。
では実際に利用する方法を。

まずは利用する前に uses に IniFiles を追加します。
次に IniFile のオブジェクトを生成します。

IniFile: TIniFile;
・
・
・
IniFile := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));

普通のINIファイルは、プログラムファイルの拡張子を置き換えたものなので、上のようにすれば良いでしょう。
IniFileのCreateは、メインフォームの Create イベントで行えば良いでしょう。
当然ながら生成したものは破棄しないといけないので、メインフォームの Destroy イベントに

IniFile.Free;

と書くなどしましょう。

実際の読み書きです。
INI ファイルに書き込む一番の典型例である、ウインドウ位置の保存を例にとって見ましょう。

[Window]
Top=88
Left=88
Width=768
Height=537
Maxmize=0

上のような形式で書き込むには、以下のようにします。

procedure TMainForm.WriteEnv;
begin
  with IniFile do
  begin
    if WindowState = wsNormal then
    begin
      WriteInteger('Window', 'Top',     Top   );
      WriteInteger('Window', 'Left',    Left  );
      WriteInteger('Window', 'Width',   Width );
      WriteInteger('Window', 'Height',  Height);
      WriteBool(   'Window', 'Maxmize', False );
    end
    else
      WriteBool('Window', 'Maxmize', True);
  end;

  IniFile.UpdateFile;
  (* for Delphi3.x or older
     WritePrivateProfileString(nil, nil, nil, PChar(IniFile.FileName)); *)
end;

用語等とかもありますが、見て対応関係がわかれば大丈夫だと思うので、はしょります。
必要ならヘルプ引けばいくらでも出てます。

UpdateFile は 4.x 以降じゃないとないみたい(ちゃんと調べてはいません)なので、代替コードも載せておきます。
これをやらないとキャッシングの関係で Windows9X 系では変な状態になることがあります。

逆に読み込んでみましょう。

procedure TMainForm.ReadEnv;
begin
  IniFile.UpdateFile;
  (* for Delphi3.x or older
     WritePrivateProfileString(nil, nil, nil, PChar(IniFile.FileName)); *)

  with IniFile do
  begin
    Top    := ReadInteger('Window', 'Top',    Top   );
    Left   := ReadInteger('Window', 'Left',   Left  );
    Width  := ReadInteger('Window', 'Width',  Width );
    Height := ReadInteger('Window', 'Height', Height);
    if ReadBool('Window', 'Maxmize', False) then WindowState := wsMaximized
    else WindowState := wsNormal;
  end;
end;

読み込みのポイントは第3引数でしょう。
この第3引数は、INI ファイルに対応するデータがないとき、デフォルトとして使用する値です。

補足: レジストリの利点

サイズの制限がない
INI ファイルは64KB以内でないといけません。
バイナリを書き込める
INI ファイルでは直接は書き込めません。
深い階層構造が取れる
自分のアプリ共通の情報を置くことなど朝飯前です。
どこからでもアクセスできる
INI ファイルが標準の時は Windows ディレクトリにソフトの設定ファイルが集まるといった状態になっていました。

Return index page