User Menu を実装

フォントやパスワードを設定する User Menu を実装します。

前田稔の超初心者のプログラム入門

User Menu

  1. フォントやパスワードを設定する User Menu を実装します。
    メソッド(イベントハンドラ)は Menu を登録 で作成済です。
    親メニュー 子メニュー メソッド 説明
    ユーザー設定(&U)
    ファイルを起動(&E) Exec 既定のプログラムから起動します
    フォントを設定(&F) SetFont フォントを設定します
    リスト(&L) TopList トップからのリストを印字します
    パスワード(&P) PassWord パスワードをタイプします
    設定(&S) SetPass パスワードを設定します
    解除(&R) ResetPass パスワードを解除します
  2. Exec() メソッドの実装です。
    m_sou にファイル名を設定して呼び出して下さい。
    F5 キーや「テキスト(&T)/コピー(&C)」で m_sou にファイル名を格納することが出来ます。
    ファイルの存在を調べて Process.Start() で起動します。
        private void Exec(object sender, EventArgs e)
        {
            if (File.Exists(m_sou))
                System.Diagnostics.Process.Start(m_sou);
        }
    
  3. Memo2 自身も Process.Start() 起動(ドラッグ&ドロップや Exec 起動)に対応するようにプログラムします。
    Main(string[] args) でパラメータを受け取って「パラメータ無しと、パラメータ有り」の二通りの方法で new します。
    class form01
    {
        [STAThread]
        public static void Main(string[] args)
        {
            MyForm mf;
            if (args.Length==0) mf = new MyForm();
            else    mf = new MyForm(args[0]);
            Application.Run(mf);
        }
    }
    
    パラメータ有りの MyForm(string str) を追加します。
        public MyForm(string str)
        {
            InitializeComponent();
            this.Resize += new System.EventHandler(this.FormResize);
            this.Load += new System.EventHandler(MyForm_Load);
            this.FormClosing += new FormClosingEventHandler(Form_Closing);
            m_file = str;
        }
    
  4. MyForm_Load() では、m_file で渡されたファイルを起動します。
    説明は、このページ後の「XML」を参照して下さい。
    プログラムのテストは、コンパイルで作成された *.exe をウインドウエクスプローラで表示します。
    *.exe に Memo ファイル(C:\TMP\Test2.mem) をドラッグ&ドロップして起動することを確かめて下さい。
  5. フォントを設定する SetFont() メソッドです。
    FontDialog を表示してフォントとサイズを選択します。
    Memo では "MS 明朝" のように、Proportional Font 以外(P が付かないもの)が適しています。
        Font   m_font;      // フォント情報
    
        private void SetFont(object sender, EventArgs e)
        {
            FontDialog fontDialog1 = new FontDialog();
            fontDialog1.Font = m_font;
            fontDialog1.MaxSize = 32;
            fontDialog1.MinSize = 9;
            fontDialog1.FontMustExist = true;
            fontDialog1.FixedPitchOnly = true;
            if (fontDialog1.ShowDialog() == DialogResult.OK)
            {
                m_font = fontDialog1.Font;
                this.treeView1.Font = m_font;
                this.richTextBox1.Font = m_font;
            }
            fontDialog1.Dispose();
        }
    
  6. 現在表示中の m_Idx が指す Node をトップから辿って印字する TopList() メソッドです。
    FormView((TreeNode)t_node[m_Idx]); の説明は Search Menu を参照して下さい。
        private void TopList(object sender, EventArgs e)
        {
            FormView((TreeNode)t_node[m_Idx]);
        }
    

Pass Word

  1. パスワードを設定するときは、TextBox からパスワードをタイプ入力します。
    検索メニューでキーワードをタイプ入力しているので、これを利用します。
    m_sou の領域を定義して下さい。(検索メニューで定義されている領域を借用します)
    プログラムの起動時は button1, textBox1, textBox2 を隠します。
    MyForm_Load() 関数は XML に保存と併せて、この後に掲載します。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            ・・・
            button1.Hide();
            textBox1.Hide();
            textBox2.Hide();
            ・・・
        }
    
  2. パスワードをタイプ入力する PassWord() メソッドです。
    richTextBox1 を隠して button1, textBox1 を表示します。
        private void PassWord(object sender, EventArgs e)
        {
            richTextBox1.Hide();
            button1.Show();
            textBox1.Show();
        }
    
    ボタンのクリックで m_sou にパスワードを取得します。
    button_Click() は検索メニューで使用したものをそのまま借用します。
    必要なのは m_sou にタイプされたパスワードだけです。
        private void button_Click(object sender, EventArgs e)
        {
            m_sou = textBox1.Text;
            m_des = textBox2.Text;
            button1.Hide();
            textBox1.Hide();
            textBox2.Hide();
            richTextBox1.Show();
        }
    
  3. Node 単位にパスワードを設定する SetPass() メソッドです。
    パスワードを設定すると t_ymd[] の後尾に「*」を付け加えます。
    Text Editor で見ても何が書いてあるかわかりませんが、簡単な暗号化なので保証の限りではありません。
    パスワードを設定すると TextBox の表示などに影響が及ぶので、Memo2 β版で実装します。
    パスワードの基礎は TEXT の暗号化 で説明しています。
    我と思わん方は実装してみて下さい。
  4. パスワードが設定されている Text は PassWord() メソッドでパスワードを入力しないと表示されません。
    また、間違ったパスワードを設定すると Text が読めません。
    パスワードを間違えたときは、保存せずに終了して下さい。
    間違いを繰り返すと、本当に解読不能になってしまいます。
    旧バージョンのパスワードが設定されたファイルは Memo2 では扱えません。
    パスワードを解除してから Memo2 で入力して下さい。

XML に保存

  1. Memo2 の設定情報(フォントや最後に開いたファイル)を XML に保存します。
    XML_File でファイルのパスを定義します。
    class XmlClass が保存情報の構造体で、Font 情報と Memo File 名を保存します。
        Font    m_font;     // フォント情報
        string  m_sou;      // パスワード
        string  m_file = "C:\\TMP\\Test2.mem";
        string  XML_File = @"C:\tmp\memo.xml";
        public class XmlClass
        {   public string      name;    // Font Name
            public float       point;   // Font Size
            public string      file;    // File Name
        }
    
  2. Form_Closing() 関数で XML を保存します。
        private void Form_Closing(object sender, FormClosingEventArgs e)
        {
            DialogResult rc;
            CheckText();
            if (m_UP)
            {
                rc = MessageBox.Show("保存しないで終了?", "選択", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (rc == DialogResult.No)
                {
                    e.Cancel = true;
                    return;
                }
            }
    
            XmlClass obj = new XmlClass();
            obj.name = m_font.Name;
            obj.point = m_font.SizeInPoints;
            obj.file = m_file;
            System.Xml.Serialization.XmlSerializer serializer =
                new System.Xml.Serialization.XmlSerializer(typeof(XmlClass));
            System.IO.FileStream fs =
                new System.IO.FileStream(XML_File, System.IO.FileMode.Create);
            serializer.Serialize(fs, obj);
        }
    
  3. Form_Load() 関数で XML の情報を設定します。
    //m_file = obj.file; のコメントを外すと、前回使っていたファイルがロードされます。
    但し、ドラッグ&ドロップに対応しなくなるので一工夫必要です。
    new Font("MS 明朝", 12) は、ファイルが見つからなかったときの規定値です。
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            Width = 1200;
            Height = 600;
            if (File.Exists(XML_File))  //ファイルの有無をチェック
            {
                System.Xml.Serialization.XmlSerializer serializer =
                    new System.Xml.Serialization.XmlSerializer(typeof(XmlClass));
                System.IO.FileStream fs =
                    new System.IO.FileStream(XML_File, System.IO.FileMode.Open);
                XmlClass obj = (XmlClass)serializer.Deserialize(fs);
                fs.Close();
                int point = (int)obj.point;
                m_font = new Font(obj.name, point);
                //m_file = obj.file;
            }
            else m_font = new Font("MS 明朝", 12);
            richTextBox1.Font = m_font;
            richTextBox1.LanguageOption = RichTextBoxLanguageOptions.UIFonts;
            treeView1.Font = m_font;
    
            ReadFile(m_file);
            m_Idx = 0;
            this.Text = m_file;
            button1.Hide();
            textBox1.Hide();
            textBox2.Hide();
            treeView1.TopNode.Expand();
            richTextBox1.Text = (string)t_txt[0];
        }
    
  4. コンパイルすると次のエラーが表示されました。
    エラー 1   型または名前空間名 'Xml' は名前空間 'System' に存在しません。
    アセンブリ参照が不足しています。
    
    このエラーに対する対処の方法です。
    ①using を設定して下さい。
    using System.Xml.Serialization;     // System.Xml.dll を追加
    
    ②System.xml.dll を追加して下さい。
    1. ソリューション・エクスプローラーで「参照設定」を右クリックする。
    2. 「参照の追加」を選択する。
    3. System.xml (または System.xml.dll) をチェックして追加する。
    詳細は Edit Menu を参照して下さい。

[Next Chapter ↓] Menu α版
[Previous Chapter ↑] ToolStrip を実装

超初心者のプログラム入門(C# Frame Work)