前田稔(Maeda Minoru)の超初心者のプログラム入門
![]()
![]()
    ArrayList   m_page;         // 編集ページの配列
    int         m_num;          // 現在編集中の m_page
    private void FileClose(object sender, EventArgs e)
    {   DialogResult rc;
        if (m_num < 0 || m_num >= m_page.Count) return;
        if (m_fclass.flag || ((FileClass)m_page[m_num]).flag)
        {   rc = MessageBox.Show("保存しないで閉じますか", "選択",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (rc == DialogResult.No) return;
        }
        m_page.RemoveAt(m_num);
        if (m_num<tabControl1.TabPages.Count)
        {   tabControl1.TabPages.RemoveAt(m_num);  }
        m_fclass.flag = false;
        m_num = -1;
        PageChenge(0, -1);
    }
 | 
    private void Swap(object sender, EventArgs e)
    {
        if (m_page.Count<2 || m_num==0)   return;
        m_page[m_num] = m_page[0];
        m_page[0]= m_fclass;
        tabControl1.GetControl(m_num).Text = ((FileClass)m_page[m_num]).file;
        tabControl1.GetControl(0).Text = m_fclass.file;
        tabControl1.SelectTab(0);
    }
 | 
    //★ キー操作
    private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
              ・・・
            case Keys.F9:
                FileComp();
                break;
 | 
    // Tab がアクティブのとき、F9(ファイル比較)を押す
    private void TabKeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.F9)   FileComp();
    }
 | 
    // File を比較
    private void FileComp()
    {
        int     pg, pos0, posn;
        string  str0, strn;
        if (m_page.Count<2 || m_num<1)
        {
            MessageBox.Show("比較対象ページを選択して下さい");
            return;
        }
        pg = m_num;
        posn = ((FileClass)m_page[m_num]).cursor;
        pos0 = ((FileClass)m_page[0]).cursor;
        strn = richTextBox1.Text;
        PageChenge(0, pos0);
        str0 = richTextBox1.Text;
        for (posn++, pos0++; posn < strn.Length && pos0 < str0.Length; posn++, pos0++)
        {
            if (strn[posn] != str0[pos0])
            {  break;  }
        }
        richTextBox1.SelectionStart = pos0;
        ((FileClass)m_page[0]).cursor = pos0;
        ((FileClass)m_page[pg]).cursor = posn;
        PageChenge(pg, posn);
    }
 | 
    private void PageChenge(int newpage, int cursor)
    {
        if (m_page.Count == 0)
        {   richTextBox1.Clear();
            return;
        }
        if (newpage!=m_num)     //ページが異なるとき
        {   //現在ページを保存
            if (m_num>=0 && m_num<m_page.Count)
            {
                m_fclass.Save();
                m_fclass.cursor = richTextBox1.SelectionStart;
                m_page[m_num] = m_fclass;
            }
            //m_page[newpage]をロード
            m_num = newpage;
            if (m_num<0 || m_num>=m_page.Count)   m_num = 0;
            m_fclass = (FileClass)m_page[m_num];
            m_fclass.Load();
            tabControl1.SelectTab(m_num);
        }
        m_fclass.SetCurPos(cursor);
        this.Text = m_fclass.path;
        FileClass.WordSelect(m_fclass.cursor, Color.Green);
        richTextBox1.Select(m_fclass.cursor, 0);
    }
 | 
![]()
    ArrayList   m_files;        // Pre Load File
    m_files = new ArrayList();
 | 
    // m_files[] プリロード
    private void PreLoad(object sender, EventArgs e)
    {
        for (int i = 0; i < m_files.Count; i++)
        {
            LoadFile(((FileName)m_files[i]).path, ((FileName)m_files[i]).code, ((FileName)m_files[i]).cursor);
        }
    }
    // 一度削除してから追加
    private void PreAdd(object sender, EventArgs e)
    {
        if (m_num < 0) return;
        PreDel(sender, e);
        FileName fname = new FileName(m_fclass.path, m_fclass.code, m_fclass.cursor);
        m_files.Add(fname);
    }
    private void PreDel(object sender, EventArgs e)
    {
        int i;
        for(i=0; i<m_files.Count && ((FileName)m_files[i]).path!=m_fclass.path; i++);
        if (i<m_files.Count)  m_files.RemoveAt(i);
    }
    private void PreCloar(object sender, EventArgs e)
    {
        m_files.Clear();
    }
 | 
![]()
    public class XmlClass
    {
        public string       name;   //Font Name
        public float        point;  //Font Size
        public int          width;  //ウインドウ幅
        public int          height; //ウインドウ高さ
        public ArrayList    path;   //ファイルパス
        public ArrayList    code;   //TEXTコード
        public ArrayList    cursor; //カーソル位置
    }
 | 
    private void Form_Load(object sender, EventArgs e)
    {
        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_width = obj.width;
            m_height = obj.height;
            for(int i=0; i<obj.path.Count; i++)
            {   FileName fname =
                   new FileName((string)obj.path[i], (string)obj.code[i], (int)obj.cursor[i]);
                m_files.Add(fname);
            }
        }
        else m_font = new Font("MS 明朝", 12);
        richTextBox1.Font = m_font;
        richTextBox1.LanguageOption = RichTextBoxLanguageOptions.UIFonts;
        if (m_width<100)    m_width = 1000;
        if (m_height<100)   m_height = 480;
        this.Width = m_width;
        this.Height = m_height;
        // 4 TAB に設定
        const int EM_SETTABSTOPS = 0x00CB;
        SendMessage(richTextBox1.Handle, EM_SETTABSTOPS, 1, new int[] {16});
    }
 | 
    private void Form_Closing(object sender, FormClosingEventArgs e)
    {
        if (Cancel_Check())
        {
            e.Cancel = true;
            return;
        }
        XmlClass obj = new XmlClass();
        obj.name = m_font.Name;
        obj.point = m_font.SizeInPoints;
        obj.width = this.Width;
        obj.height = this.Height;
        obj.path = new ArrayList();
        obj.code = new ArrayList();
        obj.cursor = new ArrayList();
        for(int i=0; i<m_files.Count; i++)
        {
            obj.path.Add(((FileName)m_files[i]).path);
            obj.code.Add(((FileName)m_files[i]).code);
            obj.cursor.Add(((FileName)m_files[i]).cursor);
        }
        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);
    }
 | 
![]()
| 文字コード | BOM | 説明 | 
|---|---|---|
| utf-16 | FFFE | 先頭2バイトが BOM です | 
| utf-8 | EFBBBF | 先頭3バイトが BOM です | 
| utf-8(BOM無し) | BOM はありません | 
![]()
[Previous Chapter ↑] FileClass
※・