Migaro. 技術Tips

                       

ミガロ. 製品の技術情報
IBMiの活用に役立つ情報を掲載!


【Delphi】FireMonkeyでのINIファイルの読み書き

今回はFireMonkeyを使ってINIファイルの設定値の読み取りや書き込みを行う方法を紹介します。
この手法を使えば、WindowsのみならずiOSやAndroidでもINIファイルが使用可能になります。

 


初期設定・ファイルの配置

アプリ内でINIファイルを新規作成する場合は、プロジェクトで配置しておく必要はありません。

あらかじめ設定済みのINIファイルを配置する場合は、以前のTipsに記載の手順で配置して下さい。
【Delphi】音声ファイルを再生する方法(#FireMonkey)

今回はOSをまたいでロジックを共通化するため、
各OSごとに異なるファイルの保管先フォルダを返す関数を作成します。
(※それぞれ、保管先の直下を想定しています)

{*******************************************************************************
  設定INI保管パスの取得(関数名は任意、最後の「\」含む)
*******************************************************************************}
function SettingsFilePath: String;
begin
{$IF DEFINED(MSWINDOWS)} // Windowsの場合(今回はEXEと同階層)
  Result := ExtractFilePath(ParamStr(0));
{$ELSE}
{$IF (DEFINED(MACOS) AND NOT DEFINED(IOS))} // MacOSの場合
  Result := System.IOUtils.TPath.GetHomePath + System.SysUtils.PathDelim;
{$ELSE}                  // iOS・Androidの場合
  Result := System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim;
{$ENDIF}
{$ENDIF}
end;

 


INIの読み取り方法

uses節にVCLと同じ『System.IniFiles』を追加し、
「TMemIniFile」クラスを使って読み書きを行います。

※「TIniFile」クラスも存在しますが、
 FireMonkeyのTIniFileはTMemIniFileを継承した互換用クラスのため挙動はほぼ同じです。

対象のTMemIniFileクラスをCreateする時に、上記の関数(SettingsFilePath)で取得した
設定INI保管パスにあるファイルをパラメータとして指定します。
その他の基本的なロジックはVCLと同様です。

{*******************************************************************************
  INI 読込処理(uses節にSystem.IniFilesが必要)
*******************************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
var
  iTEST: Integer;
  SL: TStringList;
  IniFile: TMemIniFile;
begin
  SL := TStringList.Create;
  IniFile := TMemIniFile.Create(SettingsFilePath + 'Settings1.ini');
  try
    if (IniFile.SectionExists('Settings')) then
    begin
      // 個別の変数やプロパティに取得する例
      Edit1.Text := IniFile.ReadString('Settings', 'ALIAS', '');
      Edit2.Text := IniFile.ReadString('Settings', 'USER', '');
      Edit3.Text := IniFile.ReadString('Settings', 'PWD', '');
      iTEST      := IniFile.ReadInteger('Settings', 'RND_INT', 0);
      CheckBox1.IsChecked := IniFile.ReadBool('Settings', 'MusicEnabled', True);

      // Memoにセクションの値を一括転送する例
      Memo1.Lines.Clear;
      IniFile.ReadSectionValues('Settings', SL);
      Memo1.Lines.Text := SL.Text;
    end;
  finally
    FreeAndNil(IniFile);
    FreeAndNil(SL);
  end;
end;

 


INIの書き込み方法

書き込みでも「TMemIniFile」クラスを使用します。

VCLでのTIniFileへの書き込みと記述についてはほぼ同じですが、
書き込み後に「UpdateFile」メソッドを通して確定させる必要があります。
(※元々INIファイルはWindowsの設定ファイルだったため、
  同じ動作を実現させるため必要になっているようです。)

{*******************************************************************************
  INI 書込処理(uses節にSystem.IniFilesが必要)
*******************************************************************************}
procedure TForm1.Button2Click(Sender: TObject);
var
  iTEST: Integer;
  IniFile: TMemIniFile;
begin
  IniFile := TMemIniFile.Create(SettingsFilePath + 'Settings1.ini');
  try
    // 文字列の例
    IniFile.WriteString('Settings', 'TEST_STR', Edit6.Text);

    // 整数値の例(ここでは0~9999ランダム)
    iTEST := Random(10000);
    IniFile.WriteInteger('Settings', 'RND_INT', iTEST);

    // Booleanの例
    IniFile.WriteBool('Settings', 'MusicEnabled', CheckBox1.IsChecked);

    // 最後に確定させる必要がある
    IniFile.UpdateFile;
  finally
    FreeAndNil(IniFile);
  end;
end;

 


<参考リンク>