Home -> HSP講座 -> 初級編 No.5

The Object

今回はオブジェクトの話です。
オブジェクト…… 一番最初に連想するのは何でしょう? ボタンでしょうか。
いつも通りサンプルから————

// Start of Sample

	title "Object Army"
	syscolor 15 : boxf : color // system color で染め上げる
	sdim buf		// バッファ(何かを溜める為の領域) を確保
	sdim text		// 同じく確保
	
	buf = {"
		プログラ広場
		プログラミング関係のこと
		いろいろあります
		初心者大歓迎
		管理人:上大&かーみ
		LastUpDate:
	"}
	text = "InputBox"
	
	objsize 200, 50	// オブジェクトの大きさ変更
	
	pos   0,   0 : listbox num, 400, buf +"This is a ListBox"	// リストボックス
	pos  20, 450 : mes "↑ ListBox"
	pos 220,  20 : combox num, 100, buf +"This is a ComBox"	// コンボボックス
	pos 430,  20 : mes "← ComBox"
	pos 220,  60 : button "プログラ広場 概要", *Infomation	// ボタン
	pos 430,  70 : mes "← ButtonControl"
	objsize 250, 25	// スリムにする
	pos 220, 120 : chkbox "プログラ広場は素晴らしいサイトだ。Yes or Yes ?", num	// チェックボックス (ボタン)
	pos 220, 150 : mes "↑ CheckBox ( ButtonControl )"
	pos 220, 180 : input text, 300, 25	// インプットボックス (エディットコントロール)
	pos 220, 210 : mes "↑"
	pos 240, 220 : mes "EditControl"
	pos 220, 230 : mes "↓"
	pos 220, 250 : mesbox buf, 350, 185, 1	// メッセージボックス (エディットコントロール)
	stop
	
*Infomation
	dialog buf, 0, "詳細は無し"
	stop

え〜と。
なぜ、オブジェクトの話をするのに、最初にこの命令なのでしょうか? (聞クナ)
始めに出てきた sdim 命令は、変数を文字列型(str)に初期化する命令です。

	変数 = ""

という感じで文字列型にしても良いのですが (そもそも HSP では初期化する必要すらないのですが……)、
この書き方だとたまに嫌らしい問題が起こるので、sdim 命令をあえて使用しています。

	文字列型変数 = {"  "}

この書式は、変数に複数行の文字列を一発で代入したいときに使えます。
使えるだけで、あんまり使いません……
基本的には、次のように書くようです。もしくは、ファイルから読み込みます (方法は後述)。

	sdim buf
	buf += "一行目\n"	// \n は改行の記号
	buf += "二行目\n"	// \n == \r
	buf += "三行目\n"
	buf += "四行目\n"

そもそも、あまり複数行文字列は使わないもので。(僕だけか?)

さて、この行を見てください。

	pos   0,   0 : listbox num, 400, buf +"This is a ListBox"	// リストボックス

触れるのが遅かったですが、
半角コロン ( : ) を使うと、一つの行に、複数の命令を書くことが出来ます。
このように、複数の命令を一つの行に纏めることを、「マルチステートメント」と言います。
※ステートメント(statement) … "命令" という意味。代入文なども含む。

マルチステートメントは、このサンプルのように見やすくなることがありますが、たいていの場合見にくくなるので、乱用しない方が賢明です。
マルチステートメント、いつかまた使うので、頭の片隅ででも覚えておいてください。(;_;)

おっと! 話が逸れまくってる……。
何の話だっけ?
あ、オブジェクトか。


EditControl 編

やっとオブジェクトです!
一番よく使う(?)エディットコントロール(Edit Control)と呼ばれる奴の解説から。

HSP には、Edit Control を配置する命令が2つあります。

input & mesbox

じゃじゃーん(遅い)

さて、どこが違うのでしょうか?

最初のサンプル(ずいぶん遠い)を実行してみると、これらは画面の右下にありますね。(分かりますか?)
"InputBox" と表示されているのが input 命令で作成されたオブジェクト、
変数 buf の内容が表示されているでかいのが mesbox 製のオブジェクトです。
input一行限定、
mesbox複数行であることが分かります。
この2つの命令の違いは行数の違いだけで、内部的には EditControl と呼ばれるコントロール(後述)を使用しています。

ということは……mesboxテキストエディタが作れるんじゃないか!?
はい、一応作れない事はないです。
ただし、性能がメモ帳レベルという情けないものになりかねないですが。

ちなみに、mesbox 命令は編集不可に出来ます。
input でも一応出来ますが、めんどうです。

	
	// おまけ
	sdim   edit, 65535
	mesbox edit, 640, 480, 5, 65535 - 1	// なぜ -1 なのかは後ほど
	stop
[EOF]


その他編

うわっ適当!

そのほかのオブジェクトに関しては言うことが特にないので、さらっと説明します。

ListBox
リストボックス・コントロール。listbox 命令で設置できます。
p3 の文字列の、一行ずつがアイテム (項目のこと) として表示されます。
また、現在選択されているアイテムのインデックス (アイテムに付いている番号。上から 0, 1, 2, ...)
が、 p1 の変数に代入されます。(なにも選ばれていない時は -1 )
複数のものを並べ、選ばせたい時に使用します。
2つ以上同時に選ばせることも可能です。
ComboBox
コンボボックス・コントロール。combox 命令で設置できます。
基本的には listbox とほぼ同じ。
違うのは、ドロップダウン (あの開く動作のこと) する位です。
こちらも、複数のものから一つを選ばせるのに使用します。
コンパクトですが、開かないと選択肢が見えないという欠点があります。
Button
ボタン・コントロール。button 命令で設置できます。
押すと p2 のラベルに goto ジャンプします。
button と p1 の間に gosub と書くとサブルーチンジャンプになりますが、
それについて詳しくは後述。
主にツールで、特定の処理をするラベルにジャンプする時に使用します。
CheckBox
ボタン・コントロールの亜種。chkbox 命令で設置できます。
見た目は、ボタンとは 180°違いますが、内部的にはほぼ同じ。
チェック状態なら p2 の変数に 0 以外の値が、チェックされていないときは、0 が代入されます。
※文字列もコントロールなので、大きさが小さいと、途中で切れるので注意してください。
on/off を選択させたいときに使います。
たまに combox"はい" "いいえ" しかない時がありますが、
こっちの方が適切でしょう。

HSP標準命令のオブジェクトの簡単な解説も終わったところで、オブジェクト関係の必須事項を説明していきましょうか!


オブジェクトを見分けよう

さて、このオブジェクト、設置した後にほったらかしてはいけません!
後で弄くろうにも、HSP 側がそれを識別しないといけません。

User君「おーい。ちょっとそこの listbox の項目を最新のに更新してよー。」
HSP 君「エラー (どのオブジェクトの事を言っているの?)」
User君「最初に設置した listbox だよー。」
HSP 君「エラー (最初っていつだ?)」
User君「最初って…… 24行目だよー。」
HSP 君「エラー (スクリプトの行数言われても困るよ)」
User君「がーん!! ('o';)」
—— User 君、ご臨終。
<完>

こんな悲しい話にならないためにも、オブジェクトを数値で分類しましょう。
オブジェクトID です!
これは、各ウィンドウごとに、置かれた順番に数値が決められていきます(0から)。
つまり、一個目を置いたら、それのIDは 0。
二個目は 1。
三個目は 2。
……
こんな具合です。
この IDは、オブジェクトを置いた後の stat (システム変数)に代入されているので、変数を使って記憶させましょう。
システム変数については、中級編辺りで詳しく書きますが、ここではちょっと変わった変数として受け取っておいてください。

	button "Sample", *info
	oid_button = stat // オブジェクトID
	mes oid_button
	
*info
	stop

これで、変数 oid_button にボタンのID が代入され、それを表示してみました。
※ oid …… object id の略。


オブジェクトをいじってみよう

ID も取得できたことですし、早速オブジェクトを弄ってみましょう !!

これら7つの命令・関数で、オブジェクトID を使います。(抜けてたら教えて下さい)
HSP3.2 で後半3つが追加され、だいぶ多くなりました。

objprm 命令は、さっきの ID のオブジェクトの内容を変更します。
変更できる内容については、ワンキー・ヘルプを見てください。(手抜き)

objsel 命令は、ID(やっぱり p1) にフォーカスを動かします。
フォーカスというのは、いくつかのオブジェクトの中で、注目されているものです。

つまり、
フォーカス説明用画像

この画像の、ID 3 にあるような点線を持っているもののことです。
(ID 4 はマウスカーソルが合っているだけ。これを「ホット」という。)

ちなみに、ID の代わりに -1 を指定すると、現在フォーカスを持っているオブジェクトのIDを stat に代入します。
その場合、フォーカスの移動はありません。

clrobj は、その名の通りオブジェクトを削除します。
削除方法がちょっと特殊(?)で、p1 以上 p2 以下の ID のオブジェクトを一気に削除してくれます。
( 実は、オブジェクトIDはオブジェクトの設置順になっています。この命令のせいでしばしば狂いますが )。
引数を省略すると、すべて削除します。
1 だけ壊すときは、p1 と p2 に同じIDを指定します。p2 を忘れると、余計なものまで壊れます。
※この命令、たぶん使いません。

objinfo() 関数は……
今はまだ必要のないものなので、置いておきましょう。
別に覚える必要はありません。いつか、いやでも覚えてしまうほど使いますから……。

さて。
今回の講座で、いろいろ出来るようになりましたね。
例えば、ひたすら chkbox で項目選択、input で記述、mesbox で意見・感想を書けるアンケート・プログラムとか (おもしろくないか)。
ま、適当にいじってみると面白いですよ。

ではまた次回。
さっきの画像の謎も明らかに!(何が謎なのかも明らかに!)

by 上大

第四章へ   第六章へ


テキストエディタ

テキスト(文章)を編集(エディット)するためのソフト。
一番有名なのは、恐らく MicroSoft社の「メモ帳」(notepad)。Windows 標準装備です。
スクリプトも文章なので、スクリプトエディタも、テキストエディタの一つです。