NonSoft

フォームサイズを保存/回復するサンプル(C#.NET)


 サンプル(ソース/コード)
フォーム(ウィンドウ)終了時のフォームサイズを保存して置き、次回実行時に前回のファームサイズを
回復するサンプルです。几帳面な方はいつも同じ所にウィンドウを同じサイズで表示したいと思うよう
です。プログラムを作る最初の作業としてこの処理をコピペするようにすると喜ばれるでしょう。
このサンプルで保存するファイルはXML形式でシリアライズと言う方法(iniファイルのようなもの)
を使用しています。

VB.NET版のサンプルは標準モジュールで作成しているのですが、C#.NET版ではクラスで実現しています。
このクラスはpublic宣言している事に注意してください。

VB.NET版はこちら「フォームサイズを保存/回復するサンプル(VB.NET)」です。

★クラス(Class1.cs)
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;

public class Class1
{
    /// <summary>
    /// フォームサイズデータのフォルダ名
    /// </summary>
    private const String DEF_FLD = "Env";

    /// <summary>
    /// フォームサイズデータのファイル名
    /// </summary>
    private const String DEF_FIL = "WinInfo";

    /// <summary>
    /// フォームサイズデータ
    /// </summary>
    /// <remarks></remarks>
    public class FromSizeDt
    {
        /// <summary>
        /// フォームの左上Left座標
        /// </summary>
        /// <remarks></remarks>
        public int Left = 300;

        /// <summary>
        /// フォームの左上Top座標
        /// </summary>
        /// <remarks></remarks>
        public int Top = 300;

        /// <summary>
        /// フォームの横幅
        /// </summary>
        /// <remarks></remarks>
        public int Width = 400;

        /// <summary>
        /// フォームの横幅
        /// </summary>
        /// <remarks></remarks>
        public int Height = 95;

        /// <summary>
        /// 通常/最小化/最大化
        /// </summary>
        /// <remarks></remarks>
        public FormWindowState WindowState = FormWindowState.Normal;
    }
    public static FromSizeDt Fsdt = new FromSizeDt();

    /// <summary>
    /// フォームサイズのファイル保存
    /// </summary>
    /// <param name="FormName">フォーム名</param>
    /// <param name="Left">フォームの左上Left座標</param>
    /// <param name="Top">フォームの左上Top座標</param>
    /// <param name="Width">フォームの横幅</param>
    /// <param name="Height">フォームの縦幅</param>
    /// <param name="WindowState">通常/最小化/最大化</param>
    /// <remarks></remarks>
    public static void SaveFromSize(String FormName, 
        int Left, int Top, int Width, int Height, 
        FormWindowState WindowState)
    {
        StreamWriter sw = null;
        try
        {
            // フォームサイズファイルのPATH設定
            String AppPath = System.AppDomain.CurrentDomain.BaseDirectory;
            String SettingPath = AppPath + DEF_FLD + "\\" + DEF_FIL + "_" +
                System.Reflection.Assembly.GetEntryAssembly().GetName().Name + "_" + 
                FormName + ".xml";

            // フォームサイズフォルダ作成
            if (Directory.Exists(DEF_FLD) == false)
            {
                Directory.CreateDirectory(AppPath + DEF_FLD);
            }

            // フォームサイズ設定
            Fsdt.WindowState = WindowState;
            if (WindowState == FormWindowState.Normal)
            {
                Fsdt.Left = Left;
                Fsdt.Top = Top;
                Fsdt.Width = Width;
                Fsdt.Height = Height;
            }

            // フォームサイズ保存
            sw = new StreamWriter(SettingPath, false, Encoding.Default);
            XmlSerializer serializer = new XmlSerializer(typeof(FromSizeDt));
            serializer.Serialize(sw, Fsdt);
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Write(ex);
        }
        finally
        {
            if (sw != null) sw.Close();
        }
    }

    /// <summary>
    /// フォームサイズのファイル読込
    /// </summary>
    /// <param name="FormName">フォーム名</param>
    /// <param name="Left">フォームの左上Left座標</param>
    /// <param name="Top">フォームの左上Top座標</param>
    /// <param name="Width">フォームの横幅</param>
    /// <param name="Height">フォームの縦幅</param>
    /// <param name="WindowState">通常/最小化/最大化</param>
    /// <remarks></remarks>
    public static void ReadFromSize(String FormName,
        out int Left, out int Top, out int Width, out int Height,
        out FormWindowState WindowState)
    {
        StreamReader sr = null;
        try
        {
            String AppPath = System.AppDomain.CurrentDomain.BaseDirectory;
            String SettingPath = AppPath + DEF_FLD + "\\" + DEF_FIL + "_" +
                System.Reflection.Assembly.GetEntryAssembly().GetName().Name + "_" + 
                FormName + ".xml";

            // フォームサイズ読込
            sr = new StreamReader(SettingPath, Encoding.Default);
            XmlSerializer serializer = new XmlSerializer(typeof(FromSizeDt));
            Fsdt = (FromSizeDt)(serializer.Deserialize(sr));
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.Write(ex);
        }
        finally
        {
            if (sr != null) sr.Close();
        }

        // フォームサイズ取得
        Left = Fsdt.Left;
        Top = Fsdt.Top;
        Width = Fsdt.Width;
        Height = Fsdt.Height;
        WindowState = Fsdt.WindowState;
    }
}

★フォームモジュール(Form1.cs)
private void Form1_Load(object sender, EventArgs e)
{
    // フォームサイズ回復
    int Left; int Top; int Width; int Height; FormWindowState WindowState;
    Class1.ReadFromSize(
        this.Name, out Left, out Top, out Width, out Height, out WindowState);
    this.Left = Left;
    this.Top = Top;
    this.Width = Width;
    this.Height = Height;
    this.WindowState = WindowState;
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    // フォームサイズ保存
    Class1.SaveFromSize(
        this.Name, this.Left, this.Top, this.Width, this.Height, this.WindowState);
}