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.印刷と工作
後は、おなじみの方法です。これを印刷して、切り貼りしてください。詳しい方法は計算尺のイメージからの作成をご覧ください。