HSPエラー33 「オブジェクト数が多すぎます」

HSP(Hot Soup Processor)のエラーメッセージ「HSP Error」(HSP内部エラー)エラー番号は「33」。エディタ上のコンパイル実行では『オブジェクト数が多すぎます』のメッセージ。実行ファイルでのエラーメッセージは『内部エラーが発生しました(33)』。

HSPが標準でサポートする各種GUIオブジェクト、ボタン(button命令)、チェックボックス(chkbox命令)、入力ボックス(input命令)、 メッセージボックス(mesbox命令)、リストボックス(listbox命令)、コンボボックス(combox命令)、の設置数が 1,024個に達した時点で表示されるエラーです。
 また、Win32 API関数のCreateWindowEx関数を内部で呼び出すwinobj命令によるコントロールの設置もカウント対象 です。

1,000個を超えるオブジェクトを意識して設置してる

1,024個というのはあくまで1ウィンドウ上での制限になります。screen命令やbgscr命令でウィンドウを複数 用意すれば、一応1プログラム内で数千個のオブジェクトを用意できることになります。

ただ、1ウィンドウ内にオブジェクトを1,000個近くも故意に表示させてるというのは異常と言えます。多くて 2ケタ数というのが普通でしょう。プログラムを利用するユーザーの立場からすれば、ユーザビリティに 支障が出てきてもおかしくないUI(ユーザーインターフェイス)なので、作り直しをお勧めします。

ちなみに、1ウィンドウ内でオブジェクトがどのくらい設置されてるかは、HSPのBMSCR構造体の「objmax」(72) から取得できます。ただ、clrobj命令の処理分は差し引きされません。(参照、BMSCR構造体についてはぷまさん

//	オブジェクト設置数カウント

	mref BMSCR, 67

	repeat
		chkbox "", a
		wait 1

		title ""+BMSCR.72
	loop

なお、「objlimit」(73)がその制限数なので、いじろうと思えばいじれます。(Max. 16,384個まで)

1,000個を超えるオブジェクトなぞ設置してない

このオブジェクト多すぎHSPエラーでもっとも多い発生理由がこれでしょう。「自分はそんな大量のオブジェクトは 表示させてない!」という人です。

「gotoループ」や「repeat〜loopループ」になっており、その中でオブジェクトの表示位置を指定するpos命令の 存在がポイントです。見た目には表示数は増えてないわけですが、オブジェクトの真上に同じオブジェクトがどんどん 重なって設置されていきます。

//	オブジェクト大量設置・・・

	repeat
		pos 100, 100

		chkbox "", a

		chkbox "", b

		wait 50
	loop

また、下のような実質ループのような処理でもそうです。スクリプトの先頭付近に「*main」という名前のラベルを 用意して、いろいろな処理を行った後に、常にそのラベルへとジャンプする処理を書いてしまう人に多いです。

//	ボタンを押すたびにボタンがどんどん増えていく・・・
*main

	pos 100, 100
	button "あ", *jump

	stop

*jump
;	〜 いろいろな処理 〜

	goto *main

オブジェクトを複数個設置してることに気づいてない人にとっては、たとえば、オブジェクトの内容(表示文字列)を objprm命令でいざ変更しようとすると、対象となるオブジェクトIDをミスることになるため、「objprm命令が機能しない」 と勘違いすることになります。(実際には重なったオブジェクトのうちの最も下に設置されたオブジェクトが書き換わってるワケ)

ちなみに、cls命令を使ってオブジェクトを削除(撤去)する人がいますが、基本的には専用のclrobj命令を使ってください。 cls命令は用意したウィンドウ全体を初期化するので、ループ中にcls命令を連発するような処理にすると、ムダにパフォーマンス を食い、場合によってはウィンドウの表示がちらつきます。

キーワード de HSP

HSPミニ講座

★ Yahoo!経由用ページ : ファイル | フォルダ | メニュー | マウス | ウィンドウ | オブジェクト | 文字列 | システム | 関数 | sendmsg命令 | その他 | サイトマップ | リンク