Visual Basic学習用テキスト4 「おもしろ電卓」

戻る  相談コーナー(掲示板)


4 おもしろ電卓 RPN Calc を作ろう

 この電卓、ちょっと変ですね。よく見ると、=キーがありません。

 12×3=を計算するとき、この電卓では12 Enter 3 × とキーを押します。日本語の「12と3を掛ける」によく似たキー操作になります。このような表し方を、逆ポーランド記法(RPN)と言います。

 プログラム完成後に使ってみると、意外に便利なことが分かってもらえると思いますが、その便利さをちょっとだけ紹介しておきましょう。
 (12+3)×(24−8)= のような式を普通の電卓で計算するにはちょっと大変です。この電卓では次のようにキーを押します。
  12 Enter 3 + 24 Enter 8 − ×
  (12と3を足して、24から8を引いて、そして掛ける)

 なお、実習時間が十分とれない場合には次のキーを省略してもかまいません。後で追加することもできます。

 また、選択教科などのように実習時間に余裕がある場合には、円の面積を求めるキーや消費税を求めるキーを作っても楽しいですね。あなただけのスペシャル電卓ができあがります。

4−1 フォームの設計(1)

 Visual Basicを起動させたら、新しいプロジェクトで標準.EXEを指定します。

 フォームが表示されたら、右側にあるプロパティウインドウで、オブジェクト名をRPNCalcに、Caption(キャプション:見出し)をRPN Calcと変更します。変更方法は、それぞれの場所をマウスでクリックしてからキーボードから入力します。Captionは見出しですので、日本語をつかっても結構です。

 画面左にあるツールボックスでLabel(ラベル)をクリックし、フォームRPNCalc上でドラッグ(マウスの左ボタンを押しながら動かす操作)して貼り付けます。このラベルは、はじめの操作例にあるYの右に位置するものです。なお、ここに3つのラベルを貼り付けますが、一番下の位置から作ります。

  

 ラベルの大きさや位置はいつでも変更ができます。ここをクリックすると、図のような四角が現れますので、マウスでドラッグすれば大きさを変更できます。

 プロパティウインドウで次の項目を変更しておきます。

オブジェクト名: Y
Alignment(文字の表示位置): 右揃え
Font(フォント): MSゴシック
Fontサイズ(文字の大きさ): 12

 Alignmentの変更は、ここをクリックすると右にボタン▼が現れますので、これをクリックすると、次のように候補が出ます。その中から1−右揃えを選択します。

 Fontサイズの変更は、Fontをクリックすると同じようにボタンが出ますので、これをクリックすると、フォント設定のダイアログボックスが開きます。その中のフォントをMSゴシックに、サイズを12にします。なお、下の例ではMSPゴシックになっていますが、MSゴシックに変更します。

 以上で1つ目のラベルの設定が終わりました。

 残り2つはこのラベルをコピー・貼り付けしてやれば簡単です。

 まず、コピーするラベル(Y:画面上ではCaptionが表示されていますのでLabel1となっています)上でマウスの右ボタンを押します。ポップアップメニューが開きますので、その中のコピーを選択(左ボタンを押す)します。
 そして、同じフォーム(RPNCalc)上で右ボタンを押し、現れたポップアップメニューから貼り付けを選択します。
 「既に同じ名前のコントロール'Y'があります。コントロール配列にしますか?」と出ますので、はい(Y)を選択します。

 フォームの左上にラベルが貼り付けられていることを確認してください。
 このラベルをマウスで次のように移動します。これはドラッグアンドドロップという操作で、左ボタンを押しながら移動してボタンをはなします。
 必ず最初に作ったラベルの上に配置してください。位置を間違えるとプログラム実行時に表示がおかしくなります。

 同じように、もう一つラベルを貼り付けて、位置をそろえてください。今度は、コントロール配列にするか聞いてきませんが、コントロール配列となります。

参考

コントロール配列とは何か、気になるところです。プロパティウインドウのオブジェクト名(ラベルを指し示す名前)を見てください。それぞれ、下のラベルからY(0),Y(1),Y(2)となっているはずです。このように名前の後に添え字をつけて表す方法を配列といいます。
これらのラベルのオブジェクト名は、コントロール配列を使わずにY,Z,Tなどとしてもよいのですが、コードを書くときに便利であることに気がつくと思います。(For 〜 Next)

 次に、ラベルの下にテキストボックスを配置します。

 プロパティウインドウで次のように設定します。
 上のラベルと異なる点は、オブジェクト名とMultiLineの設定です。MultiLineをTrueにしないと、文字の表示位置が右揃えになりません。
 なお、このテキストボックスは一つだけですので、コントロール配列にはなりません。

オブジェクト名: X
MultiLine: True
Alignment(文字の表示位置): 右揃え
Font(フォント): MSゴシック
Fontサイズ(文字の大きさ): 12

4−2 プログラムの保存

 作業の途中ですが、作成中のプログラムを保存しておきましょう。

 いままでのプログラムと同じように、新しくフォルダをつくってそこに保存をしましょう。フォルダ名は分かりやすいものにしておきます。たとえば、「おもしろ電卓」とか「RPNCalc」とします。
 プロジェクト名はProject1になっていますが、今回はRPNCalcと変更してみましょう。
 フォームの名前は、既にRPNCalcとなっていますのでそのままでよいでしょう。

4−3 フォームの設計(2)

 数字0〜9のボタン(CommandButton)をフォームに配置します。

 はじめに0のボタンを作ります。

 プロパティウインドウで次のように設定します。

オブジェクト名: cmdNum
Caption: 0
Fontサイズ(文字の大きさ): 12

 1〜9のボタンは、ラベルのときのように0のボタンをコピー・貼り付けをして、コントロール配列にします。ボタンの表示(Caption)はすべて0になっていますので、貼り付ける位置(順番)を間違えないようにしてください。
 左で配置しているボタンのオブジェクト名はcmdNum(5)です。数字の5の位置に置かれます。

  

 数字ボタンの表示は、それぞれのボタンのプロパティウインドウでCaptionに数字を入力することで変更ができますが、つぎのところでコード(プログラム)で表示させる方法をとっています。

4−4 数字ボタンの表示を設定するコードを書く

 数字ボタンはすべて0になっていますが、実行時にはこのボタンに数字を表示させます。

 フォーム上で空いているところ(ボタンやラベルなどがないところ)で、マウスをダブルクリックしてください。コードウィンドウが開き、Private Sub Form_Load()とEnd Subが自動的に表示されますので、次のようにコードを書いてください。
 なお、ラベルY( )とテキストボックスXの表示もここで変更します。

Private Sub Form_Load() 'プログラムの起動時に実行
  Dim i As Integer
  For i = 0 To 9
    cmdNum(i).Caption = i '数字ボタンの表示を0〜9
  Next i
  For i = 0 To 2
    Y(i).Caption = 0 'ラベルYの表示を0
  Next i
  X.Text = "" 'テキストボックスXの表示なし
End Sub

解説

Form_Loadとは、フォーム(RPNCalc.frm)がメモリーに読み込まれたときを意味していますが、プログラムが実行されたときのことです。(プログラムが実行されたとき、フォームがメモリー上に読み込まれる)したがって、プログラムを実行させたとき、最初に処理させたい内容をここに書きます。
For 〜 Next(フォー〜ネクスト) は繰り返し実行(ループ)させるときに使います。
For i = 0 To 9 は、i が0から9まで1ずつ増加する間に、Nextまでの間にある文を実行します。この場合は10回繰り返し実行します。

ラベルとコマンドボタンの表示はCaptionが、テキストボックスの表示にはTextが使われます。これらはデザイン時にプロパティで設定する他に、実行時にコードからも変更できます。

プログラムの実行と動作の確認

 プログラムを実行させて確認してください。次のようになりましたか。
 この段階で数字キーを押しても何も起きません。

よくある入力間違い

i (アイ)と l (エル)、1 (数字のいち)
0 (数字のゼロ)と O (アルファベットのオー、大文字)、o (オー、小文字)
文字の区切りにはスペースが必要

4−5 フォームの設計(3)

 残りの各キーを下の例のようにフォームに配置します。

 数値キーと同じようにコマンドボタン(CommandButton)を貼り付けていきますが、すべてオブジェクト名を異なる名前にしますので、ヒントロール配列にはなりません。

 それぞれのボタンを選択(クリック)して、プロパティを変更します。

オブジェクト名: cmdTen
Caption: .
オブジェクト名: cmdEnter
Caption: Enter
オブジェクト名: cmdWaru
Caption: ÷   (日本語入力で「わる」で変換)
オブジェクト名: cmdKakeru
Caption: ×
オブジェクト名: cmdHiku
Caption: −
オブジェクト名: cmdTasu
Caption: +
オブジェクト名: cmdClr
Caption: C
オブジェクト名: cmdAllClr
Caption: AC
オブジェクト名: cmdPM
Caption: +/-
オブジェクト名: cmdRev
Caption: 1/X
オブジェクト名: cmdCngXY
Caption: X⇔Y     (⇔は記号にあります)
オブジェクト名: cmdX2
Caption: X^2
オブジェクト名: cmdSqr
Caption: √X     (√は記号にあります)
オブジェクト名: cmdYX
Caption: Y^X

 ラベル(Y(0))とテキストボックス(X)の左にラベルを貼り付けて、それぞれのCaptionを「Y」と「X」します。必要に応じてフォントサイズを変更してください。

4−6 コードの入力(2)

 コードウインドウを開いて、オブジェクトを(General)にプロシージャーを(Declarations)にして、dim Mode as integer と入力します。なお、Mode 以外はキーワードですので、すべて小文字で入力してもかまいません。

 ここで宣言された変数は、このフォーム上であればどこからでも使えます。複数のオブジェクトのプロシージャー(ここでは Sub xxx)に書かれていることを確認できます。
 なお、変数Modeは数字キーが押されたときの制御(処理内容の分岐)に使われます。

 それぞれのボタンをダブルクリックするとコードウインドウが開きますので、コードを入力します。実行時にそれぞれのボタンが押されたとき、処理する内容を記述しておきます。

このキーは、どれをダブルクリックしても結構です。Indexで識別します。

Private Sub cmdNum_Click(Index As Integer)
  Dim i As Integer ' 変数iを整数型で宣言
  Select Case Mode
  Case 0 ' Modeが0のとき
    For i = 2 To 1 Step -1
      Y(i).Caption = Y(i - 1).Caption
    Next i
    Y(0).Caption = Val(X.Text)
    X.Text = ""
  Case 2 ' Modeが2のとき(直前にEnterが押された)
    X.Text = ""
  End Select
  X.Text = X.Text & Trim(Str(Index))
  Mode = 1 ' Modeが1のときは数値入力中
End Sub

解説

Dim i As Integerで宣言されたiは、この中(Private Sub cmdNum_Click(Index As Integer))だけで有効です。他のSubで使われているiに影響を与えません。一方、変数Modeは(General)・(Declarations)で宣言されているため、フォームのどこからでも参照・変更ができます。

Y( )はラベルの名前(オブジェクト名)、Xはテキストボックスの名前です。

Select Caseは分岐(条件判断)に使われます。
これはIf 〜 Then で書くことも可能です。
  If Mode = 0 Then         ' Modeが0のとき文を実行
    文
  End If

For i = 2 To 1 Step -1 は、i が2でNext i までの文を実行し、次にi を1減らして(Step -1) Next i までの文を1になるまで(To 1)繰り返し実行します。

Val(文字列)は、文字列に含まれる数字(文字)を数値に変換します。

Str(数値)は、数値を文字列に変換します。正の数のときは先頭に空白文字が、負の数のときには−(マイナス)がつきます。

Trim(文字列)は、文字列の前後にある空白文字(スペース)を取り除きます。

& は、文字列と文字列を結合(つなぎ合わせる)します。

Private Sub cmdTen_Click()
  Dim i As Integer
  Select Case Mode
  Case 0
    For i = 2 To 1 Step -1
      Y(i).Caption = Y(i - 1).Caption
    Next i
    Y(0).Caption = Val(X.Text)
    X.Text = ""
  Case 2
    X.Text = ""
  End Select
  X.Text = X.Text & "."
  Mode = 1
End Sub

解説

数字キーが押されたときとほとんど同じ処理です。コピー・貼り付けを利用すれば簡単にできあがります。
Private Sub cmdNum_Click(Index As Integer)の下(つまりDim i As Integer)からEnd Subの上(つまりMode = 1)までをマウスでドラッグして範囲指定をします。範囲指定はこのコードウインドウの左端で行うと行単位の指定になり、選択された部分は反転表示されます。そして、マウスの右ボタンを押してコピーを選択します。次にPrivate Sub cmdTen_Click()の下でマウスをクリックして貼り付け位置を指定します。マウスの右ボタンを押し貼り付けを選択します。
X.Text = X.Text & Trim(Str(Index))をX.Text = X.Text & "."と変更すれば出来上がりです。
 以下、同じような文が出てきます。そのときはコピー・貼り付けを活用しましょう。コピー・貼り付けは行単位ばかりでなく、単語単位でも可能です。

Private Sub cmdEnter_Click()
  Dim i As Integer
  For i = 2 To 1 Step -1
    Y(i).Caption = Y(i - 1).Caption
  Next i
  Y(0).Caption = Val(X.Text)
  Mode = 2
End Sub

Private Sub cmdWaru_Click()
  Dim i As Integer
  X.Text = Val(Y(0).Caption) / Val(X.Text)
  For i = 0 To 1
    Y(i).Caption = Y(i + 1).Caption
  Next i
  Mode = 0
End Sub

解説

四則演算はほとんど同じ処理です。コピー・貼り付けが活躍します。

Private Sub cmdKakeru_Click()
  Dim i As Integer
  X.Text = Val(Y(0).Caption) * Val(X.Text)
  For i = 0 To 1
    Y(i).Caption = Y(i + 1).Caption
  Next i
  Mode = 0
End Sub

Private Sub cmdHiku_Click()
  Dim i As Integer
  X.Text = Val(Y(0).Caption) - Val(X.Text)
  For i = 0 To 1
    Y(i).Caption = Y(i + 1).Caption
  Next i
  Mode = 0
End Sub

Private Sub cmdTasu_Click()
  Dim i As Integer
  X.Text = Val(Y(0).Caption) + Val(X.Text)
  For i = 0 To 1
    Y(i).Caption = Y(i + 1).Caption
  Next i
  Mode = 0
End Sub

Private Sub cmdClr_Click()
  X.Text = ""
End Sub

Private Sub cmdAllClr_Click()
  Dim i As Integer
  For i = 0 To 2
    Y(i).Caption = 0
  Next i
  X.Text = ""
  Mode = 0
End Sub

Private Sub cmdPM_Click()
  X.Text = -Val(X.Text)
  Mode = 0
End Sub

Private Sub cmdRev_Click()
  X.Text = 1 / Val(X.Text)
  Mode = 0
End Sub

'XとYを交換する
Private Sub cmdXYRev_Click()
  Dim b As String      '変数bを文字列型で宣言する
  b = Y(0).Caption
  Y(0).Caption = X.Text
  X.Text = b
  Mode = 0
End Sub

'Xの2乗
Private Sub cmdX2_Click()
  X.Text = Val(X.Text) ^ 2
  Mode = 0
End Sub

'Xの平方根
Private Sub cmdSqr_Click()
  X.Text = Sqr(Val(X.Text))
  Mode = 0
End Sub

解説

Sqr( )は平方根を求める関数です。

'YのX乗
Private Sub cmdYX_Click()
  Dim i As Integer
  X.Text = Val(Y(0).Caption) ^ Val(X.Text)
  For i = 0 To 1
    Y(i).Caption = Y(i + 1).Caption
  Next i
  Mode = 0
End Sub

解説

四則演算と同様に、YとXを使った計算ではY(0)が使われますので、Y(1)をY(0)に、Y(2)をY(1)に代入します。画面上では数値が下に移動します。

4−7 使ってみよう

 1+2=3
   1 Enter 2 +

 3−4=−1
   3 Enter 4 −

 −5+6=1
   5 +/− 6 +

 7×8=56
   7 Enter 8 ×

 9÷10=0.9
   9 Enter 10 ÷

 (11+12)×13=299
   11 Enter 12 + 13 ×

 14×(15−13)=28
   14 Enter 15 Enter 13 − ×

 (12+3)÷(13−5)=1.875
   12 Enter 3 + 13 Enter 5 − ÷

 底辺5cm、高さ8cmの三角形の面積 20
   5 Enter 8 ×  2 ÷

 半径5cmの円の面積 78.5
   3.14 Enter 5 X^2 ×

4−8 機能追加のヒント

 いろいろな機能を持ったボタンを作成してみましょう。

π(定数入力の例)

 コマンドボタンを貼り付け、それをダブルクリックして次のようなコードを書きます。

Dim i As Integer      ' 変数iを整数型で宣言
For i = 2 To 1 Step -1
  Y(i).Caption = Y(i - 1).Caption
Next i
Y(0).Caption = Val(X.Text)
X.Text = 3.14159265359
Mode = 0

円の面積(単項演算子としての例)

 Xレジスタ(X.Text)だけを使う1/XやX^2と同じようにコードを書きます。

X.Text = 3.14159265359 * Val(X.Text) ^ 2
Mode = 0

三角形の面積(2項演算子の例として)

 Xレジスタ(X.Text)とYレジスタ(Y(0).Caption)を使う四則演算を参考にします。

Dim i As Integer
X.Text = Val(Y(0).Caption) * Val(X.Text) / 2
For i = 0 To 1
  Y(i).Caption = Y(i + 1).Caption
Next i
Mode = 0

合計・平均・データ数を求める統計ボタンΣ(特殊なボタンの例)

 はじめにACボタンを押し表示をクリアして、データを入力してこのボタンを押せばYレジスタ(Y(0).Caption)に合計値、その上に平均値とデータ数を表示します。

Y(0).Caption = Val(Y(0).Caption) + Val(X.Text) '合計
Y(2).Caption = Val(Y(2).Caption) + 1 'データ数
Y(1).Caption = Val(Y(0).Caption) / Val(Y(2).Caption) '平均
Mode = 2

フォームの大きさを固定するには

 実行時のフォームの大きさは、自由に変更できるようになっています。フォームの大きさを固定するとともに、右上にある最大化ボタンと最小化ボタンを消しておきましょう。
 フォームのプロパティーウインドウでBorderStyle(ボーダースタイル:境界線のスタイル)をクリックし、右に現れた▼ボタンを押して「1−固定(実線)」を選択します。

参考文献

HP−42S取扱説明書(横河・ヒューレット・パッカード株式会社)

戻る  相談コーナー(掲示板)

このページの最終更新日は 99/10/15 です。