オブジェクト操作 by llmod PART2
前回の続きで「llmodを使用してオブジェクトを使おう第二段」ってとこです。

早速llmod版オブジェクトとその操作について解説していきましょう。
しかし、この章だけでは到底全部説明することはできませんので、「アップダウン」の1点だけです。
オマケとして最後に2命令もチョビッと載っていますが…。
たったのそれだけ、と思わないでくださいね。
この章だけでも、4命令+オマケの2命令で合計6命令が出てきます。
最後の方なんて、1点だけで11命令なんてものも出てくるんですよ〜。
1つの処理でこんなに詰まってたら説明するのも見るのももうたいへんです。
なので分割しちゃいますよってことでご了承ください。

さて、このllmod版の拡張オブジェクトなのですが、いずれも標準の64個内には含まれませんので
通常オブジェクトは64個いっぱいいっぱいまで使いきることができます。
それでは、この拡張オブジェクトは何個でもいけるのかと言うとそうではありません。
コチラも64個までと決まっています。
内部で上限を設定しているだけなので上限数を変更すればソレ以上も可能ですが、
1つのウィンドウで、というわけではなく全ウィンドウ合わせて、です。
また、これらの拡張オブジェクトはclrobjcls命令はもちろんのこと、
screen命令でウィンドウを初期化しても残っています。
これについてはこの章の最後の方に削除する命令を書いています。

では、1つ目のアップダウンコントロールから入ります。
アップダウンボタンっていうのは、なんだか知っていますか?
読んで字の如し、なのですが、上向きと下向きの2つのボタンが引っ付いたオブジェクトのことで、
ボタンだけでは意味を成さずにその近辺にあるボックス値を上下させるという時によく使用されています。
アップダウンボタンの作成はudbtn命令を使用します。
この命令を使用するにはllmod.asと同時にudbtn.asファイルをインクルードする必要があります。
書式は「udbtn 幅,高さ,スタイル,連動させるオブジェクト」となっています。
ヘルプでは、p4にスタイルと書いていますが、p3につけなければなりません。
p4に1で、最少・最大値を超えた時に逆の数値から出てこさせるかを設定します。
コレを入れていない場合は、最小値・最大値を超えることなくソコでストップします。
p4に4で、連動オブジェクトの右にくっつけて配置します。
p4に8で、4とは逆のオブジェクトの左側にくっつけます。
この右や左にくっつける場合なのですが、連動オブジェクトの外側にくっつけるのではなく、
オブジェクトの端からp1で指定サイズ分だけ内側に向かって配置されます。
重なるって言うか、連動オブジェクトのサイズがアップダウンボタン分だけ縮みます。
p4に$20(32)で、キーボードの上下キーで連動オブジェクトの値を変化させることができるようになります。
p4に$40(64)で、ボタンが上下ではなく左右となります。
しかし、$20と組み合わせて使用しても左右のキーではなく上下キーのままです。変わるのは向きだけです。
$80で連動したオブジェクトに表示する数値の3桁単位の桁区切りをなくします。
デフォルトでは「1000」を「1,000」といったように区切るようになっています。
#include "llmod.as"
#include "udbtn.as"

	value = 50
	pos 100, 100 : input value, 80, 25
	udbtn 10, 25, 4, 0
	stop
上のサンプルを試していただければ分かけるかと思いますが、 udbtn命令だけでは上限値「100」、下限値「0」と決まっています。 当然デフォルトで0〜100以外の値や文字も入れておけますが、変更すると自動的に範囲内にセットされます。 スタイルで位置指定(オブジェクトの右or左)をしないとカレントポジションに配置されます。 配置を行うと、statにアップダウンボタンのIDが入ります。 …といっても通常のHSPのオブジェクトID(0〜63)ではありません。 配置して、ふと思ったのですが…ボタンによる値の増減が逆ではないでしょうかね...? VBで確かめたところ、それは確かに上ボタンで増加、下ボタンで減少でした。 次は、上でちょっと触れた上限値と下限値、その他の設定も変更できるudset命令です。 書式は「udset セットする設定,p1により変化,p1により変化」となっています。 なんじゃこりゃって感じですが、そのまんまでp1に入れた値によってp2,p3の値も変わります。 p1に0を入れた場合、p2でアップボタンと連動させるオブジェクトを設定できます。 p3は使うことはありません。 連動オブジェクトを変化させた時、udbtnのp3に位置指定を設定していた場合、 アップダウンボタンも新しく連動させるオブジェクトのところに移動します。 しかし、アップダウンボタン分で減ったサイズは元には戻ってくれません。 p1に1をすると、上限・下限値の設定ができるようになります。 p2に下限値、p3に上限値を入れるわけですが、指定範囲は0〜$7fff(32767)となっています。 p1を2とすると、アップダウンボタン位置を設定できるとのことです。 …が、試した所、位置を設定出来ずに中の値がp2に指定した値の下位2バイト値に変わっただけでした。 配置する時udbtn命令で位置指定せずに、posのカレントポジションに配置させればどこでもOKなので、 それで我慢しましょう…。 p1を3にすると、連動するオブジェクトに表示される現在値を16進モードに出来ます。 使い道は…なんでしょうね? p1を4とすると、アップダウンボタンを押し続けた時の増減量を設定することが出来ます。 デフォルトでも押し続けたらずっと1ずつと言うわけではなく、 2,3秒で5単位に、5秒ほどで10単位に…と変わっていくようです。 設定はp2に段階数、p3に時間と増減量を1セットとした配列変数のポインタを指定します。 初めは1ずつ、2秒で2ずつ、4秒で4、6秒で8、8秒で16、10秒で32ずつ変化させたい場合は、 「0,1 , 2,2 , 4,4 , 6,8 , 8,16 , 10,32」を入れた変数のポインタを渡すわけですが…っと、 現段階では、まだポインタというものについて話を全くしていませんね。 未知の命令を使うといった今までにはないパターンですが、とりあえず今は 「getptr ポインタが入る変数,ポインタを知る変数」と言ったおまじないを書くと覚えてください。 そしてこのおまじないで取得できるポインタというもの、 つまり「ポインタが入る変数」と書いたところに書いた変数をudsetのp3に渡してください。
#include "llmod.as"
#include "udbtn.as"

	pos 100, 100 : input value, 100, 25
	udbtn 15, 25, 4, 0
	var = 0, 1, 2, 2, 4, 4, 6, 8, 8, 16, 10, 32
	getptr omajinai,var // おまじない(ココで書く変数「omajinai」をudsetに渡す)
	udset 4, 6, omajinai // 間隔(=4)を6段階にセット
	udset 1, -2000, 2000 // 上限・下限値(=1)を-2000と2000にセット
	stop
なんか…この上限・下限値を設定することでボタンの上が値増加、下が減少と正常(?)に戻るようですね。 コレについては後ほど追記で解説しています。 このudset命令を呼び出した後には、statに各設定に関する情報が入ります。 p1が0だった時は、再セットする前の連動オブジェクトIDが入ります。 p1が1だった時は常に0が返り、p1が2だと、セット前の位置が返るようですが未確認です。 p1が3だとセット前の基数(10or16)が返ります。 p1が4の時間間隔の設定の時は、設定に成功したら1が、失敗で0といった失敗フラグが付きます。 続きまして、設定やこの話の後の取得を行うアップダウンの選択をする命令sel_udbtnを説明しましょう。 アップダウンの選択というのは、ユーザーが操作できるようにフォーカスを合わせるという意味ではなく、 複数のアップダウンを配置している時にX個目のアップダウン情報を知る時や設定する時の指定のことです。 書式は「sel_udbtn アップダウンボタンのID」となっております。 アップダウンボタンのIDはudbtnにて配置した時にstat入るという話でしたが、 statは自動的に変わるので、後から変更できるように別の変数に取って置かなくてはいけません。
#include "llmod.as"
#include "udbtn.as"
#define NUMBER 5 // アップダウンボタン数

	sdim id, 128
	dim value, NUMBER
	dim updid, NUMBER
	// アップダウンボタンの配置
	repeat NUMBER
		pos 100, cnt*30+52 : mes cnt
		pos 120, cnt*30+50 : input value.cnt, 100, 25
		udbtn 15, 25, 4, cnt
		updid.cnt = stat // アップダウンボタンのオブジェクトIDを退避
	loop
	// 変更オブジェクトを選択するコンボボックスパラメータ
	repeat NUMBER
		if cnt : id += "\n"
		id += "" + cnt
	loop
	// 選択・変更項目
	max = 100
	min = 0
	pos 300,  52 : mes "変更オブジェクトID"
	pos 450,  50 : combox index, 100, id
	pos 300,  82 : mes "上限値"
	pos 450,  80 : input max, 50, 25, 5
	pos 300, 112 : mes "下限値"
	pos 450, 110 : input min, 50, 25, 5
	objsize 200, 25
	pos 300, 140 : button "変更する", *change
	stop

*change
	sel_udbtn updid. index // 指定アップダウンを選択
	udset 1, min, max
	stop
アップダウンに関する最後の命令udgetに入りましょう。 書式は「udget 取得タイプ」となっていて、statに取得値が入ります。 p1に0を指定した場合は、現在のアップダウンボタンと連動するオブジェクトのIDを取得できます。 p1に1で、アップダウンの上限値と下限値が取得できます。 形はstatに「最大値を16ビット左シフトした値」+「最小値」となっています。 …とヘルプには書かれていますが、値増加は下ボタン、減少は上ボタンとこの章の上のほうで書いたように、 ココで言う最大値を16ビットシフト言うのは下ボタンを押した時の値です。 ですので、恐らく通常言われる最大値・最小値は下記のように入ります。 「(上ボタンによる)最大値」+「(下ボタンの)最小値を16ビットシフトした値」がstatに入ります。 udsetの上限・下限値を設定すると元に戻る、というようなことを書いていましたね。 元に戻るのではなく、udsetのp2の下限値というは今回の下ボタンを押した時というものになり、 p3の上限値と書かれていたものは今回の上ボタンを押した時のものに変わるだけの話です。 まとめとして、初めのudbtnで設定される上限・下限値が間違って反対に設定されたものであるとなります。 取り出しが分からない方は後のサンプルをご覧ください。 p1を2とすると、アップダウンボタン位置を取得できる…となってますが設定同様取得できません。 p1を3とすると、アップダウンの表示タイプ(10or16進数)が分かります。 さて、次にサンプルを書きますが、1つ前のものを改変したものを載せておきます。
#include "llmod.as"
#include "udbtn.as"
#define NUMBER 5

	sdim id, 128
	dim value, NUMBER
	dim updid, NUMBER
	repeat NUMBER
		pos 100, cnt * 30 + 52 : mes cnt
		pos 120, cnt * 30 + 50 : input value. cnt, 100, 25
		udbtn 15, 25, 4, cnt
		updid.cnt = stat
	loop
	repeat NUMBER
		if cnt : id += "\n"
		id += "" + cnt
	loop
	pos 300,  52 : mes "変更オブジェクトID"
	pos 450,  50 : combox index, 100, id
	pos 300,  82 : mes "上ボタン(上限値)"
	pos 450,  80 : input max, 50, 25, 5
	pos 300, 112 : mes "下ボタン(下限値)"
	pos 450, 110 : input min, 50, 25, 5
	objsize 200,2 5
	pos 300, 140 : button "変更する", *change

*getboundary
	sel_udbtn updid.index
	udget 1
	max = stat & $7fff : min = stat >> 16
	objprm NUMBER + 1, max
	objprm NUMBER + 2, min
	index.1 = index

*main
	if index != index.1 : goto *getboundary
	wait 10
	goto *main

*change
	udset 1, min, max
	dialog "変更しました"
	goto *main
通常のclrobj等では消すことの出来ないアップダウンボタン消去命令を紹介しましょう。 用意された命令は1つだけではありません。 通常のオブジェクト消去命令と似てますが、_clrobj_clsと呼ばれる二つの命令があります。 勘違いのないように予め書きますが、これらの命令はudbtnだけを消す命令ではありません。 次章からも紹介する予定のllmod版の拡張オブジェクトを消す命令です。 別の言い方をすると次章から説明する拡張オブジェクトも通常の命令では消せません…。 書式はそれぞれ「_clrobj 消去するオブジェクトID」「_cls クリア後の画面色」と 元のclrobjclsと全く同じでサンプルもどちらも紹介するほどのものではないので省きます。 _clsについて追記しておきますが、この命令はllmod拡張オブジェクト全てを消すだけではありません。 「拡張オブジェクト全消去」+「cls」です。 llmodで作成した拡張オブジェクトを選択するのも_objsel命令で選択する必要があります。 同じなので説明は皆無ですが、書式は「_objsel アクティブにする拡張オブジェクトID」です。 -1を渡すと同じ様に現在アクティブな拡張オブジェクトIDも返って来ます。