iniファイルの情報を1セクション分取り出して、KeyNamesと一致する項目にNamesを格納する。
やりたかったのはこれだけなのに何でこう微妙なところで躓くのか。
解決したけどまだ完全に理解した状態なので良くないです。
KeyNamesは~.KeyNames[n]、Namesは~.Values[n]で取れる。
~.Names[n]だと~.KeyNames[n]と同じ値になります。
コンポーネントとかで言うNameとCaption(Text)的な関係なんだろうか。
残りは例です。
私は都度begin〜endで囲ったり、同じ型でも1行につき1つしか書かなかったりと行が増える書き方をするのでそこはお好みで。


test.ini
[view]
mode=hoge
[default]
a=default
b=1
c=あいうえお
[hoge]
a=hoge
b=2
c=かきくけこ
[fuga]
a=fuga
b=3
c=さしすせそ
getIni()はFormCreateとかで呼んでおく。
iniPath(string)とlst(TStringList)はグローバル変数。
test.pas
//--------------------------------------
// 設定ファイル読み込み
//--------------------------------------
procedure Tfrm.getIni();
var
ini: TIniFile;
mode: string;
begin
try
ini := TIniFile.Create(iniPath);
//iniファイルから各設定を取得
mode := ini.ReadString('view', 'mode', 'default');
ini.ReadSectionValues(mode, lst);
finally
FreeAndNil(ini);
end;
end;
//--------------------------------------
// 表示
//--------------------------------------
procedure Tfrm.view();
var
str: string;
i: Integer;
j: Integer;
begin
for i := 0 to ComponentCount - 1 do
begin
//ラベルでなければ抜ける
if Components[i].ClassType <> TLabel then
begin
Continue;
end;
for j := 0 to lst.Count - 1 do
begin
//項目名チェック
if (Components[i] as TLabel).Caption <> lst.KeyNames[j] then
begin
Continue;
end;
//同プロパティ名のエディットに表示
//※事前にプロパティ名を型名(3文字)+任意で設定
// 例)lblMode、edtMode や lblNumber、edtNumber
str := (Components[i] as TLabel).Name;
str := str.Replace('lbl', 'edt');
TEdit(FindComponent(str)).Text := lst.Values[lst.KeyNames[j]];
Break;
end;
end;
end;
参考
DelFusa Floor
TStringListのName=Value形式を使って一時的に文字列を保持する
中村の里
ユニット NkMemIniFile のリファレンス
1.4.1.2.13 ReadSectionValues メソッド参照。
今回使っているのはTIniFile、上記サイトはTMemIniFileの拡張版ということで、ものは違うんですがTMemIniFileはTIniFileの上位互換的なやつやろ、と。
よく見るのはiniファイルのサイズ上限ですが、詳しく知りたいなら公式をどうぞ。
参考の参考
embarcadero
TIniFile および TMemIniFile の使用
@掲示板
iniファイルについて