Inifileは未だに結構使われている。
つかいやすいのが一番の理由。
XMLとか、直接開いて使うのは結構大変なので。
自分のソフトはこんなのを使っています。
ソースは以下。
https://github.com/kumokumocc/WORK_/tree/master/classlib/cs/IniFile
使い方はこんな感じ。
/// <summary>
/// 名称と、保存用フォームを設定します。フォームは、アプリケーション終了時、Form_Closedイベントが呼ばれるフォームである必要があります。
/// そうでない場合は、IPアドレス、ポートの値が保存されません。
/// </summary>
/// <param name="name"></param>
/// <param name="form"></param>
public void InputData(string name, Form form)
{
this.Text = name;
m_Form = form;
new inifile.CInifile_Form(IniFileSection, "IpAddress", "0.0.0.0", form, textBox_IP, false);
new inifile.CInifile_Form(IniFileSection, "Port", "81", form, textBox_PORT, false);
new inifile.CInifile_Form(IniFileSection, "IpAddress_Bind", "0.0.0.0", form, textBox_BindIp, false);
new inifile.CInifile_Form(IniFileSection, "Port_Bind", "81", form, textBox_BindPort,false);
new inifile.CInifile_CheckBox(IniFileSection, "IsBind", false, form, checkBox_Bind, false);
new inifile.CInifile_CheckBox(IniFileSection, "IsSndCRLF", false, form, checkBox_CRLF, false);
m_Socket = new MySocket(this, label_SocketStatusSend,textBox_Log);
m_StatusCtrl = new global::Status.StatusCtrl(textBox_Status);
m_StatusCtrl.Start(new Status.Closed(this));
timer_Update.Enabled = true;
}
自分の書くコードにはこんな感じで使っています。
new inifile.CInifile_Form(IniFileSection, "IpAddress", "0.0.0.0", form, textBox_IP, false);
なんだこれ、って感じですが、意外と簡単。
inifile.CInifile_Formというのは、Form上のオブジェクトとinifileの設定値を紐づけるクラスです。
第1引数のIniFileSectionは、セクション名。固定値でconst宣言されています。
第2引数はKey。"IpAddress"は文字通りIPアドレスです。
第3引数はデフォルト値。inifile中に指定する項目がなかったときの値です。
第4引数は基本的にはメインの×を押されるフォームです。
このフォームがクリエイトされたときにinifileにアクセスしてデータを読込、クローズされたときにinifileにデータを書き込みます。
第5引数は値を書き込むオブジェクトです。
IP表示用のテキストボックスです。
起動中に書き換えられた場合は、書き換わったアドレスをクローズ時に保存します。
第6引数は、ReadOnlyです。
読み取り専用ならtrueを入れます。trueが入っていたらクローズ時に値を書き込みません。
起動時と終了時しかチェックしていないので、強制終了するとinifileの値は変わりませんが、それ以外はほぼ問題なく使えます。
見えない設定値は危険なので、もしinifileに値が書き込まれていなかった場合にもクローズ時にはデフォルト値を書き込みます。
inifileはexeと同じディレクトリのinifile.iniに書き込まれます。
中身はこんな感じ。
[Sock_Client]
IpAddress=192.168.0.12
Port=8802
IpAddress_Bind=192.168.0.16
Port_Bind=49317
inifile.CInifile_CheckBoxも基本全く同じで、チェックボックスだと値がtrueかfalseかなのでそれに合わせて作っているだけです。
他にコンボボックスもあります。(前回の値を保持して入れているだけですが)
複数コントロールを配列のように扱うものもありますね。さすがにこれはそんなに使ったことないので、ちゃんと動くかな。
次はシリアル通信でも。