Configlib(設定ダイアログ作成補助ライブラリ)
設定ダイアログはPropertyGridを使用すると簡単に作成できるが変更のキャンセルができない。
(FlashDevelopの設定もキャンセルがない)
猫歩きさんの解説にあるようにキャンセルのためにはクローンを作成したり色々と面倒なので猫歩きさんの解説とKuonのソースを参考にしてライブラリを作成した。
たぶんメモリリークなどがたくさんあると思う。
ダウンロードはここから。
MTIライセンスでソース公開。
下のような設定ダイアログが使用できる。
以下サンプル
TextBoxを貼り付けたフォーム
using System; using System.Windows.Forms; using System.IO; namespace demo { public partial class Form1 : Form { private Setting setting; public Form1() { InitializeComponent(); this.Load += new EventHandler(Form1_Load); this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); } void Form1_Load(object sender, EventArgs e) { if (File.Exists("setting.xml")) { setting = Configlib.Util.SerializeXML<Setting>.Load("setting.xml"); textBox1.BackColor = setting.backcolor; textBox1.ForeColor = setting.forecolor; textBox1.Font = setting.font; textBox1.WordWrap = setting.Wrap; setting.StringList.ForEach(delegate(string s) { textBox1.Text += s+ Environment.NewLine; }); this.Location = setting.point; this.Size = setting.size; } else { setting = new Setting(); setting.font = new System.Drawing.Font("MS Pゴシック", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128))); } //設定ダイアログで変更が決定された場合に発生するイベント setting.AppliedEvent += new Configlib.ConfigEventHandler(setting_AppliedEvent); } void Form1_FormClosing(object sender, FormClosingEventArgs e) { setting.point = this.Location; setting.size = this.Size; Configlib.Util.SerializeXML<Setting>.Save("setting.xml", setting); } //設定ダイアログで変更が決定された場合に発生するイベント //configが変更されたインスタンス void setting_AppliedEvent(object sender, object config) { setting.Dispose(); setting = (Setting)config; textBox1.BackColor = setting.backcolor; textBox1.ForeColor = setting.forecolor; textBox1.Font = setting.font; textBox1.WordWrap = setting.Wrap; setting.StringList.ForEach(delegate(string s) { textBox1.Text += s + Environment.NewLine; }); } private void configToolStripMenuItem_Click(object sender, EventArgs e) { //設定ダイアログ表示 Configlib.ConfigForm.Show(setting); } } }
設定クラスのソース
using System; using System.Collections.Generic; using System.Drawing; using System.ComponentModel; using System.Xml.Serialization; using Configlib.Controls; namespace demo { //ConfigObjectを継承する public class Setting : Configlib.ConfigObject, IDisposable { private Color _foreColor; [XmlIgnore] public Color forecolor { get { return _foreColor; } set { _foreColor = value; } } //シリアライズのために追加 [Browsable(false)] public string ForeColorText { get { return ColorTranslator.ToHtml(this._foreColor); } set { this._foreColor = ColorTranslator.FromHtml(value); } } private Color _backColor; [XmlIgnore] public Color backcolor { get { return _backColor; } set { _backColor = value; } } //シリアライズのために追加 [Browsable(false)] public string BackColorText { get { return ColorTranslator.ToHtml(this._backColor); } set { this._backColor = ColorTranslator.FromHtml(value); } } private Font _font; [XmlIgnore] public Font font { get { return _font; } set { _font = value; } } //シリアライズのために追加 [Browsable(false)] public string TextFont { get { FontConverter fc = new FontConverter(); return fc.ConvertToString(_font); } set { FontConverter fc = new FontConverter(); this._font = fc.ConvertFromString(value) as Font; } } private Size _size; [Browsable(false)] public Size size { get { return _size; } set { _size = value; } } private Point _pos; [Browsable(false)] public Point point { get { return _pos; } set { _pos = value; } } private bool _wrap; public bool Wrap { get { return _wrap; } set { _wrap = value; } } //Listの変更通知を受け取るため属性を追加 private List<string> _stringList = new List<string>(); [Editor(typeof(CustomCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))] public List<string> StringList { get { return this._stringList; } set { this._stringList = value; } } public override string name { get { return "demo"; } } #region IDisposable メンバ public void Dispose() { if (_font != null) { _font.Dispose(); _font = null; } } #endregion } }