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
    }
}