hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
COMDictionary/calc - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

COMDictionary

hsp3.png

Dictionaryオブジェクトを使った計算機

  • 変数と数値を使って2項演算ができます。
  • 変数に使える文字は半角英数字とアンダーバーです。
  • 変数の最初の文字に数字は使えません。
  • 数値は正数を指定します。
  • 負数、小数などは使えません。
  • イコールボタンの左側のボックスには代入先の変数名を指定します。
  • イコールボタンの右側のボックスにはオペランドを指定します。
  • 空白は数値のゼロと同様に扱います。

スクリプト

filev3com_000_CalcDic.hsp
Everything is expanded.Everything is shortened.
  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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;=====================================================================
;   Dictionaryオブジェクトを使った計算機                   for hsp3.0a
;
;   2006/01/15 ... kz3
;=====================================================================
 
/*------------------------------------------------------------------*
 * ◆ 画面設定                                                      *
 *------------------------------------------------------------------*/
*initializeScreen
    // 計算機画面
    screen 0, 400, 300, 4, ginfo_dispx/2-200, ginfo_dispy/2-150
    title "< ここに計算式と答えが表示されます >"
 
    // 変数ボックス(ID=0)
    symbol = ""
    input symbol, 100, 20, 63
 
    // 実行ボタン(ID=1)
    objsize 25, 20
    pos 100, 0: button "=", *calcurate
 
    // オペランドボックス(ID=2,3)
    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
 
    // 演算子ボックス(ID=4)
    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

コメント

  • うすあじさんところで宣言してしまいましたので近いうちにサンプル書きます。 -- kz3 2006-01-13 (金) 16:07:07
  • とりあえず出来ました。明日コード整理をして載せられると思います。 -- kz3 2006-01-14 (土) 18:33:52
  • 何度かアップ-削除を繰り返したので今一度最新版で動作確認お願いします。 -- kz3 2006-01-15 (日) 11:18:57
  • 負数を使えるようになりました。ただ処理の方は改善余地がありそうです。 -- kz3 2006-01-15 (日) 12:51:07
  • 負数は使えるようになったが正の符号のチェックが漏れて・・・「変数の管理」だから数値は正数だけでいいかなー! -- kz3 2006-01-15 (日) 13:15:30
  • というわけで6回くらい仕様変更しましたが、最初にもどって正数のみ指定可能にしました。ここで問題としていることはDictionaryオブジェクトの利用例ということで構文チェックは考えないでっと・・・。 -- kz3 2006-01-15 (日) 13:25:20

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filev3com_000_CalcDic.hsp
280件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:26:54 (2436d)