Search Menu を実装

TEXT を検索する Search Menu を実装します。

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

Search Menu の説明

  1. TEXT を検索する Search Menu を実装します。
    メソッド(イベントハンドラ)は Menu を登録 で作成済です。
    親メニュー 子メニュー メソッド 説明
    検索(&S)
    キー(&K) KeyType 検索(置き換)キーをタイプします
    タイトル(&T) TSearch タイトルを検索します
    テキスト検索(&S) Search TEXT を検索します
    置き換え(&R) Replace TEXT を置き換えます
  2. 検索メニューを実装するとき Source, Destinate のタイプ入力が問題です。
    DialogBox(Form2)を使うのが順当な方法でしょうが、プログラムが長くなり面倒です。
    (DialogBox は DialogText.htm を参照して下さい)
    そこで、タイプ入力のとき RichTextBox を一時的に Hide(隠す)方法を使います。
    デザイン画面から RichTextBox に重ねて Button と TextBox を二個貼り付けます。
    名前は規定値のままで button1, textBox1, textBox2 とします。
    Button クリックのイベント(button_Click)を設定して下さい。

  3. 検索で使用する領域を定義して下さい。
        int         m_Idx;                      // Table Index
        string      m_str;                      // Node 選択文字列
        bool        m_UP = false;               // ファイル更新フラグ
        string      m_sou = "Source";           // 検索キー(パスワード)
        string      m_des = "Destinate";        // 置き換え文字列
        string      m_file = "C:\\TMP\\Test2.mem";
    
    プログラムの起動時は button1, textBox1, textBox2 を隠します。
        // アプリケーションの初期化
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            ReadFile(m_file);
            this.Text = m_file;
            button1.Hide();
            textBox1.Hide();
            textBox2.Hide();
            m_Idx = 0;
            treeView1.TopNode.Expand();
            richTextBox1.Text = (string)t_txt[0]; 
        }
    
  4. キーをタイプ入力する KeyType() メソッドです。
    richTextBox1 を隠して button1, textBox1, textBox2 を表示します。
        private void KeyType(object sender, EventArgs e)
        {
            richTextBox1.Hide();
            button1.Show();
            textBox1.Show();
            textBox2.Show();
        }
    
    ボタンのクリックで m_sou と m_des を取得します。
    取得が終わると button1, textBox1, textBox2 を隠して richTextBox1 を表示します。
    検索のときは、置き換え文字列(m_des)をタイプする必要はありません。
        private void button_Click(object sender, EventArgs e)
        {
            m_sou = textBox1.Text;
            m_des = textBox2.Text;
            button1.Hide();
            textBox1.Hide();
            textBox2.Hide();
            richTextBox1.Show();
        }
    
  5. TOP からの Node のルートをタイトルバーに表示する FormView() 関数です。
    pnode から node.Parent で親をたどって TOP Node を見つけます。
    this.Text = str; でルートを印字して treeView1.Select() で TreeView をアクティブにします。
        // Node のルートを Text に表示する
        private void FormView(TreeNode pnode)
        {
            TreeNode node;
            string str = "";
            int i;
            for (node = pnode; node != null; node = node.Parent)
            {
                for (i = 0; i < t_node.Count && (TreeNode)t_node[i] != node; i++) ;
                if (i >= t_node.Count) break;
                str = t_ttl[i] + "/" + str;
            }
            this.Text = str;
            treeView1.Select();
        }
    
  6. RichTextBox に str を設定して key の色を変える FormView() 関数です。
    色の変更だけで Text の修正は無いので Modified を false に設定します。
        private void FormView(string str, string key)
        {
            int pos;
            richTextBox1.Text = str;
            richTextBox1.Select(0, richTextBox1.Text.Length);
            richTextBox1.SelectionColor = Color.Black;
            Title.Text = (string)t_ttl[m_Idx] + "(" + (string)t_ymd[m_Idx] + ")";
            for (pos = 0; ; )
            {
                pos = richTextBox1.Find(key, pos, RichTextBoxFinds.None);
                if (pos < 0) break;
                richTextBox1.SelectionColor = Color.DarkMagenta;
                pos++;
            }
            richTextBox1.Modified = false;
        }
    

Search Menu の実装

  1. メニューから呼び出される検索関係のメソッドです。
    処理がよく似ているので SearchMenu() 関数にまとめます。
        private void TSearch(object sender, EventArgs e)
        {   SearchMenu(0);  }
        private void Search(object sender, EventArgs e)
        {   SearchMenu(1);  }
        private void Replace(object sender, EventArgs e)
        {   SearchMenu(2);  }
    
  2. m_Idx = 0; にして RichTextBox と TreeView を設定します。
    val の値によって、各メソッドを呼び出します。
    FormView((TreeNode)t_node[m_Idx]); は Node のルートをタイトルバーに表示する関数です。
    FormView((string)t_txt[m_Idx], m_sou); は RichTextBox の m_sou に色を設定する関数です。
        private void SearchMenu(int val)
        {
            m_Idx = 0;
            richTextBox1.Text = (string)t_txt[m_Idx];
            treeView1.SelectedNode = (TreeNode)t_node[m_Idx];
            switch(val)
            {
                case 0: TNext(m_sou);   break;
                case 1: Next(m_sou);    break;
                case 2: Next(m_sou, m_des); break;
            }
            MessageBox.Show("☆検索(置換)が終わりました", "Search");
            if (m_Idx >= t_node.Count) m_Idx = 0;
            Title.Text = (string)t_ttl[m_Idx] + "(" + (string)t_ymd[m_Idx] + ")";
            FormView((TreeNode)t_node[m_Idx]);
            treeView1.SelectedNode = (TreeNode)t_node[m_Idx];
            if (val>0)  FormView((string)t_txt[m_Idx], m_sou);
            treeView1.Select();
        }
    
  3. TNext(string sou) では t_ttl[m_Idx] から str.IndexOf() でキーワードを検索します。
    キーワードが見つかれば、次のキーを検索するかを問い合わせます。
        private void TNext(string sou)
        {
            string str;
            DialogResult rc;
            for (; m_Idx < t_ttl.Count; m_Idx++)
            {
                str = (string)t_ttl[m_Idx];
                if (str.IndexOf(sou, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    richTextBox1.Text = (string)t_txt[m_Idx];
                    Title.Text = (string)t_ttl[m_Idx] + "(" + (string)t_ymd[m_Idx] + ")";
                    FormView((TreeNode)t_node[m_Idx]);
                    rc = MessageBox.Show("続けますか?", "選択",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (rc == DialogResult.No) return;
                }
            }
        }
    
  4. Next(string sou) では t_txt[m_Idx] から str.IndexOf() でキーワードを検索します。
    キーワードが見つかれば、元の Text(str) とキーワードをパラメータにして KeySelct() を呼び出します。
        private void Next(string sou)
        {
            string  str;
            for (; m_Idx < t_txt.Count; m_Idx++)
            {
                str = (string)t_txt[m_Idx];
                if (str.IndexOf(sou, StringComparison.OrdinalIgnoreCase) >= 0)
                {   if (!KeySelct(str, sou))    return;  }
            }
            m_Idx = 0;
        }
    
  5. Next(string sou, string des) では t_txt[m_Idx] から str.IndexOf() でキーワードを検索して richTextBox1.SelectedText で置き換えます。
    大文字/小文字を区別しないで検索するには string の IndexOf() が適しています。
    大文字/小文字を区別しないで置き換えるには RichTextBox の Find と SelectedText が適しています。
    sou が見つかれば des に置き換えて、置換済の Text(str) と置き換えた文字列をパラメータにして KeySelct() を呼び出します。
        private void Next(string sou, string des)
        {
            string  str;
            int     pos;
            for (; m_Idx < t_txt.Count; m_Idx++)
            {
                str = (string)t_txt[m_Idx];
                if (str.IndexOf(sou, StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    richTextBox1.Text = (string)t_txt[m_Idx];
                    for (pos = 0; ; )
                    {
                        pos = richTextBox1.Find(sou, pos, RichTextBoxFinds.None);
                        if (pos < 0) break;
                        richTextBox1.SelectedText = des;
                        pos += des.Length;
                    }
                    str = richTextBox1.Text;
                    t_txt[m_Idx] = str;
                    m_UP = true;
                    if (!KeySelct(str, des))    return;
                }
            }
        }
    
  6. KeySelct(string str, string key) では、見つけたキーワードの色を変えて解りやすく表示します。
    検索(置換)を続けるかを聞いて true または false をリターンします。
        // RichTextBox に str を設定して key の色を変えて表示
        private bool KeySelct(string str, string key)
        {
            DialogResult rc;
            FormView(str, key);
            FormView((TreeNode)t_node[m_Idx]);
            rc = MessageBox.Show("続けますか?", "選択",
                MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rc == DialogResult.Yes) return true;
            return false;
        }
    

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

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