この電卓、ちょっと変ですね。よく見ると、=キーがありません。
12×3=を計算するとき、この電卓では12 Enter 3 × とキーを押します。日本語の「12と3を掛ける」によく似たキー操作になります。このような表し方を、逆ポーランド記法(RPN)と言います。
プログラム完成後に使ってみると、意外に便利なことが分かってもらえると思いますが、その便利さをちょっとだけ紹介しておきましょう。
(12+3)×(24−8)= のような式を普通の電卓で計算するにはちょっと大変です。この電卓では次のようにキーを押します。
12 Enter 3 + 24 Enter 8 − ×
(12と3を足して、24から8を引いて、そして掛ける)
なお、実習時間が十分とれない場合には次のキーを省略してもかまいません。後で追加することもできます。
また、選択教科などのように実習時間に余裕がある場合には、円の面積を求めるキーや消費税を求めるキーを作っても楽しいですね。あなただけのスペシャル電卓ができあがります。
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
作業の途中ですが、作成中のプログラムを保存しておきましょう。
いままでのプログラムと同じように、新しくフォルダをつくってそこに保存をしましょう。フォルダ名は分かりやすいものにしておきます。たとえば、「おもしろ電卓」とか「RPNCalc」とします。
プロジェクト名はProject1になっていますが、今回はRPNCalcと変更してみましょう。
フォームの名前は、既にRPNCalcとなっていますのでそのままでよいでしょう。
数字0〜9のボタン(CommandButton)をフォームに配置します。
はじめに0のボタンを作ります。
プロパティウインドウで次のように設定します。
オブジェクト名: cmdNum
Caption: 0
Fontサイズ(文字の大きさ): 12
1〜9のボタンは、ラベルのときのように0のボタンをコピー・貼り付けをして、コントロール配列にします。ボタンの表示(Caption)はすべて0になっていますので、貼り付ける位置(順番)を間違えないようにしてください。
左で配置しているボタンのオブジェクト名はcmdNum(5)です。数字の5の位置に置かれます。
数字ボタンの表示は、それぞれのボタンのプロパティウインドウでCaptionに数字を入力することで変更ができますが、つぎのところでコード(プログラム)で表示させる方法をとっています。
数字ボタンはすべて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 (オー、小文字)
文字の区切りにはスペースが必要
残りの各キーを下の例のようにフォームに配置します。
数値キーと同じようにコマンドボタン(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」します。必要に応じてフォントサイズを変更してください。
コードウインドウを開いて、オブジェクトを(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)に代入します。画面上では数値が下に移動します。
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 ×
いろいろな機能を持ったボタンを作成してみましょう。
コマンドボタンを貼り付け、それをダブルクリックして次のようなコードを書きます。
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
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 です。