VB.NETとVC#.NETでの実装

1.方針

このページでは、具体的にVisual Basic.NET, Visual C#.NET を利用して、プログラムを作成し、実行して、計算尺のイメージを作成します。

2.Visual Basic .NETとVisual C# .NET

これらは、Microsoft Visual Studio .NETファミリーに入っています。Enterprise Architectなんていう恐ろしいものを使わなくでも、個別の言語のStandard Editionで十分です。私はAcademicで作成しました。

バージョンは2002で作成しましたが、2003, 2005でも同じ方法で作成できます。それ以前のバージョン、たとえば、Visual Basic 6.0などでは、言語がまったく違うといっても過言ではないので、ご利用いただけません。

Visual Basic .NETとVisual C#.NETは、それぞれがBASIC, Cを基にしているという違いがあるだけで、ほとんど違いがありません。以下に示すコードをご覧いただければ、ほぼ一対一対応が見られるでしょう。両言語は、ほぼ同等の機能を有しています。

3.Pascal形式とcamel形式

1文字目は大文字、2文字目以降は小文字、後は区切りごとに頭を大文字とすることをPascal形式といいます。たとえば、PascalCaseはパスカル形式です。

1文字目は小文字、2文字目以降は小文字、後は区切りごとに頭を大文字とすることをcamel形式といいます。たとえば、camelCaseはカメル形式です。

Visual Basic .NETでは、TextBox1などコントロール名をPascal形式にします。

Visual C# .NETでは、textBox1などコントロール名をcamel形式にします。

以下の文章ではPascal形式で書きますが、Visual C# .NETをご利用になるときにはcamel形式に変えてお読みください。

4.コントロールの配置

Visual Studio.NETで、「ファイル」→「新規作成」→「プロジェクト」で「新しいプロジェクト」ウインドウを表示させます。「プロジェクトの種類」ではご希望の言語を選択し、「テンプレート」では、「Windowsアプリケーション」を選択します。「場所」は適宜変更し、プロジェクト名は何でもかまいませんがたとえば「SlideRuleMaker」などとしておきます。

FormにLabel1, Label2, TextBox1, TextBox2, Button1を配置します。(左:Visual Basic .NET, 右:Visual C# .NET)

それぞれのプロパティをプロパティウインドウで次のように変更します。

プロパティ名
Label1.Font.Size 12
Label1.Text 読取.csvファイル名
Label2.Font.Size 12
Label2.Text 保存.gifファイル名
TextBox1.Font.Size 12
TextBox1.Text (TextBox1.Text = "")
TextBox2.Font.Size 12
TextBox2.Text (TextBox2.Text = "")
Button1.Font.Size 12
Button1.Text 作成

5.コード

Button1をダブルクリックすると、次のようなコードが自動的に作成され、Button1のクリックイベントが作成できます。

Visual Basic .NET

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

End Sub
            
Visual C# .NET

private void button1_Click(object sender, System.EventArgs e)
{

}
            

この間にコードを追加していきます。

Visual Basic .NET

If System.IO.File.Exists(TextBox1.Text) Then
    Dim sr As System.IO.StreamReader
    sr = New System.IO.StreamReader(TextBox1.Text)

    Try
        Dim s As String = sr.ReadLine()
        Dim line As String()
        Dim length As Integer
        Dim place As Integer
        Dim myImage As Image
        myImage = New Bitmap(1000, 100)
        Dim myGraphics As Graphics = Graphics.FromImage(myImage)
        myGraphics.FillRectangle(Brushes.White, 0, 0, 1000, 100)
        Dim p As New Pen(Color.Black)

        Do While s <> ""
            line = s.Split(",")
            length = line(2)
            place = CDbl(line(1)) * 900 + 50
            Select Case length
                Case 1
                    myGraphics.DrawLine(p, place, 45, place, 55)
                Case 2
                    myGraphics.DrawLine(p, place, 40, place, 60)
                Case 3
                    myGraphics.DrawLine(p, place, 35, place, 65)
                Case Else
                    Throw New Exception("長さとして不適切な値が設定されました。" & vbNewLine & s)
            End Select
            s = sr.ReadLine()
        Loop

        myImage.Save(TextBox2.Text, System.Drawing.Imaging.ImageFormat.Gif)
        MessageBox.Show("終了しました。")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        sr.Close()
    End Try
Else
    MessageBox.Show(TextBox1.Text & "がありません。")
End If
Visual C# .NET

if (System.IO.File.Exists(textBox1.Text))
{
        System.IO.StreamReader sr;
        sr = new System.IO.StreamReader(textBox1.Text);

        try
        {
                String s = sr.ReadLine();
                String[] line;
                int length;
                int place;
                Image myImage;
                myImage = new Bitmap(1000,100);
                Graphics myGraphics = Graphics.FromImage(myImage);
                myGraphics.FillRectangle(Brushes.White,0,0,1000,100);
                Pen p  = new Pen(Color.Black);
                                        
                while(s != null)
                {
                        line = s.Split(',');
                        length = int.Parse(line[2]);
                        place = (int)(float.Parse(line[1]) * 900 + 50);
                        switch (length)
                        {
                                case 1:
                                {
                                        myGraphics.DrawLine(p,place,45,place,55);
                                        break;
                                }
                                case 2:
                                {
                                        myGraphics.DrawLine(p,place,40,place,60);
                                        break;
                                }
                                case 3:
                                {
                                        myGraphics.DrawLine(p,place,35,place,65);
                                        break;
                                }
                                default:
                                {
                                        throw new Exception("長さとして不適切な値が設定されました。\n" + s);
                                }
                        }
                        s = sr.ReadLine();
                }

                myImage.Save(textBox2.Text,System.Drawing.Imaging.ImageFormat.Gif);
                MessageBox.Show("終了しました。");
        }
        catch (Exception ex)
        {
                MessageBox.Show(ex.Message);
        }
        finally
        {
                sr.Close();
        }
}
else
{
        MessageBox.Show(textBox1.Text + "がありません。");
}

最終的に完了したファイルを公開しておきます。

これらのファイルをVisual Studio.NET / Visual Basic.NET / Visual C#.NET 2003で開くと、バージョンを変換しなければ開くことができないとの旨のダイアログが表示されますが、「はい」を選択すれば、バージョン2002と同じように利用することができます。

6.解説

6.1.ファイルの読み取り

TextBox1に入力されたファイルが存在すれば、処理、存在しなければ、「"ファイル名"は存在しません」と表示します。

sr.ReadLine()で、1行ずつ読み取ります。s.Split(",")を使って「,」で数字を区切って、配列lineに代入します。

Visual Basic .NET

If System.IO.File.Exists(TextBox1.Text) Then
    Dim sr As System.IO.StreamReader
    sr = New System.IO.StreamReader(TextBox1.Text)
    Dim s As String = sr.ReadLine()
    Dim line As String()
        
    line = s.Split(",")

    sr.Close()
Else
    MessageBox.Show(TextBox1.Text & "がありません。")
End If
Visual C# .NET

if (System.IO.File.Exists(textBox1.Text))
{
        System.IO.StreamReader sr;
        sr = new System.IO.StreamReader(textBox1.Text);
        String s = sr.ReadLine();
        String[] line;

        line = s.Split(',');

        sr.Close();
}
else
{
        MessageBox.Show(textBox1.Text + "がありません。");
}

6.2.イメージの作成

イメージを1000×100のサイズで作成し、白色で塗りつぶします。後に利用する黒色のペンを宣言しておきます。

Visual Basic .NET

        Dim myImage As Image
        myImage = New Bitmap(1000, 100)
        Dim myGraphics As Graphics = Graphics.FromImage(myImage)
        myGraphics.FillRectangle(Brushes.White, 0, 0, 1000, 100)
        Dim p As New Pen(Color.Black)
Visual C# .NET

                Image myImage;
                myImage = new Bitmap(1000,100);
                Graphics myGraphics = Graphics.FromImage(myImage);
                myGraphics.FillRectangle(Brushes.White,0,0,1000,100);
                Pen p  = new Pen(Color.Black);

6.3.メモリの絵画

一行ずつ読んだsがNullでなければ、以下の処理を繰り返します。

一行分をコンマで分割して、配列に代入します。場所は配列の1, 長さは配列の2に格納されています。

Select Case構文(VC#.NETではswitch構文)で長さによって分類し、それぞれにおいて指定された長さでメモリを刻んでいきます。その際、長さが1, 2, 3以外であった場合は、例外を投げます。

Visual Basic .NET

        Do While s <> ""
            line = s.Split(",")
            length = line(2)
            place = CDbl(line(1)) * 900 + 50
            Select Case length
                Case 1
                    myGraphics.DrawLine(p, place, 45, place, 55)
                Case 2
                    myGraphics.DrawLine(p, place, 40, place, 60)
                Case 3
                    myGraphics.DrawLine(p, place, 35, place, 65)
                Case Else
                    Throw New Exception("長さとして不適切な値が設定されました。" &  vbNewLine & s)
            End Select
            s = sr.ReadLine()
        Loop
Visual C# .NET

                while(s != null)
                {
                        line = s.Split(',');
                        length = int.Parse(line[2]);
                        place = (int)(float.Parse(line[1]) * 900 + 50);
                        switch (length)
                        {
                                case 1:
                                {
                                        myGraphics.DrawLine(p,place,45,place,55);
                                        break;
                                }
                                case 2:
                                {
                                        myGraphics.DrawLine(p,place,40,place,60);
                                        break;
                                }
                                case 3:
                                {
                                        myGraphics.DrawLine(p,place,35,place,65);
                                        break;
                                }
                                default:
                                {
                                        throw new Exception("長さとして不適切な値が設定されました。\n" + s);
                                }
                        }
                        s = sr.ReadLine();
                }

6.4.保存と終了の表示

Image.Saveメソッドを利用して、保存します。また、終了を知らせます。

Visual Basic .NET

        myImage.Save(TextBox2.Text, System.Drawing.Imaging.ImageFormat.Gif)
        MessageBox.Show("終了しました。")
Visual C# .NET

                myImage.Save(textBox2.Text,System.Drawing.Imaging.ImageFormat.Gif);
                MessageBox.Show("終了しました。");

6.5.エラー処理

今回は自分で利用するだけなので、詳細なエラー処理をする必要はないでしょう。そこで全体をTry Catch構文で囲っておき、エラーを表示させます。

Visual Basic .NET

    Try

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally

    End Try
Visual C# .NET

        try
        {

        }
        catch (Exception ex)
        {
                MessageBox.Show(ex.Message);
        }
        finally
        {

        }

7.実行

では、実行してみましょう。前のページで作成した.csvファイル名と、保存する.gifファイル名を指定して、「作成」をクリックすると、.gifファイルが作成されます。横の長さを半分にしたものを載せておきます。

後は、このイメージを少し加工します。

8.尺の名前と数字の追加

このイメージに、「C」と「D」という尺の名前と、「1」~「10」の数字を追加します。

「スタート」→「すべてのプログラム」→「アクセサリ」→「ペイント」でペイントを起動します。「ファイル」メニュー→「開く」から、先ほど作成した.gifファイルを開きます。

「ツールボックス」の「テキスト」を利用して、「C」と「D」という尺の名前と、「1」~「10」の数字を追加してください。完了したものは次のような感じです。ただし、横幅は半分にしてあります。

また、C尺とD尺の境目の直線を追加してください。

9.印刷と工作

後は、おなじみの方法です。これを印刷して、切り貼りしてください。詳しい方法は計算尺のイメージからの作成をご覧ください。