Edit Object Class

Edit Object Class を使った Binary Viewer です。

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

プログラムの説明

  1. プログラムが大きく複雑になると Object Class が威力を発揮します。
    Binary Viewer を Edit Object Class を使って整理してみましょう。
    メニューを処理する と比べてみて下さい。
  2. Edit Object Class を置く場所は、別に決められている訳では無いのですが、ソースコードの前の方に置くと[デザイン]が使えなくなります。
    そこで Main() が記述されている form01 Class の後に置くことにします。
  3. Edit Object Class の領域の定義です。
    file_name が入力するファイル名です。
    byt が入力バッファで、一度に128文字(256バイト)ずつ入力(表示)します。
    leng は実際の入力長です。
    pos はファイル先頭からのオフセットです。
    //★ Edit Object Class
    class Edit
    {
        string  file_name;
        byte[]  byt = new byte[256];
        int     leng;
        int     pos;
        string  str = "";
    
  4. Edit Object Class のコンストラクタです。
        public Edit()
        {
            pos = 0;
        }
    
  5. 入力ファイルの選択とファイルの入力です。
        // OpenFileDialog で入力ファイルを選択
        public void OpenFile()
        {
            OpenFileDialog opendlg = new OpenFileDialog();
            opendlg.Filter = "ファイル|*.txt;*.html;*.htm;*.dat;*.cs;*.c|すべてのファイル (*.*)|*.*";
            if (opendlg.ShowDialog() == DialogResult.OK)
            {
                // 選択ファイルを設定
                file_name = opendlg.FileName;
                pos = 0;
                if (!File.Exists(file_name))    //ファイルの有無をチェック
                {
                    MessageBox.Show(file_name, "Input File Error");
                    return;
                }
                GetFile();
            }
        }
    
        // ファイルを入力
        public void GetFile()
        {
            FileStream reader = File.Open(file_name, FileMode.Open);
            reader.Position = pos;
            leng = reader.Read(byt, 0, 256);
            reader.Close();
        }
    
  6. ファイル先頭からのオフセット(入力位置)を設定して GetFile() 関数を呼び出します。
        // 次のレコードを入力
        public void NextPage()
        {
            pos += 256;
            GetFile();
        }
    
        // 前のレコードを入力
        public void PreviousPage()
        {
            if (pos >= 256)
            {
                pos -= 256;
                GetFile();
            }
        }
    
  7. string にレコードを編集します。
        // string にレコードを編集
        public string View()
        {
            int     i,j,k;
            byte[]  wt = new byte[16];
    
            str = "";
            for(i=0; i<leng; i+=16)
            {   j = leng-i;
                if (j > 16) j = 16;
                for (k = 0; k < 16; k++) wt[k] = 0;
                for (k = 0; k < j; k++) wt[k] = byt[i + k];
                // オフセット
                k = (pos+i) / 2;
                str += k.ToString("X4");
                str += ": ";
                // 16進
                for(k=0; k<j; k++)
                {   str+= wt[k].ToString("X2");
                    if (k % 4 == 3) str += " ";
                }
                for (; k < 16; k++)
                {   str += "  ";
                    if (k % 4 == 3) str += " ";
                }
                // 文字
                str+= "  ";
                for(k=0; k<j/2; k++)
                {   if ((wt[k*2]==0x0D && wt[k*2+1]==0) ||
                        (wt[k*2]==0x0A && wt[k*2+1]==0))
                        str+= ".";
                    else
                        str+= (char)(wt[k*2] + (wt[k*2+1]<<8));
                }
                str+= "  ";
                str+= "\r\n";
            }
            return str;
        }
    }
    
  8. Edit Object Class に主要な機能が定義されているので、後は呼び出すだけです。
    Main() メソッドは変わりません。
    //★ Main() form01 Class
    class form01
    {
        [STAThread]
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  9. MyForm のデータ領域で Edit Object Class を定義します。
    MyForm のコンストラクタから OpenFile() を呼び出します。
    public class MyForm : Form
    {
           ・・・
    
        Edit    edit = new Edit();  // Edit Object Class の定義
    
        public MyForm()
        {
            InitializeComponent();
            edit.OpenFile();
            Paint += new PaintEventHandler(MyHandler);
        }
    
  10. MyHandler から View() を呼び出して、編集された string を textBox1.Text に設定します。
        private void MyHandler(object sender, PaintEventArgs e)
        {
            textBox1.Text = edit.View();
        }
    
  11. FileOpen() イベントハンドラです。
        private void FileOpen(object sender, EventArgs e)
        {
            edit.OpenFile();
            Invalidate();
        }
    
  12. NextPage() と PreviousPage() のイベントハンドラです。
        private void NextPage(object sender, EventArgs e)
        {
            edit.NextPage();
            Invalidate();
        }
    
        private void PreviousPage(object sender, EventArgs e)
        {
            edit.PreviousPage();
            Invalidate();
        }
    

[Next Chapter ↓] utf-16, utf-8
[Previous Chapter ↑]
メニューを処理する

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