法政大学国際文化学部
情報コミュニケーションI
担当 重定 如彦
2003年12月18日
9.2 Function プロシージャ
Functionプロシージャでは、プロシージャの終了後に、プロシージャで行ったプログラムの実行結果を返す事ができます。Functionプロシージャは以下の形式で記述します。
Public Function プロシージャ名(引数名1 As 引数名1の型,・・・)As 返り値の型
プロシージャのブロック
Return 式
End Function
Functionプロシージャの記述方法は、Subプロシージャとほぼ同じですが、以下の点が異なっています。
・
1行目のPublicや最終行のEndの後に、SubではなくFunctionと記述する。
・
一行目の引数の()の後に返り値の型を記述する必要がある。
Functionプロシージャでは、プロシージャの実行後に値を返すので、その値の型をここに記述する必要があります。
・
Return文によって値を返す。
プロシージャが返す値は、Return文によって指定します。
Return 式
と記述された文が実行されると、プロシージャの実行はそこで終了し、「式」が計算され、その結果が返り値として返されます。Functionプロシージャを式の中で呼び出した場合、Functionプロシージャの部分は「返り値」に置き換えられて計算が行われます。式の中で呼ばれかなかった場合は、返り値の値は無視されます。
例題9−2 Functionプロシージャを使ったプログラム例
Functionプロシージャを使って半径rの円や球に関する計算を行うプログラムを作成します。以下のようなフォームを作成し、半径の右のテキストボックスをダブルクリックし、プログラムを入力してください。
オブジェクト |
プロパティ |
設定値 |
テキストボックス |
(name) |
上から順に 「半径」、「円周」、「面積」、「体積」 |
Text |
すべて空白に設定 |
1.プロシージャの説明
この例題では、桁あわせを行う部分をプロシージャ「桁あわせ」で行っています。プロシージャ桁あわせでは、「数値」という名前の引数に桁合わせを行う数字を代入し、それを使って、Format関数で数値を小数点以下3桁までの文字列に変換しています。結果は文字列なので、プロシージャの型をStringに指定する必要がある点に注意して下さい。
2.プロシージャ呼び出し部分の説明
プロシージャ呼び出し側では、引数に数値の部分を記述して呼び出しを行っています。 プロシージャを使った利点の一つに、プログラムの変更が容易になるというものがあります。例えば、上記のプログラムを小数点以下第4桁まで表示するように変更するには、プロシージャ「桁あわせ」の中身を Return Format(数値, ”#.0000“)に変更するだけで済みますが、プロシージャを使わなかった場合は、3つのFormat関数の中の#.000をそれぞれ#.0000に変更する必要があります。この例題の場合は3つしかないので変更はまだ楽なほうですが、もし変更が必要な箇所がプログラムの中のあちこちに散らばっていた場合はミスなく変更するだけでも大変な作業が必要となります。
9.3 変数のスコープ
9.3.1 局所変数と大域変数
Visual Basic .Netでは、プロシージャの引数や、プロシージャ内で宣言された変数は、プロシージャのブロックの中でしか使用することはできません。また、プロシージャに限らず、If文や、For文などの制御構造のブロックの中で変数を定義した場合は、その変数はそのブロックの中でしか使用できないというきまりがあります。このような変数を利用できる有効範囲のことを変数のスコープ(Scope)と呼びます。
この説明ではわかりにくいと思いますので、図で説明します。
例えば下のプログラムでは、プロシージャ1で変数xが引数として宣言され、変数aがプロシージャ内で宣言されています。この場合、x とaはそれらの変数が宣言されたプロシージャ1のブロックの中でしか利用することはできません。つまり、プロシージャ2のブロック内で a = 5 のような、代入文を記述すると、プロシージャ2で変数aが宣言されていないため、エラーになってしまいます。
Public
Sub プロシージャ1(ByVal x As Integer)
変数aと変数xの有効範囲
Dim a As Integer
プロシージャ1のブロック
End
Sub
Public
Sub プロシージャ2()
プロシージャ2のブロック
End
Sub
次の例では、変数A,B,Cがそれぞれ別々のブロックの中で定義されています。この場合、それぞれの変数の有効範囲は以下のようになります。
Public
Sub プロシージャ()
Dim A As Integer
For A = 1 To 10
Aの有効範囲
Dim B As
Integer
Bの有効範囲
プログラム・・・
If B > 10 Then
Cの有効範囲
Dim C As
Integer
プログラム・・・
End If
Next A
End Sub
このように変数の有効範囲が決まっている変数のことを「局所変数」と呼びます。局所変数は、変数のスコープ(有効範囲)が終了した時点で、自動的に破棄されてしまうため、変数のスコープの外では使用することができない点に注意が必要です。
変数の有効範囲がどこまでかを知る最も簡単な方法は、インデントを見ることです。
上記の図のように、変数が定義された行と比較してインデントが同じか、それより右にずれている部分がその変数の有効範囲に一致します。
一方「局所変数」に対して、一度定義すればどんな場所でも使用することができる変数のことを「大域変数」と呼びます。大域変数は、プロシージャの外に記述することで定義することができます。 例えば以下のように記述を行うと、変数Aをどのプロシージャ内でも使用することが可能です。
Dim
A As Integer
Public
Sub プロシージャ名()
プログラムのブロック
End
Sub
9.3.2 同じ名前の変数名
Visual Basic .Netでは同じブロック内では、同じ名前の変数を複数宣言することはできませんが、ブロックが異なっていれば例え外側のブロックで同じ名前の変数が宣言されていたとしても、同じ変数を複数宣言することが可能です。例えば、以下のプログラムは変数Aを同じブロックで2回宣言しているのでエラーになります。
Public
Sub プロシージャ名()
Dim A As Integer
Dim A As Integer
プログラム
End
Sub
次のプログラムは変数Aを2回宣言していますが、それぞれ別のブロックで宣言しているのでエラーにはなりません。
Public Sub プロシージャ名() 外側のブロックのA 内側のブロックのA
Dim A As Integer 0 未定義
A = 0
0 未定義
IF
A == 0 Then 0 未定義
Dim A As Integer 0 0
A = 10 0 10
End
If 0 未定義
A = A +
1 1 未定義
End Sub
上記の例のように、外側のブロックですでに宣言されている変数を別の内側のブロックで宣言した場合は、それぞれの変数は名前は同じですが、別々のものとして扱われ、実際の計算では内側のブロックで定義された変数が有効となります。
上記の例でプログラムの実行と共に変数Aの値がどうかわるかを右に示します。変数の値で網掛けになっている部分がプログラム上で、Aの値として利用される部分です。
上記の例では、多くの方が、変数名の重複はややこしいだけで利点がないと思われるでしょう。そこで、いくつか変数名の重複が必要になる具体的な例を挙げることにします。
例その1
変数名の重複が最も良く使われるのは、プロシージャ内での変数の宣言です。例えば、テキストボックスに入力した数字長さを半径とする、「円周の長さ」、「円の面積」を求め、答えをテキストボックスに表示するプログラムを、Functionプロシージャを作成した場合を考えて見ましょう。
円周の長さを求めるプロシージャは以下のようになります。
Public
Function 円周の長さ(ByVal 半径 As Double) As Double
Return 2 * Math.PI * 半径
End
Function
同様に、円の面積を求めるプロシージャは以下のようになります。
Public
Function 円の面積(ByVal 半径 As Double) As Double
Return Math.PI * 半径 * 半径
End
Function
勘の良い方は、この時点で、「半径」という同じ名前の変数を、2つのプロシージャで2度宣言していることに気づかれたのではないかと思います。この例のように、同じ意味のデータを使って計算を行うプロシージャを複数記述する場合、同じ名前の変数を使いたいということが非常に頻繁におこります。もし、変数名の重複定義が許されなければ、上記のプログラムはエラーとなってしまうので、プロシージャ毎に、同じ「半径」というデータを扱うにもかかわらず引数の名前を別のものにする必要があります。上記のような記述ができるのは、「ブロックが異なれば同じ名前の変数を定義することができる」という決まりがあるからなのです。
例その2
次の例では、1から10までの数字それぞれに対して、1からその数字までの合計を計算し、結果を「合計」という配列変数に格納する「数字の計算」というプロシージャを作成します。このプログラムでは、数字の合計を計算するために、「数字の合計」という名前のプロシージャを作成し、それを使って計算を行うことにします。
Public
Function 数字の計算(ByVal n As Integer)
Dim 合計(10) As Integer
Dim i As Integer
For i = 1 To 10
合計(i) = 数字の合計(i)
Next i
End
Function
Public
Function 数字の合計(ByVal n As Integer) As Integer
Dim i, 合計 As Integer
合計 =
0
For i = i
To n
合計 = 合計 + i
Next
Return 合計
End
Function
ここでそれぞれのプロシージャで、共に変数「i」と変数「合計」を定義している点に注目して下さい。このプログラムが正しく動作するのは、プロシージャ「数字の計算」内の変数「i」と変数「合計」がプロシージャ「数字の合計」の変数「i」と変数「合計」とは名前は同じであるが別の変数として計算されているからです。
実際に流れを追って手順を見てみましょう。プログラムを実行し、プロシージャ「数字の計算」内の繰り返しで、「i」が5になった時のプログラムの動作の流れを以下に記述します。
i=5の時に「数字の計算」内の以下の行が実行された場合の処理の流れ
数字の計算内の変数i 数字の合計内の変数i
合計(i) = 数字の合計(i) 5 未定義
Public
Function 数字の合計(ByVal n As Integer) As Integer
Dim i, 合計 As Integer 5 0
合計 =
0 5 0
For i = i
To n 5 1〜5まで変化
合計 = 合計 + i 5 1〜5まで変化
Next 5 1〜5まで変化
Return 合計 5 6
End
Function
プログラムの右に記述されている数字がそれぞれのブロックの変数iの値です。網掛けになっている数字が実際にプログラムで使用される変数です。上記のように、「数字の計算の変数i」は、プロシージャ「数字の合計」内では一切使われず、プロシージャ「数字の合計」内でいくら「変数の合計の変数i」を変化させても「数字の合計の変数i」が変化することはありません。
この例で2つのプロシージャで同じ名前の変数を使っても何故うまくプログラムが動作するかについて、各自プログラムの流れを追って理解してください。
9.4 仮引数と実引数
初心者にありがちな勘違いの一つに、プロシージャ呼び出しの引数に変数を記述し、プロシージャ内でその引数の計算を行うと、呼び出した側の変数の値が変化すると思ってしまうというものがあります。先ほど例を挙げて説明したばかりですが、以下のプログラムのプロシージャ「計算」を実行した後に、変数xの値はいくつになるか考えてみてください。
Public
Sub 計算()
Dim x As Integer
x =
0
プラス1(x)
End
Sub
Public
Sub プラス1(ByVal x As Integer)
x =
x + 1
End
Sub
プログラミングになれていない方の多くはプロシージャ「プラス1」の中でxに1が加算されているので、xが1になると思われるかもしれません。しかし、先ほども説明したとおり、プロシージャ「計算」の変数xとプロシージャ「プラス1」の変数xは名前はxでも全くの別物です。したがって、上記のプログラムを実行した結果、xは0のままです。Visual Basic .Netではこのような性質を持つ引数のことを「仮引数」と呼びます。
一方、上記のようなプログラムを実行した結果、xが1になって欲しい場合もあります。例えば、プロシージャを実行した結果、2つ以上の値を返して欲しい場合などです。値を1つだけ返したい場合は、FunctionプロシージャとReturn文を使えばOKですが、Return文は2つ以上の値を返すことできません。プロシージャの引数を「実引数」として宣言することにより、プロシージャ呼び出し時に引数に変数名を記述すると、呼び出したプロシージャ内で対応する引数の値を変化させると、呼び出した引数の値を変化させることができるようになります。
引数を実引数として宣言するには、以下のように、引数の前に ByRef を記述します。(これは、SubプロシージャとFunctionプロシージャで共通です)。最初にプロシージャの説明した時に引数の前に記述した ByValは引数を「仮引数」として宣言するという意味を持ちます。
Public Sub プロシージャ名(ByRef 引数名 As 引数の型,...)
先ほどのプログラムで、プロシージャ「プラス1」の引数の前を以下のようにByRefに変更してプロシージャ「計算」を実行すると、プラス1を呼び出した結果xの値が1になります。
Public
Sub 計算()
Dim x As Integer
x =
0
プラス1(x)
End
Sub
Public
Sub プラス1(ByRef x As Integer)
x =
x + 1
End
Sub
引数を実数として宣言した場合、プロシージャ呼び出し時の変数名と引数名が同じである必要はありません。例えば先ほどのプログラムのプロシージャ「プラス1」の引数の名前を以下のように「y」に変更してもプログラムは正常に動作します。
Public
Sub 計算()
Dim x As Integer
x =
0
プラス1(x)
End
Sub
Public
Sub プラス1(ByRef y As Integer)
y = y
+ 1
End
Sub
プロシージャの中で、実引数に相当する部分は、プロシージャ呼び出しで記述された変数に置き換えられて計算が行われると考えて下さい。例えば上記のプログラムを実行すると、プロシージャ「プラス1」の中のプログラムの引数yが以下のように置き換えられて実行されます。
(プロシージャ「計算」の)x = (プロシージャ「計算」の変数)x + 1
また、プロシージャの引数を「実引数」として宣言した場合、プロシージャ呼び出し時に対応する引数の部分には「変数名」以外の記述は行えない点に注意が必要です。何故そうなるかは、実引数の意味を考えればわかります。例えば、先ほどのプログラムのプロシージャ呼び出しの部分を
プラス1(1)
に変更してプログラムを実行するとエラーになります。この場合、プロシージャ「プラス1」を実行すると、x = x + 1 の x が 1に置き換えられ
1 = 1 + 1
という実行不能なプログラムになってしまうからです。
例題9−3 実引数を使ったプログラム例
例題9−2をさらに変更し、実引数を使って半径rの円周、円の面積、球の体積を計算するプログラムを作成します。プログラムの部分を以下のように変更して下さい。
プロシージャ「半径rの図形計算」は、4つの引数を持つプロシージャで、最初の引数rは半径を格納する仮引数で、残りの3つは、円周、面積、体積の計算結果を格納するための実引数です。プロシージャを呼び出した結果、それぞれの実引数に対応する3つの変数「半径rの円周」、「半径rの面積」、「半径rの体積」に計算結果が格納されます。
なお、この例題ではわざとプロシージャ「半径rの図形の計算」の実引数の変数名に、テキストボックスのオブジェクト名と同じ名前をつけていますが、変数のスコープの部分で説明したとおり、このプロシージャの中では「円周」、「面積」、「体積」はテキストボックスのオブジェクト名ではなく、実引数名を表す点に注意して下さい。
9.5プロシージャの強制終了
プロシージャは、End Sub(又はEnd Function)の行まで実行するか、Return文が記述されている行を実行するとそこで終了します。これまでの例では、Return文はプロシージャの最後に記述していましたが、実はReturn文はプロシージャの中の任意の場所に記述することが可能です。Sub プロシージャの場合、単にReturnと記述するだけで、そこでプロシージャの実行をそこで強制的に終了することが可能です。プロシージャの強制終了の使い方は繰り返しの中断に似ています。
例題9−4 プロシージャの強制終了を使ったプログラム
例題9−1をFunctionプロシージャとプロシージャの強制終了を使ったプログラムに書き換えてみます。例題9−1のプログラムを開き、イベントプロシージャを以下のように書き換えてください。
例題9−4プロシージャ「合格判定」は引数「得点」が80以上であるかどうかを判定し、80以上であればReturn命令によって“合格”という文字列を返して終了、そうでなければ“不合格”という文字列を返しています。このように、Return分をプロシージャの途中に記述した場合は、そのreturn分が実行された場合は、それ以降のプログラムは実行されない点に注意して下さい。
9.6 プロシージャの無限ループ
プロシージャの中で他のプロシージャを呼び出す場合は注意が必要です。例えば、以下のような2つのプロシージャを記述したプログラムを考えてください。
Public
Sub プロシージャ1()
プロシージャ2()
End
Sub
Public
Sub プロシージャ2()
プロシージャ1()
End
Sub
このプログラムでプロシージャ1を呼び出すと以下のような動作が実行され、永遠にプログラムの実行が終わらない「無限ループ」が発生してしまいます。
1.プロシージャ1の中でプロシージャ2が呼び出される、
2.プロシージャ2の中でプロシージャ1が呼び出される
3.1へ戻る
このようなプロシージャ実行中に再び、呼び出した側のプロシージャを呼び出すようなプログラムのことを再起呼び出しと呼びます。再起呼び出しは、条件分岐やReturn文などを使って無限ループに陥らないように注意深く記述すれば、有効な場合があります(本書の内容を超えていますのでここでは説明しません)が、ある程度高度なプログラミングが必要です。プログラミングに慣れないうちは、再起呼び出しは無限ループのもとになってしまいますので行わないように注意してください。
10 グラフィックス
ここまでのプログラムでは、計算結果を文字で表示していましたが、文字だけでなく、グラフィックを使って結果を表したほうが、効果的に計算結果を画面に表示することができます。Visual Basic .Netでは、グラフィック描画用メソッドが用意されており、それを使えば簡単にグラフィックスを扱うことができます。
10.1 グラフィックスの座標系と色
コンピュータでは、画面に表示されるグラフィックスは色のついた点の集まりで表現されます。それぞれの点は「座標」と「色」の2つのデータを持っており、グラフィックスは、画面上のそれぞれの点に対して「色」を指定することで描画を行います。
コンピュータでは下の図のように、点の座標を、左右方向をx座標、上下方向をy座標とし、(x座標,y座標)という形式で表現します。例えば、下の図で黒い点は(x,y)という座標で表されます。コンピュータの座標は、数学で使う座標系とは異なり、y座標は下方向が正の方向になる点に注意してください。フォーム上に画像を描画する場合は、フォームの左上の端の座標を(0,0)として描画を行います。
Visual Basic .Netではグラフィックスでよく使われる様々なデータを集めた Drawing というオブジェクトが用意されており、それを使って色を表現することも可能です。Drawingオブジェクトでは以下の方法で色を指定します。
様々な色を集めたプロパティ
Drawing.Color.色の名前
グラフィックスを集めたオブジェクトの名前
以下に使用できる主な色の名前の一覧を挙げます。
色 |
色の名前 |
色 |
色の名前 |
Black |
黒 |
Green |
緑 |
White |
白 |
Yellow |
黄色 |
Red |
赤 |
Purple |
紫 |
Blue |
青 |
|
オレンジ |
上記の方法では、色の名前を知らなければ色をして出来ませんでしたが、それ以外にも点の色は光の3原色である「赤」、「青」、「緑」の色の強さを組み合わせて以下のように表現する方法が用意されています。
Color.FromArgb(赤の色の強さ, 青の色の強さ, 緑の色の強さ)
色の強さは0〜255までの数字で表現し、数字が大きくなればなるほどその色が強くなるということを表します。以下にいくつかの色の表現例を挙げます。
色 |
表現 |
赤 |
Drawing.Color.FromArgb(255, 0, 0) |
紫 |
Drawing.Color.FromArgb(255, 255, 0) |
白 |
Drawing.Color.FromArgb(255, 255, 255) |
黒 |
Drawing.Color.FromArgb(0, 0, 0) |
灰色 |
Drawing.Color.FromArgb(127, 127, 127) |
実は、Drawingの部分は省略可能です。以後はDrawingを省略して記述することにします。
Tips プロパティの要素
上記DrawingオブジェクトのColorプロパティのように、オブジェクトのプロパティが様々な要素を持つ場合があります。その場合に、プロパティの要素を指定するには、
オブジェクト名.プロパティ名.要素名
という方法で記述します。同様にプロパティの要素がさらに複数の要素を持つ場合もあります。そのような場合も同様に以下のように要素名を . で区切って記述します。
オブジェクト名.プロパティ名.要素名1.要素名2
10.2 グラフィックスの描画の手順
Visual Basic .Net でグラフィックスを描画する為には、以下の5つの指定を行う必要があります。
・
グラフィックスオブジェクトを用意する
グラフィックスを描画する為には、グラフィックスを実際に描画する為のオブジェクトを用意する必要があります。実際の描画はここで用意したオブジェクトに対して行います。
・
描画する際に使用するペンを作成する。
図形の枠の種類(枠の太さ、枠の色、枠の線種)を指定する。
・
描画する際に使用するブラシを作成する。
図形が多角形の場合、図形の内部をどう塗りつぶすか(塗りつぶしの色、塗りつぶしのパターン)を指定する。
・
描画する図形の種類を指定する。
「長方形」、「楕円」、「直線」...etc.
・
描画する図形の座標やサイズを指定する。
例えば長方形の場合、長方形の「左上の点の座標」、「横幅」、「縦幅」を指定する。
10.2.1 グラフィックスオブジェクトの作成方法
グラフィックスオブジェクトの作成は以下の方法で行います。
Dim グラフィックスオブジェクトを格納する変数名
As Graphics = Me.CreateGraphics
グラフィックスオブジェクトも他のオブジェクトと同様に、変数に格納することが可能です。その際に、変数の型に「Graphics」を指定してください。右の、 = Me.CreateGraphics の部分で、変数を定義すると同時に新しいグラフィックスオブジェクトを作成し代入しています。
ここで、Meはフォームオブジェクトを表し、Me.CreateGraphicsと記述することで、フォーム上に画像を描画するためのグラフィックスオブジェクトを作成するという意味を表します。
10.2.2 ペンの作成方法
Visual Basic .Netではペンもオブジェクトの一種です。ボタンやテキストボックスなどのコントロールを作成するには、Windows フォームデザイナを使えばOKでしたが、ペンのように、画面に表示できないオブジェクトを作成するには、以下の方法で行います。
1.
作成したオブジェクトを格納するための変数を定義する。
ペンオブジェクトも他の変数と全く同じ方法で定義します。その際に、変数の型には以下のように「Pen」を指定してください。
Dim ペン As Pen
2.
ペンを作成する。
1.の作業では、まだ、ペンオブジェクトを格納するための、入れ物を用意したにすぎません。ペンを実際に作成するには以下の記述を行います。
ペンオブジェクトを格納する変数 = New
Pen(ペンの色, 太さ)
ペンオブジェクトを格納する変数 = New
Pen(ペンの色)
これによって、指定した「ペンの色」、「太さ」を持ったペンオブジェクトを新しく作成し、それを変数に格納することができます。以下のにペンの作成例を挙げます。太さを省略した場合は、太さ1のペンが作成されます
Dim
ペン1, ペン2 As Pen
ペン1 = New Pen(Color.Yellow) '太さが1の黄色のペンを作成
ペン2 = New Pen(Color.FromArgb(255,
0, 0), 3) '太さが3の赤色のペンを作成
また、以下の2種類の方法で、変数の定義と同じ行でペンを作成することも可能です。(注:この場合は、2つ目のように型名と=を省略することも可能です)
Dim
ペン As Pen = New Pen(Color.Yellow)
Dim
ペン As New Pen(Color.Yellow)
こうして作成したペンの線種は「実線」になります。実線以外のペンの線種のペンを作成するには、ペンの線種を表すプロパティ「DashStyle」を使用します。DashStyleは、Drawingオブジェクトを使って以下の方法で線種を指定することができます。
Drawing2D.DashStyle.線種
線種の部分には以下の指定を行うことができます。
線種 |
線種の説明 |
Dash |
網掛け状の線 |
DashDot |
一点鎖線 |
Solid |
実線 |
例えば以下のプログラムはペンの線種を「網掛け状の線」に指定します。
ペン.DashStyle = Drawind2D.DashStyle.Dash
10.2.3 ブラシの作成方法
ブラシもペンと同様に、オブジェクトとして作成し、それを変数に格納して使用します。
1.作成したオブジェクトを格納するための変数を定義する。
ブラシオブジェクトもペンと同様の方法で定義します。その際に、変数の型には以下のように「Brush」を指定してください。
Dim
ブラシ As Brush
2.ブラシを作成する。
特定の色で塗りつぶされたブラシを作成するには以下のように記述します。
ブラシオブジェクトを格納する変数 = New SolidBrush(ブラシの色)
以下のにブラシの作成例を挙げます。
Dim
ブラシ1, ブラシ2 As Brush
ブラシ1 =
New CreateSolidBrush(Color.FromArgb
(255, 0, 0)) '赤色のブラシを作成
ブラシ2 =
New CreateSolidBrush(Color.Yellow) '黄色のブラシを作成
Dim
ブラシ3 As Brush = New CreateSolidBrush(Color.Yellow) '黄色のブラシを作成
特定のパターンのブラシは以下の方法で作成します。
ブラシオブジェクトを格納する変数 =
New Drawing2D.HatchBrush(ハッチパターン, ブラシの前景色, ブラシの背景色)
ハッチパターンは、ブラシの塗りつぶしパターンを指定する部分で以下の方法で指定します。
Drawing2D.HatchStyle.ハッチの種類
ハッチの種類の部分には以下の指定を行うことができます。注:他にも多くの種類のパターンが用意されています。残りについてはヘルプを参照してください。
パターン |
線種の説明 |
Horizontal |
水平線 |
Vertical |
垂直線 |
Cross |
十字線 |
例えば以下のプログラムはブラシを「背景色が白で、赤色の十字のパターン」に指定します。
ブラシ = New
Drawing2D.HatchBrush(Drawing2D.HatchStyle.Cross, Color.Red,
Color.White)
10.2.4 図形の描画方法
図形の描画は、グラフィックスコントロールのメソッドを使います。グラフィックスコントロールには、以下の描画に関するメソッドが用意されています。注:他にも多くの図形を描画する為のメソッドが用意されていますが、そちらについてはヘルプを参照して下さい。
図形 |
メソッド |
意味 |
直線 |
DrawLine(ペン, x1, y1, x2, y2) |
指定したペンを使って(x1,y1)と(x2, y2)を結ぶ直線を描画する。 |
長方形 |
DrawRectangle(ペン, x, y, w, h) |
指定したペンを使って左上の点が(x,y)で幅がw,高さがhの長方形の枠を描画する。 |
楕円 |
DrawEllipse(ペン,x,y,w,h) |
指定したペンを使って左上の点が(x,y)で幅がw,高さがhの長方形に内接する楕円の枠を描画する。 |
長方形 |
FillRectangle(ブラシ, x, y, w, h) |
指定したブラシを使って左上の点が(x,y)で幅がw,高さがhの長方形の内部を描画する。 |
楕円 |
FillEllipse(ブラシ,x,y,w,h) |
指定したブラシを使って左上の点が(x,y)で幅がw,高さがhの長方形に内接する楕円の内部を描画する。 |
例題10−1 様々な図形を描画するプログラム
それでは、実際に様々な図形を描画するプログラムを作成します。
1.コントロールの配置とプロパティの設定
例題10−1という名前のプロジェクトを作成し、図10−1のようにボタンを一つ配置して下さい。次にボタンのプロパティを以下のように変更して下さい。
オブジェクト |
プロパティ |
設定値 |
Button1 |
Text |
描画 |
2. イベントハンドラを作成する
「描画」ボタンをダブルクリックしてイベントハンドラに以下のプログラムを記述して下さい。
このプログラムは、先ほど説明したとおり、
·
グラフィックスオブジェクト、ペン、ブラシを代入する為の変数を定義する
·
グラフィックスオブジェクトを作成する
·
ペンとブラシを作成する
·
グラフィックスオブジェクトの図形描画メソッドを使って図形の描画を行う
3.プログラムの実行と確認
プログラムを実行し描画ボタンをクリックすると図形が表示されることを確認して下さい(図10−2)。
10.3 文字の描画
グラフィックスコントロールには、図形だけでなく文字も描画することが可能です。文字を描画するには、DrawStringというメソッドを使います。DrawStringメソッドは以下の形式で記述します。
DrawString(文字列,フォント,ブラシ,x,y)
引数の意味は以下の通りです。
・
文字列:描画する文字列を表すString型のデータ。
・
フォント:文字列のフォントを指定する。
フォントもオブジェクトを使って具体的に様々な種類を指定することは可能ですが、フォントの名前を指定する必要があり、多少面倒なので本書では解説しません。フォームのFontプロパティで指定されたフォントをそのまま利用するには、この部分に
Me.Font と記述してください(Meはフォームのオブジェクトを表す予約語です)
・
ブラシ:文字の色を指定するブラシです。
・
座標:x、yで文字を描画する座標を指定します。(x、y)は、以下の図のように文字列の左上の座標を表します。
以下にいくつか練習問題をあげますので、各自チャレンジしてみてください。練習問題その2以降の答えは年末に私のウェブページに置く予定なので、できた方は各自答え合わせをしてください。
山本先生の練習問題
繰り返しに関する練習問題は、山本先生の情報コミュニケーションのウェブページ(http://www.edu.i.hosei.ac.jp/~yamamoto/a$jyohokomiI.htm)の練習問題を行ってください。
練習問題 その1
描画ボタンをクリックすると以下のような10個の円を描画するプログラムを作成せよ。プログラムは、描画ボタンをクリックしたときのイベントハンドラの部分は以下のようにし、
Dim i As Integer
For i = 1 To 10
円の描画(120, 120, i * 10)
Next
円の描画を行う部分は、円の描画という名前の以下のようなプロシージャを作成することで記述すること。
Public
Sub 円の描画(ByVal x As Integer, ByVal
y As Integer, ByVal r As Integer)
この部分に中心が(x,y)で半径がrの円を描画するプログラムを記述する
End
Sub
練習問題 その2
グラフィックスを使って、例題8−5に手を加え、以下のように成績のグラフを下に表示するプログラムを作成すること。
注:棒グラフは左から、国語(赤色)、算数(緑色)、理科(青)の順で描画すること
練習問題 その3
練習問題その2を変更し、折れ線グラフで点数を描画するプログラムに変更せよ(線の色は練習問題その2と同じで良い)
期末試験と試験範囲について
期末試験は、最終授業(1月8日)の授業内で行う予定です。試験範囲はプロシージャまでで、筆記試験と簡単なプログラムを実際に作るという問題を行う予定です。なお、資料の持ち込みは不可とします。
質問のメールなどは、sigesada@edu.i.hosei.ac.jpまでお願いします。
授業の資料の最新版はhttp://www.edu.i.hosei.ac.jp/~sigesada/にあります。