メニューを処理する

メニューを処理するイベントハンドラを作成します。

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

プログラムの説明

  1. メニューを処理するイベントハンドラを作成します。
    ToolBox からメニューを貼り付ける を参考にしてメニューにイベントを設定して下さい。
    FileExit() メソッドにプログラムを終了するコードを追加します。
        private void FileExit(object sender, EventArgs e)
        {
            this.Close();
        }
        
  2. HelpAbout() メソッドにバージョン情報を表示するコードを追加します。
        private void HelpAbout(object sender, EventArgs e)
        {
            MessageBox.Show("Binary Viewer Ver 1.0  by  Maeda Minoru");
        }
        
  3. FileOpen() メソッドから OpenFile() を呼び出します。
        private void FileOpen(object sender, EventArgs e)
        {
            OpenFile();
            Invalidate();
        }
        
  4. NextPage() メソッドで読み取り位置(オフセット)を 256バイト後に設定してファイルを入力します。
        private void NextPage(object sender, EventArgs e)
        {
            pos += 256;
            GetFile();
        }
        
  5. PreviousPage() メソッドで読み取り位置(オフセット)を 256バイト前に戻してファイルを入力します。
        private void PreviousPage(object sender, EventArgs e)
        {
            if (pos >= 256)
            {
                pos -= 256;
                GetFile();
            }
        }
        
  6. OpenFile() メソッドでファイルをオープンします。
        private 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();
            }
        }
        
  7. OpenFileDialog を使うと、実行時に次のエラーが発生します。
    Message="OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA)
    モードに設定されていなければなりません。
    Main() 関数に [STAThread] を追加して下さい。
        [STAThread]
        public static void Main()
        {
        
  8. GetFile() メソッドで pos から 256バイトのデータを byt[256] に入力します。
    Binary Data を扱うので byt はバイトの配列(byte[]) で定義します。
        private void GetFile()
        {
            FileStream reader = File.Open(file_name, FileMode.Open);
            reader.Position = pos;
            leng = reader.Read(byt, 0, 256);
            reader.Close();
            Invalidate();
        }
        
  9. 改行コードを「.」に変換して16進+文字で表示します。
        private void MyHandler(object sender, PaintEventArgs e)
        {   string  wstr = "";
            int     i,j,k;
            byte[]  wt = new byte[16];
    
            for(i=0; i<leng; i+=16)
            {   j = leng-i;
                if (j > 16) j = 16;
                for(k=0; k<j; k++)  wt[k]= byt[i+k];
                // オフセット
                k = (pos+i) / 2;
                wstr += k.ToString("X4");
                wstr += ": ";
                // 16進
                for(k=0; k<j; k++)
                {   wstr+= wt[k].ToString("X2");
                    if (k % 4 == 3) wstr += " ";
                }
                // 文字
                wstr+= "  ";
                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))
                        wstr+= ".";
                    else
                        wstr+= (char)(wt[k*2] + (wt[k*2+1]<<8));
                }
                wstr+= "  ";
                wstr+= "\r\n";
            }
            textBox1.Text = wstr;
        }
        

[Next Chapter ↓] Edit Object Class
[Previous Chapter ↑] 16進+文字

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