(ほとんど変わらず、Excelマクロの初級レベル・・・)
大した勉強もせず、今度は仕事で使用する「通常の計算+α機能」のある
電卓に無謀にもチャレンジ中です。
(+αと言っても、ボタンを押すとあらかじめ登録してある計算方法が採用される
程度のものです)
電卓の通常機能としては、世にあるプログラム電卓?みたいな、
操作すると、それが計算結果だけでなく、式が液晶に出る電卓・・・
ああ言うのを作りたい・・・と思っています。
例えば「1+2=3」を計算した場合、普通の電卓だと液晶部には、「1」と「2」と「3」
という風に数字だけ表示されますが、これを「1+2」と表示し、「=」などを押すと、
ans部分に「3」が出る・・・という電卓です。
(「=」前なら、途中で式を直せば、直した式で計算するというもの)
EditBoxなどに入力した式で計算すると、算術式「+ - * / () 」 などの順番
をプログラムするのが、超初心者の僕では、理解不能だったので、
いろいろ調べると、以前の記述でこれがありました。
http://www.activebasic.com/forum/viewtopic.php?t=1650
内容的には、MainWndに、Editbox1とStatic1とCommandButton1があり、
EditBox1に式を入力して、ボタンを押すと、Static1に答えが出る・・・
と書かれています。
(例題式は、「10+2*3」で、ラベルに16が書かれる)
そのままコピペしてデバッグで実行してみると、最初の"+"の所で、
Function.spbの366行目の「Function Asc」の所で、「アクセス違反がありました」
として止まってしまいます。
(実行時に入力した式も、例題のまま「10+2*3」で実施)
この計算(カッコや+-*/)が出来ないと、電卓としてはつらいかと思い、
奮闘してますが、よく(いや、全く・・・)わからずです。
以前の記述でも、これを参照している人がいて、動かない・・・とレスあった後、
解決しました・・・だけで解決してしまって(うらやましい・・・)いた為、何をどうすれば
いいか・・・。
上記アドレスからコピペしてコードの記述場所などがおかしいのか・・・とも思い、
今回チェック・ご教授頂きたく、どなたか教えて下さい。
もしくは、何かが足らないのか、間違ってるか・・・すみませんが教えて下さい。
[ここをクリックすると内容が表示されます]
ちなみに、お時間ある方、若干解説頂けると助かります。コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
test_DestroyObjects()
PostQuitMessage(0)
End Sub
Dim s[1024] As Byte
Dim s_end As Long
Dim s_i As Long
Dim c As Byte
Function read_s() As Byte
If s_end <= s_i then
read_s = 0
Else
read_s = s[s_i]
s_i++
End If
End Function
Sub MainWnd_CommandButton1_Click()
Dim ans As Long
Dim ansStr[100] As Byte
s_end = GetWindowText( GetDlgItem( hMainWnd, EditBox1), s, 1024 )
debug
s_i = 0
c = read_s()
ans = expr()
lstrcpy( ansStr, Str$(ans) )
SetWindowText( GetDlgItem( hMainWnd, Static1), ansStr )
End Sub
Function expr() As Long
Dim d1 As Long
Dim d3 As Long
d1 = term()
If c = Asc("+") Then
c = read_s()
d3 = expr()
Return (d1 + d3)
ElseIf c = Asc("-") Then
c = read_s()
d3 = expr()
Return (d1 - d3)
Else
Return (d1)
End If
End Function
Function term() As Long
Dim d2 As Long
Dim d1 As Long
Dim d3 As Long
If c = Asc("(") Then
c = read_s()
d2 = expr()
c = read_s()
Return (d2)
ElseIf Asc("1") <= c And c <= Asc("9") Then
d1 = num()
If c = Asc("*") Then
c = read_s()
d3 = term()
Return (d1 * d3)
ElseIf c = Asc("/") Then
c = read_s()
d3 = term()
Return (d1 / d3)
Else
Return (d1)
End If
End If
End Function
Function num() As Long
Dim v As Long
v = 0
while Asc("0") <= c And c <= Asc("9")
v *= 10
v += c- Asc("0")
c = read_s()
Wend
Return (v)
End Function
もうしわけありませんが、よろしくお願いします。
(Windows2000、ABバージョンは4.24です)
尚、会社のPCしか保有していないので、変事などは明日・・・になってしまう
事をご了承頂いた上で、ヘルプをお願い致します。