1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
|
|
*initializeScreen
screen 0, 400, 300, 4, ginfo_dispx/2-200, ginfo_dispy/2-150
title "< ここに計算式と答えが表示されます >"
symbol = ""
input symbol, 100, 20, 63
objsize 25, 20
pos 100, 0: button "=", *calcurate
opstr = "", ""
dup Loperand, opstr.0
dup Roperand, opstr.1
pos 125, 0: input Loperand, 100, 20, 63
pos 300, 0: input Roperand, 100, 20, 63
operator = "+ 加算\n- 減算\n* 乗算\n/ 除算\n"
operator += "\\ 除余算\n& 論理積\n| 論理和\n^ 排他論理積"
opChar = "+","-","*","/","\\","&","|","^"
objsize 75, 20
pos 225, 0: combox selop, 100, operator
// 変数リストビュー(ID=5)
gosub *createListView
// 計算用
dim opval, 2
dup Lop, opval.0
dup Rop, opval.1
// Dictionaryオブジェクトの作成
newcom dc, "Scripting.Dictionary" ; COM変数の初期化
comres comret ; COMreturn value
dc("compareMode") = 0 ; 完全一致検索
stop
/*------------------------------------------------------------------*
* ◆ 計算実行(メイン) *
*------------------------------------------------------------------*/
*calcurate
// 変数名と数値のチェック
chkerr = 0: gosub *checkInput
if chkerr = 1: title errmsg: stop
// 辞書を検索してオペランドの値を取得
gosub *searchDictionary
// 演算
switch selop
case 0: ans = Lop + Rop: swbreak
case 1: ans = Lop - Rop: swbreak
case 2: ans = Lop * Rop: swbreak
case 3: if Rop=0: ans = 0: else: ans = Lop / Rop
swbreak
case 4: if Rop=0: ans = Lop: else: ans = Lop \ Rop
swbreak
case 5: ans = Lop & Rop: swbreak
case 6: ans = Lop | Rop: swbreak
case 7: ans = Lop ^ Rop
swend
// 左辺に代入
dc("item",symbol) = ans
// 計算式の表示
title "" + Lop + " " + opChar.selop + " " + Rop + " = " + ans
// 変数リストの更新
key = symbol: value = "" + ans
gosub *putListView
stop
/*------------------------------------------------------------------*
* ◆ 入力ボックスの内容チェック *
*------------------------------------------------------------------*/
*checkInput
// 左辺の変数名のチェック
if symbol=""{
errmsg = "左辺に変数名を指定してください."
chkerr = 1: return
}
repeat strlen(symbol)
c = peek(symbol,cnt)
if ((c>='a' & c<='z') | (c>='A' & c<='Z') | (c='_'))=0{
if (c>='0' & c<='9'){
if cnt=0{
errmsg = "変数名の先頭は半角英字を使ってください -> " + symbol
chkerr = 1: break
}
}else{
errmsg = "変数名には半角英数字を使ってください -> " + symbol
chkerr = 1: break
}
}
loop
if chkerr = 1: return
// オペランドの変数名と数値のチェック
repeat 2
alphabet = 0: number = 0
sample = opstr.cnt
repeat strlen(sample)
c = peek(sample, cnt)
if (c>='a' & c<='z') | (c>='A' & c<='Z') | (c='_'){
alphabet = 1
}else{
if (c>='0' & c<='9'){
number = 1
}else{
errmsg = "変数名には半角英数字を使ってください -> " + sample
chkerr = 1: break
}
}
loop
if (alphabet & number){
c = peek(sample, 0)
if (c>='0' & c<='9'){
errmsg = "変数名の先頭は半角英字を使ってください -> " + sample
chkerr = 1
}
}
if chkerr = 1: break
loop
return
/*------------------------------------------------------------------*
* ◆ 辞書から値を取得 *
*------------------------------------------------------------------*/
*searchDictionary
// 左辺のチェック
dc->"exists" symbol
if comret = 0{
// 辞書に登録されていなければ登録する
dc->"add" symbol, 0
key = symbol: value = "" + dc("item",symbol)
gosub *putListView
}
// オペランドのチェック
repeat 2
fmt = "%0"+strlen(opstr.cnt)+"d"
if opstr.cnt = strf(fmt, int(opstr.cnt)){
opval.cnt = int(opstr.cnt)
}else{
if opstr.cnt = ""{
opval.cnt = 0: continue
}
dc->"exists" opstr.cnt
if comret ! 0{
// 辞書から値を取り出す
opval.cnt = dc("item",opstr.cnt)
}else{
// 辞書に変数を登録する
dc->"add" opstr.cnt, 0
key = opstr.cnt: value = "" + dc("item",opstr.cnt)
gosub *putListView
}
}
loop
return
/*------------------------------------------------------------------*
* ◆ リストビューの作成 *
*------------------------------------------------------------------*/
*createListView
#define LVM $1000
pos 0, 20
winobj "SysListView32", "", $00000200, $50000001, 400, 280, 0, 0
hview = objinfo(stat, 2)
// comctl.dll ver4.70以上でグリッド有効
sendmsg hview, LVM+54, 0, 1
colttl = "変数名": varttl = "値"
dim lvc, 6
lvc = $000F, 0, 150, varptr(colttl), 0, 0
sendmsg hview, LVM+27, 0, varptr(lvc)
lvc = $000F, 0, 250, varptr(varttl), 0, 1
sendmsg hview, LVM+27, 1, varptr(lvc)
// 項目挿入用変数
key = "": value = ""
dim lvi, 9: lvi.0 = $0001
dup lvi_item, lvi.1
dup lvi_subitem, lvi.2
dup lvi_text, lvi.5
// 検索用変数
dim lvf, 6: lvf.0 = $0002
dup lvf_psz, lvf.1
return
/*------------------------------------------------------------------*
* ◆ リストビューの更新 *
*------------------------------------------------------------------*/
*putListView
// リストビューから該当変数名の位置を検索する
lvf_psz = varptr(key)
sendmsg hview, LVM+13, -1, varptr(lvf)
index = stat
if index = -1{
if itemcnt = $FFFF{
dialog "変数が多すぎてこれ以上リストビューに表示できません.", 1 ,"警告"
return
}
// 項目を挿入する
lvi_item = itemcnt: lvi_subitem = 0
lvi_text = varptr(key)
sendmsg hview, LVM+7, 0, varptr(lvi)
lvi_subitem = 1
lvi_text = varptr(value)
sendmsg hview, LVM+6, 0, varptr(lvi)
itemcnt++
}else{
// 項目を更新する
lvi_item = index
lvi_subitem = 1
lvi_text = varptr(value)
sendmsg hview, LVM+6, 0, varptr(lvi)
}
return
|