Single File Editor

キー操作を設定して Single File Editor の完成です。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. 今回はキー操作を設定して Single File Editor を完成させます。
    またプログラムに専用のアイコンを設定します。
    一般的な Editor では、Single File のものが大多数で、これで完成と言えるかも知れません。
  2. RichTextBox のキー入力を検出するイベントハンドラを設定します。
    [デザイン]を表示して[RichTextBox]を選択します。
    プロパティからイベント(稲妻のアイコン)をクリックします。
    KeyDown に [richTextBox1_KeyDown] とタイプするとイベントハンドラが追加されます。
  3. KeyDown で使用する領域の説明です。
    今までにも出てきましたが、m_Kword は検索するキーワードの領域です。
    m_CurPos[4] は F1~F4 のカーソル位置を記憶する領域です。
    m_stack は、行削除(行コピー)のスタック領域です。
    sepa はキーワードを抽出するときの区切り文字です。
    Form1 の Constructor で m_stack を初期化して下さい。
        string      m_Kword;                // キーワード
        int[]       m_CurPos = new int[4];  // 記憶位置
        ArrayList   m_stack;                // 行編集の領域
        string      sepa = "\n\\\t ,.;:<>(){}[]'\"+-*/=。、";
    
        ・・・
        InitializeComponent();
        m_stack = new ArrayList();
        ・・・
    
  4. ☆Shift キーが押されているときの処理からプログラムします。
    ☆続いて Shift キーが押されていないときの処理です。
    if (e.Shift == true) が Shift キーの判定です。
    F1~F4(Shift+F1~F4) のときは SetCurPos() メソッドでカーソル位置を記録してジャンプします。
    Shift+F5,F6 のときは、Next_srh(), Back_srh() で次のキーワードを検索します。
    F8(Shift+F8) のときは、行スタックから1行分の TEXT を張り付けます。
        //★ RichTextBox KeyDown
        private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            int wp;
    
            wp = richTextBox1.SelectionStart;
            if (e.Shift == true)
            {
                switch (e.KeyCode)
                {
                    case Keys.F1:   //カーソル位置にジャンプ
                        SetCurPos(m_CurPos[0]);
                        break;
                    case Keys.F2:
                        SetCurPos(m_CurPos[1]);
                        break;
                    case Keys.F3:
                        SetCurPos(m_CurPos[2]);
                        break;
                    case Keys.F4:
                        SetCurPos(m_CurPos[3]);
                        break;
                    case Keys.F5:   //キー検索
                        Next_srh(m_Kword);
                        break;
                    case Keys.F6:
                        Back_srh(m_Kword);
                        break;
                    case Keys.F8:   //m_stack ペースト
                        if (m_stack.Count <= 0) break;
                        m_fclass.LineEdit(richTextBox1);
                        richTextBox1.Select(m_fclass.st, 0);
                        richTextBox1.SelectedText = (string)m_stack[m_stack.Count - 1];
                        m_flag = true;
                        break;
                }
                return;
            }
    
            switch (e.KeyCode)
            {
                case Keys.F1:       //F1~F4 カーソル位置を記憶
                    m_CurPos[0] = wp;
                    break;
                case Keys.F2:
                    m_CurPos[1] = wp;
                    break;
                case Keys.F3:
                    m_CurPos[2] = wp;
                    break;
                case Keys.F4:
                    m_CurPos[3] = wp;
                    break;
                case Keys.F5:       //Key Word
                    WordSelect(wp, Color.DarkMagenta);
                    m_Kword = richTextBox1.SelectedText;
                    richTextBox1.Select(wp, 0);
                    break;
                case Keys.F6:       //Line Copy
                    m_fclass.LineEdit(richTextBox1);
                    m_stack.Add(m_fclass.lstr);
                    break;
                case Keys.F7:       //Line Cut
                    m_fclass.LineEdit(richTextBox1);
                    m_stack.Add(m_fclass.lstr);
                    richTextBox1.Select(m_fclass.st, m_fclass.nx-m_fclass.st);
                    richTextBox1.SelectedText = "";
                    m_flag = true;
                    break;
                case Keys.F8:       //Line Paste Popup
                    if (m_stack.Count<=0)   break;
                    m_fclass.LineEdit(richTextBox1);
                    richTextBox1.Select(m_fclass.st, 0);
                    richTextBox1.SelectedText = (string)m_stack[m_stack.Count-1];
                    m_stack.RemoveAt(m_stack.Count-1);
                    m_flag = true;
                    break;
                case Keys.Enter:
                    m_fclass.LineEdit(richTextBox1);
                    if (m_fclass.cursor==m_fclass.st || m_fclass.line>=richTextBox1.Lines.Length-1)
                    {   return;  }
                    richTextBox1.SelectedText = "\n";       //現在位置にCRを挿入
                    richTextBox1.SelectedText = m_fclass.lstr.Substring(0, m_fclass.lt);
                    m_flag = true;
                    e.Handled = true;
                    return;
                default:
                    m_flag = true;
                    break;
            }
        }
    

編集メソッド

  1. RichTextBox のキー操作で使用したメソッドの説明です。
    [cur 位置-3行目]にスクロールして、WordSelect で先頭ワードを色表示します。
        private void SetCurPos(int cur)
        {
            int wk = richTextBox1.GetLineFromCharIndex(cur)-3;
            if (wk<0)   wk = 0;
            wk = richTextBox1.GetFirstCharIndexFromLine(wk);
            richTextBox1.SelectionStart = wk;
            richTextBox1.Focus();
            richTextBox1.ScrollToCaret();
            WordSelect(cur, Color.DarkMagenta);
            richTextBox1.Select(cur, 0);
        }
    
  2. richTextBox の pos の位置からキーワードを抽出します。
        // Word を選択状態に設定  pos:Word選択位置
        private int WordSelect(int pos, Color cor)
        {
            int sp, ep, wp;
            for(sp=pos; sp<richTextBox1.Text.Length; sp++)
            {
                if (richTextBox1.Text[sp]>' ' && richTextBox1.Text[sp]<='}')  break;
            };
            if (sp>=richTextBox1.Text.Length)
            {   MessageBox.Show("WordSelect で終端に達しました");
                return -1;
            }
            ep = sp;
            switch(richTextBox1.Text[ep])
            {
                case '<':
                    wp = richTextBox1.Text.Substring(ep).IndexOf('>');
                    ep += wp + 1;
                    break;
                case '(':
                    wp = richTextBox1.Text.Substring(ep).IndexOf(')');
                    ep += wp + 1;
                    break;
                case '[':
                    wp = richTextBox1.Text.Substring(ep).IndexOf(']');
                    ep += wp + 1;
                    break;
                case '{':
                    wp = richTextBox1.Text.Substring(ep).IndexOf('}');
                    ep += wp + 1;
                    break;
                default:
                    for (ep++; ep < richTextBox1.Text.Length; ep++)
                    {
                        for (wp = 0; wp < sepa.Length; wp++)
                        {
                            if (richTextBox1.Text[ep] == sepa[wp]) break;
                        }
                        if (wp < sepa.Length) break;
                    }
                    break;
            }
            if (ep>=richTextBox1.Text.Length)
            {   ep = richTextBox1.Text.Length-1;
                MessageBox.Show("WordSelect で終端に達しました");
            }
            richTextBox1.Focus();
            if (ep>sp && (ep-sp<80))
            {
                richTextBox1.Select(sp, ep - sp);
                richTextBox1.SelectionColor = cor;
            }
            return ep;
        }
    
  3. キーワードを検索して位置付けます。
    Next_srh() で後方に、Back_srh() で前方に検索します。
        private void Next_srh(string word)
        {
            int wp;
            if (word == string.Empty) return;
            wp = richTextBox1.SelectionStart + word.Length;
            wp = richTextBox1.Find(word, wp, -1, RichTextBoxFinds.None);
            if (wp < 0)
            {   MessageBox.Show("終端に達しました");
                return;
            }
            richTextBox1.Select(wp+80, 0);
            richTextBox1.Select(wp, word.Length);
            richTextBox1.SelectionColor = Color.DarkMagenta;
            textbox.Select(wp, 0);     //選択状態の解除
        }
        private void Back_srh(string word)
        {
            int wp;
            if (word == string.Empty) return;
            wp = richTextBox1.SelectionStart;
            wp = richTextBox1.Find(word, 0, wp, RichTextBoxFinds.Reverse);
            if (wp < 0)
            {   MessageBox.Show("終端に達しました");
                return;
            }
            if (wp>80)  richTextBox1.Select(wp-80, 0);
            richTextBox1.Select(wp, word.Length);
            richTextBox1.SelectionColor = Color.DarkMagenta;
            textbox.Select(wp, 0);     //選択状態の解除
        }
    

アイコンを設定

  1. プログラムに専用のアイコンを設定します。
    アイコンを作成して、プロジェクトのフォルダーに格納して下さい。
    Properties を右クリックして[開く(O)]を実行します。
    (既定のアイコン)の右端をクリックしてアイコンを選択します。
    プロジェクトのデザイン画面から Form を選択してプロパティを表示します。
    Icon のプロパティから右端をクリックして格納したアイコンを選択します。
    詳細は 専用 icon を設定 を参照して下さい。
  2. これで Single File の Editor は完成です。
    現在の所、順調に動作しているのですが、説明不足やメソッドで抜けている所があればメールして下さい。
    Single File では Tab Control は不要で、Form に直接 RichTextBox を張り付ける方法がお勧めです。
    しばらく Single File Editor の不具合を見極めてから、当初の予定通り Multi File Editor に取りかかる予定です。
    私のページの説明によって生じた損害には一切責任を負いません。
    特に Editor などは大切なファイルを破壊する恐れもあり、十分にデバッグの上使用して下さい。

[Next Chapter ↓] TabPage Chenge
[Previous Chapter ↑] 検索機能

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