Visual Basic 6.0 入門講座 |
第3回 プログラムの基本
今回は、基本的すぎて普通の本には書いてないようなことを解説します。ちらっと見て、当たり前だと思う人は時間の無駄なので読む必要はありません。
また、今回は具体的な話はでてきません。これから具体的なプログラミングに入る前の基礎固めのつもり読んでください。
1.プログラムは上から順に実行される
MOJI = "あいうえお"
MsgBox MOJI
という2行のプログラムがあったとします。意味は分からなくてもいいでしょう。しかし、この2行をコンピューターはどういう順番で実行するのでしょうか?
もちろん、常識通り上から順です。まず、MOJI = "あいうえお"が実行されて、次にMsgBox MOJIが実行されます。順番が違うと結果も変わってしまうのでこのことは重要です。
しかし、必要ならば実行する順番を変えるように指示することもできます。極端なことを言えば下から順番に実行させたりもできます。ただ、そういう指示を特にしない限りは原則通り上から順番です。
間違えやすい例をあげておきましょう。意味は分からなくても結構ですが、下のようなプログラムがあるとしましょう。
YourName = "ロビン"
If YourName = "ジャック" Then MsgBox "こんにちは、ジャック!"
YourName = "ジャック"
話を進めるために、このプログラムの説明をします。
1行目の YourName = "ロビン" は 「YourNameをロビンにしろ」という命令です。意味が分からない人は、赤ちゃんが産まれて名前を付ける場面を想像してください。「赤ちゃんの名前をロビンにする。」というような感じです。
2行目。If YourName = "ジャック" Then MsgBox "こんにちは、ジャック!" は 「もし YourName(名前)がジャックなら、”こんにちは、ジャック!”」と表示しなさい」という命令です。名前が「ジャック」じゃないときは何も起こりません。そうすると、1行目で、名前は「ロビン」にしていますから、この行では何も起こりません。
3行目。YourName = "ジャック" は 「YourNameをジャックにしろ」という命令です。1行目で「ロビン」とつけたはずですが、もう名前を変えてしまいました。
さて、問題です。このプログラムを実行すると、「こんにちは、ジャック!」と表示されるでしょうか?
考え方は2つあります。
1つは、「表示される。」とするものです。この場合は 3行目で YourName(名前)をジャックにしているので、2行目にある「もし YourName(名前)がジャックなら、・・・」にあてはまるから、「こんにちは、ジャック!」と表示される。というのが根拠でしょう。
しかし、残念ながらこれは不正解です。このプログラムを実行しても何も表示されません。理由はもうおわかりですか?確かに、3行目でYourName(名前)をジャックにしてますが、「もし YourName(名前)がジャックなら、”こんにちは、ジャック!”と表示しなさい」と書いてあるのは2行目です。プログラムは上から順に実行されていくので3行目で何が起こっても2行目は影響を受けないのです。
この話が当たり前だと思う人はきっとプログラム経験者でしょう?
なお、VB以外の言語でも、プログラムは上から順に実行されますが、このジャックの例では結果が異なる物もあります。私は中学生の時学校のパソコンで、似たようなプログラムを打ち込んで結果がBASICとちがくなるのでびっくりした経験があります。
2.重要な例外
「上から順に実行される。」と書いてすぐに例外の話をするのも変かも知れませんが、ことは重要です。
それから、この下で説明していることは重要ですが、一つ一つの命令の意味を今ここで覚える必要はありません。ここで解説をしているのは命令の意味が分からないと読む気がしないだろうと考えたからであって、ここで書いてある命令を覚えてもらおうと考えているわけではありません。
次のコード(プログラム)を見てください。
Private Sub Command1_Click()
MsgBox "ヤッホー"
End Sub
Private Sub Command2_Click()
MsgBox "無駄無駄無駄"
End Sub
初心者は見ただけでは意味わからないでしょうが、これはよくあるコード(プログラム)と言えます。
このプログラムは実行しても上から順番に実行されるわけではありません。そこが「Windowsプログラミング」の良いところです。
このプログラムでは、フォームにコマンドボタンが2つついていると仮定しています。1つはCommand1と言う名前で、もう一つはCommand2という名前です。では、Command2がクリックされたら何が起こるでしょうか?
Command2がクリックされると、まず、Private Sub Command2_Click() が実行されます。これが重要な例外なのです。一番上にあるPrivate Sub Command1_Click()ではなく、4行目にあるPrivate Sub Command2_Click()が実行されるのです。実行されると言ってもこの行は特に何もしません。この行は「Command2がクリックされたらここから実行しろよ〜」という目印なのです。そして、次は原則通りその下にある5行目のMsgBox "無駄無駄無駄"が実行されます。そろそろばれていたと思いますが、この行の意味は「無駄無駄無駄」と表示しろというものです。そして、その下、6行目のEnd Subが実行されます。これは「これ以上は実行するな」という意味です。だから、これより下に命令が書いてあった場合でもそれらはこの場合は実行されません。
しかし、End Subはプログラムを終了されるわけではありません。プログラムは次にコマンドボタンがクリックされるまで何もしないで待っていることになります。だから、もう一度Command2をクリックすれば、また「無駄無駄無駄」と表示されるし、Command1をクリックすれば「ヤッホー」と表示されます。
このように、VBは常に何かをしているのではなく、何かが行われるまで(たとえばクリック)じっと待っています。この行われる何かを「イベント」と言います。「イベント」は重要な言葉なので必ず覚えてください。
クリックはイベントの代表ですが、その他に ダブルクリック、マウスムーブ(マウスが動いた)、キープレス(キーボードを押した)など様々なものがあります。だから、我々プログラマーは マウスが動いたらこうしよう、キーボードが押されたらこうしよう、というようにプログラムしていくことになります。このようにイベントが発生したら何かするというプログラミングのことを「イベントドリブン」といいます。
今の説明でがっかりした人もいるでしょう。たとえば、ゲームを作りたいと思っている人です。だって、こちらがなにかしないかぎり、敵(モンスター)も何もしないというのではゲームになりませんからね。でもご安心。イベントには イニシャライズ(プログラムが始まった)、ターミネイト(プログラムが終了した)など、まだまだいろいろな物があります。これらを利用してゲームを作ることは何の問題もありません。(ゲームを作りたい人はこの点で心配することは何もありませんよ。実際VBで作られたゲームもなかなかの物です。プレステには及びませんが・・・)。
なお、その他のプログラムの順番を変えてしまう命令についてはおいおい説明します。
3.日本語も使える
詳(くわ)しくは書きませんが、VBのプログラミングでは一定の条件で日本語を使用することもできます。しかも漢字も大丈夫。しかし、かつてVB5でちょっとした問題が発生したり、他にも問題があるようなので日本語を使うことはおすすめしません。だいたい、日本語を使ったっていいことはほとんどないですからね。
4.コメント
滅多(めった)に使わないような命令、複雑な処理。プログラムが完成してしばらくたってから、自分のプログラムを見てみるとこのようなところはちんぷんかんぷんになってしまいます。たとえば、
K = StrPtr (MyString)
この命令は滅多に使用しません。後で見て分かるように説明を書いておきたいところです。そして、実際のところ説明を書いたりコメントを書いたりすることは簡単にできます。次のようにするだけです。
'MyStringのアドレスをKに代入
K = StrPtr (MyString)
このようにすれば、後から見たときにも思い出しやすいでしょう。もちろんコメント(説明)の部分は実行されません。だから、何を書いても大丈夫です。ただし、先頭に ' をつけてください。(この記号はシフトを押しながらキーボードの 7 を押す)。これがコメント(説明)の印です。VBはこれがあるとコメントと解釈してその行を無視します。また、コメントの行は緑色で表示されます。
それに、最終的(コンパイルするとき)にはコメントの部分は排除されるので、いくらコメントしても実行ファイルのサイズは大きくなりません。
本や雑誌のプログラムの例を見れば分かると思いますが、読む人にわかりやすいようにたくさんのコメントが載っています。自分でプログラムするときも適切なコメントは重要です。普段からコメントを入れる習慣を付けましょう。
5.行継続文字 ぎょうけいぞくもじ
私が考えるに、一番短い命令は プログラムを終了させる End という命令でしょう。同じ長さで Cls という命令もあります。しかし、長い命令は本当に長いのがあります。どのくらい長いのがあるか、ちょっとここに書いてみましょう。
Public Declare Function AccessCheckAndAuditAlarm Lib "advapi32.dll" Alias "AccessCheckAndAuditAlarmA" (ByVal SubsystemName As String, HandleId As Any, ByVal ObjectTypeName As String, ByVal ObjectName As String, SecurityDescriptor As SECURITY_DESCRIPTOR, ByVal DesiredAccess As Long, GenericMapping As GENERIC_MAPPING, ByVal ObjectCreation As Long, GrantedAccess As Long, ByVal AccessStatus As Long, ByVal pfGenerateOnClose As Long) As Long
今、みなさんの画面には4行くらいで表示されているんじゃないですか?でも、これ全部をVBでは1行で書かなくてはいけないのです。別に1行で書いても、4行で書いても書く手間は同じなのですが、こんなに長いと見にくいのです。あとから、どっかまちがってないかチェックするのも大変です。
そこで、行継続文字の登場です。行継続文字を使えば長い行を複数行に分けて書くことを許してもらえます。
たとえば、
If Form1.WindowState =1 Then Form1.Caption = "SLEEPING"
は、2行に分けて、
If Form1.WindowState =1 _
Then Form1.Caption = "SLEEPING"
としても大丈夫です。
ポイントは1行目の最後にある記号 _ です。(この記号はシフトを押しながら キーボードの「ろ」を押す)この記号で終わっている場合は次の行もその行の続きということになります。この記号を使う限り難行に分けても大丈夫です。
ただ注意してほしいのは行継続文字は「_」じゃないということです。実は「 _」なのです。何が違うか分かりますか? _ の前に一つ分のスペースがないとダメなのです。気をつけてくださいね。
6.つなげ文字
行継続文字とは逆で2つ以上の命令を1行で書くための文字「 : 」もあります。(つなげ文字というのは私が勝手に言っていることで本当のところ何というのかはしりません。)
たとえば、
Picture1.BackColor = VbRed
Me.Caption = "Red"
は、次のように1行で書いても大丈夫です。
Picture1.BackColor = VbRed : Me.Caption = "Red"
つなげ文字を使えばいくつ命令をつなげても大丈夫ですが、あまりメリットはありませんし、私はおすすめしません。「1行には命令1つ。」を守って見やすいプログラムをしましょう。