第11回 メソッドをつくるでつまづいています。

タグの編集
投稿者 初級者A  (社会人) 投稿日時 2009/1/22 04:53:24
第11回 「メソッドをつくる」でつまづいています

Dim CircleX As Integer = 150
Dim CircleY As Integer = 100 
Private Sub btnLeft_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLeft.Click

    CircleX -= 5

    DrawCircle(CircleX, CircleY)

End Sub
 
Private Sub btnRight_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRight.Click

    CircleX += 5

    DrawCircle(CircleX, CircleY)
※ここの部分ですが、引数がX,Yではない理由が理解できません。

※ DrawCircle(X, Y)ではダメなのでしょうか?

End Sub
 
Private Sub DrawCircle(ByVal X As Integer, ByVal Y As Integer)
※DrawCircleメソッドの引数がx、yになっているのでそう思ったのですが
 ちがのでしょうか?
    Dim g As Graphics = Me.CreateGraphics

    Dim b As New Drawing2D.LinearGradientBrush(New Point(X, Y), New Point(X + 50, Y + 50), Color.Yellow, Color.LightBlue)

    g.Clear(Color.Black)
    g.FillEllipse(b, X, Y, 50, 50)

End Sub
 よろしくお願いします。
投稿者 neptune  (社会人) 投稿日時 2009/1/22 06:56:10
こんにちは

私も、初心者のころ・・・って昔ですけど、同じ事を考えた記憶があります^ ^;;;

Visual Basic 言語の概念
引数の値渡しおよび参照渡し
http://msdn.microsoft.com/ja-jp/library/ddck1z30(VS.80).aspx
を読んでみては如何でしょうか?

ちょっと説明しておくと
(1)Private Sub DrawCircle(ByVal X As Integer, ByVal Y As Integer)
はInteger型の値X,Yを受け取り必要な処理をするプログラムです。

例えば、
(2)Private Sub DrawCircle(Byref X As Integer, Byref Y As Integer)
であれば、Integer型の値を参照するX,Yを受け取り必要な処理をするプログラムです。
X,Yという名前は
Private Sub ・・・・・
で任意に定義する事が出来ますから、この名前に固執する必要はありません。ただ任意に付けた
名前です。

実行するにはどちらも
DrawCircle(CircleX, CircleY)
で良いわけですが、
(1)で呼ぶ場合はCircleX, CircleYのデータのコピーの入っているメモリの場所(参照先)を渡します。
(2)で呼ぶ場合はCircleX, CircleYのデータの入っているメモリの場所(参照先)を渡します。
値渡しおよび参照渡しの違いは
先のサイトを見たほうが良いでしょう。

上記で紹介した所を見た上で更に疑問が出てきたら又、聞けばどうですか?
かなり、疑問は解消すると思いますよ。

でも、一番良いのは読みならが自分でサンプル書いてみて、実験するのが一番理解が早いと思います。

頑張ってね。
投稿者 るしぇ  (社会人) 投稿日時 2009/1/22 20:22:58
変数のスコープ(有効範囲)について覚えてみるのも良いかも。
[Visual Basic 中学校 > VB6 初級講座 > 第3回 変数を使う]
http://homepage1.nifty.com/rucio/main/shokyu/jugyou3.htm
> 5.適用範囲
[CavalierLab スコープ]
http://homepage1.nifty.com/CavalierLab/lab/vb/scope.html

X,Y はプロシージャ(関数) DrawCircle 内でのみ使えます。

以下、余談ですが、
> Private Sub DrawCircle(ByVal X As Integer, ByVal Y As Integer)
X,Y を CircleX, CircleY に変更しても正常に動きます。、
でも、この時の引数の CircleX, CircleY は
> Dim CircleX As Integer = 150
> Dim CircleY As Integer = 100
とは別のものが用意されます。つまりコードの意味としては X,Y 
を使ったときと同じです。

混乱するので、モジュールレベルの変数名とプロシージャレベルの
変数名は、かぶらないようにしましょう。
投稿者 初級者A  (社会人) 投稿日時 2009/1/23 05:57:47
引数は、何となくわかるのですが、いまひとつストンと落ちません。

これでも他のプログラムを模倣していろいろなゲームを作ってきましたが、(作れてきましたが)
基礎から取り組んで行くと分からないことばかりで唖然としています。
今はコードをみると拒絶反応をおこすような精神状態なので、しばらくVBからは離れて
見ようと思ってます。しばらくするとまた、VBやりたくなると思います。
そのときはまたよろしくお願いします。

投稿者 初級者A  (社会人) 投稿日時 2009/1/24 04:39:16

つまらぬことを書きすみません。
書店にいってVB関連の本を読みあさってきました。私が理解しかねていたことは
メソッドの実引数と仮引数のことでした。実際に、簡単なメソッドを作って動作を
確かめようと考えています。
また、アドバイスよろしくお願いします。