オブジェクト操作 by llmod PART3
この章では拡張オブジェクト二つ紹介しようと思います。

1つ目はプログレスボックスを新規に作成するprogbox命令です。
プログレスボックスという言い方は普段あまりしないかもしれません。
G●ogleで検索した所、「プログレスバー」で約7800件強、「プログレスボックス」で約15件強。
しかも「プログレスボックス」の方のうち数件はHSPのものでしたので、
「プログレスバー」と言う方が一般的ではないかと思います…。

さて、そのプログレスバーとは何かご存知でしょうか?
その名前の通りなのですが、前進する棒です。
前進するのは「処理」のことで、棒はその処理が進んでいる状態を表しているものと思われます。
言い換えると「処理全体で100%とした、現在の進捗状況をグラフ化したもの」です。
一瞬では終わらない処理のところでよく使われています。例えば、ダウンロードの経過ウィンドウとか。
HSPからこのプログレスバーを使用するにはllmod.asprogbox.asをインクルードする必要があります。
プログレスバーを使う為の初めに書くプログラムの書式は「progbox 幅,高さ,タイプ」となっています。
p1の横幅とp2の高さのプログレスバーカレントポジションに配置します。
p1又はp2を省略すると、省略したパラメータがobjsizeで指定されている値となります。
念のため申しておきますが、コレをしただけでは何も起こりません。ボックスを配置しただけに過ぎません。
p3のタイプは、進捗のアニメーションについての設定をします。
p3に1を指定すると、進捗状況を表す目盛りがブロック単位ではなく、
スムーズにボックスを端から塗りつぶしていきます。
コレを指定しない場合は、目盛りが1ブロックずつ増えて行くこととなります。
このプログレスバーを配置・操作するためにはアップダウンボタン同様、
llmod.asと同時にprogbox.asファイルをインクルードする必要があります。
#include "llmod.as"
#include "progbox.as"

	pos 200,100 : progbox 190, 30
	stop
p3に4を指定すると、目盛りの進む方向が左から右ではなく、下から上となります。 しかし、ココで注意が必要です。横の場合でも当てはまることなのですが。 ボックスのサイズにかかわらず、目盛り1ブロック分の縦横のサイズ比率と言うものが決まっているのです。 割合は恐らく進行方向軸が2であるのに対して、もう一方が3だと思います。
進行方向 ─→
          
 
…で、それがどうしたのかと申しますと、ボックスのサイズに関わらず比率が一緒なので 例えば、進行方向が横なのに縦長のボックスだった場合、1ブロックだけでボックスが埋まります。 進行方向が縦なのに横長ボックスというのも然り、です。 何が注意するポイントかと言うと普通にすれば問題ないことなのですが、 初めは横方向のプログレスバーを配置していたが、サイズを変えずに進行方向を縦に変えた等で 目盛りが初めから最後までずっと埋まったままの状態が続くということになってしまいます。 ブロック単位の目盛りではなく縦方向(=4)にスムーズ(=1)に進めたいという場合もあることでしょう。 そういう場合、他の命令でもありますがパラメータを組み合わせることで同時に指定することが出来ます。 この場合は5を指定することで、縦方向にスムーズに進めることができる様になります。 無事に配置できるとstatにプログレスバーIDが返ります。 次に紹介する命令を使用して、操作するプログレスバーを選択しましょう。 当然ですが、配置直後はそのプログレスバーが操作対象ですので選択する必要はありません。 前章書いたように、このプログレスバーもllmodの拡張オブジェクトですので、 clrobj等の標準命令で消すことは出来ません。_clrobj又は_clsをご利用ください。 次に操作するプログレスバーを指定するsel_progbox命令をしましょう。 書式は「sel_progbox プログレスバーID」です。 udbtnと同じですので簡単でしょう。一応説明させていただきますが。 …と言っても操作対象を変更しても、見ただけでは何も変わらないということで 次の実際に目盛りを増減させる命令の所のサンプルで紹介させていただきます。 プログレスバーの各設定を行うprogset命令の登場です。 書式は「progset セット値,タイプ」となっています。 p2のタイプを0(デフォルト(省略)値)にした時は、p1により微妙に異なります。 p2のタイプが0でp1も0(デフォルト(省略)値)にした時は、目盛りを規定値分進めます。 目盛りの規定値を設定していない初期では10ずつ増加させることが出来ます。 statにはプログレスバーのバーが増減する前の値が返ります。
#include "llmod.as"
#include "progbox.as"
#define NUM 3 // プログレスバーの数

	sdim ctrl, 128
	dim progid, NUM
	// 操作プログレスバーID
	repeat NUM
		if ctrl != "" : ctrl+ = "\n"
		ctrl += "" + cnt
	loop
	pos 100, 50 : combox index, 100, ctrl
	pos 200, 50 : button "増加", *up
	// 配置
	objsize 320, 30
	repeat NUM
		pos 100, cnt * 50 + 100 : progbox
		progid.cnt = stat
	loop
	stop

*up
	sel_progbox progid.index // 操作対象プログレスバーの変更
	progset
	stop
p2が0で、p1が0以外の時は進ませる量の設定をすることができます。 当然マイナス値も指定できます。 先ほどのサンプルで気づくと思いますが、限界値を超えても自動では止まってくれないです。 自分でそれ以上(以下)進まないようにプログラムで制御するようにしましょう。 限界値(デフォルトは0と100)を超えた場合、ただ単に反対側から出てくるというだけです。 見た目だけでなく、値を反対側の限界値からとなります。100を超えたら0からといった感じ。 この、p2が0でp1が1の場合ですが、増減値をセットしただけですのでこの場合は値の増減は行われません。 statにはセットする前の増減値が返ります。 p2に1を指定した時は、p1で指定した値にプログレスバーのバーをセットすることが出来ます。 コレもstatにはセットする前の値が返ります。 p2が2の時は、p1の値分を現在値から増減させることが出来ます。 コレだけを聞いただけではp2が0で、p1に0以外を指定した時の動作と似ていますが、 p2が0でp1が0以外の場合は、次に増減値を変更するまでそのプログレスバーの増減値となるのに対して、 p2が2でp1が増減値とした場合は、その1回限りの増減値の設定となります。 また、このp2に2を指定した場合は、設定だけでなくコレを実行しただけで値が増減されます。 statには増減する前の値が返ります。 p2に3,4で色の設定というのがありますが、 ヘルプにあるようにcomctl32.dllのバージョンが4.70以上でなければなりません。 comctl32.dllはシステムフォルダにあり、プロパティで確認が出来ます。 システムフォルダはデフォルトでは「c:\windows\system」です。NT系では「c:\windows\system32」。 4.70以前のバージョンはWin95の初期版(4.00.950)くらいではないでしょうか? IE3.0に4.70が添付してますし、Win98ではもう既に4.72以上ですから問題ないでしょう。 あまりに古いマシンでは未対応ですよ、とだけ書いておきます。 …で、p2に3を指定すると、p1に指定した値で目盛りの色を変更できます。 p2に4で目盛りのバックの色を変えられます。 指定の仕方は今までに何回か出てきていますが、 「赤輝度+緑輝度(8ビット左シフト)+青輝度(16ビット左シフト)」です。 statには設定前の色が指定する色と同じ形式で返ります。
#include "llmod.as"
#include "progbox.as"

	pos 100,100 : progbox 320, 50
	progset 50, 1
	progset 255 <<  16 + (255 << 8), 3 // 目盛りを水色にする
	progset 100 << 16 + 100, 4 // 背景を濃い紫にする
	stop
プログレスバー最後のprogrng命令を説明しましょう。 この命令はプログレスバーの限界値を設定する命令です。 書式は「progrng 最小値,最大値,最大値拡張フラグ」となっていますが、 p3の拡張フラグは先ほど同様、 comctl32.dllのバージョンが4.70以上でなければなりません。 p1に設定できる最小値は0、p2の最大値は65535です。 それ以外を指定した場合はおかしくなること請け合いです。 comctl32.dllのバージョンが4.70以上の時にp3の拡張フラグに1(0以外)を入れると、 最大値を「42億9496万7295」にすることができるようになります。 statには以前セットしていた最小値、最大値が入ります。 ただし、最大値が65535以下の時だけです。 ヘルプにはp3が0時と書いていましたが65535以下の時です。 入り方は、「最大値の16ビット左シフト+最小値」の形式です。
#include "llmod.as"
#include "progbox.as"

	pos 100, 100 : progbox 320, 50
	progrng 0, 1000
	min = stat & $ffff // $ffff=65535
	max = stat >> 16
	title "以前は最小値「" + min + "」, 最大値「" + max + "」でした"
	repeat
		progset
		redraw 0
		color 255, 255, 255 : boxf : color
		pos 250,160 : mes stat + 10
		redraw
		if stat + 10 = 1000 : break
		wait 1
	loop
	dialog "終了"
	stop
さて、次のトラックボックスオブジェクトに話を移しましょう。 トラックボックスというものはどういったものかご存知でしょうか? この上でしたプログレスバーよりあまり聞かない名前で知らない方がいるかもしれませんね。 どんなのか言葉でうまく説明しにくいのですが、バー上のつまみを手動で動かす… えっとそう、パソコンのサウンドのボリュームを変更するところで使われているオブジェクト と、書けばピンと来るのではないでしょうか? そのつまみを動かすことで任意の設定を行うtrackbox命令の説明をしましょう。 このトラックボックスもllmod.asと同時にtrackbox.asをインクルードしなければなりません。 作成・配置するこの命令の書式は「trackbox 幅,高さ,スタイル」です。 p1,p2のオブジェクトサイズを省略した場合は、他のオブジェクト同様objsizeの大きさとなります。 高さ(進行方向ではない方向のサイズ)としては40くらいあればちょうどいいサイズになると思います。 p3のスタイルは書いておかなければ何も見ずに指定することは難しいと思うので書きます。 難しくなくても講座として書いておくのですけど…。 0又は省略をすると横にスライドさせる水平トラックボックスとなります。 両端だけで途中の目盛りは付きません。 また、目盛りは下側に付けられます。 1にすると自動で目盛りを付ける、とのことですが、このtrackboxによる配置だけでは0と一緒です。 後のtrackmrk命令のところで解説いたします。 2にすると縦にスライドさせる垂直トラックボックスになります。 コレも両端だけ目盛りが右側に付けられます。 4にすると、水平型の場合は上に、垂直型の場合は左に目盛りが付けられます。 8にすると、両側(水平型は上と下、垂直は左と右)に目盛りが付けられます。 $10(16)にすると、目盛りは両端にすら付けられなくなります。 $20(32)にすると、つまみ背景部分の移動可能領域の見た目が線ではなく、input型になります。 そして、そのボックスに選択している領域に色を付けられる様になります。 $40(64)にすると、つまみ位置を変更しても$20の時の選択領域を固定したままにします。 これら$20と$40もtrackboxによる配置だけでは何かというのがサッパリ見えないものでしょう。 コレも今ではなく、後のtracksel命令のところで説明いたします。 $80(128)にすると、操作するためのつまみがなくなります。 $100(160)にすると、つまみをドラッグした時に現在の値をツールチップで表示させられる様になります。 しかしプログレスバー同様、comctl32.dllのバージョンが古いと効果がない場合がある、とのことです。 コレも4.70以上なのかな?未確認なので分かりませんがご注意ください。 …で、これらの設定を複数同時にしたい(垂直型の両側に目盛り等々)場合は、 すべてのスタイル値を足すことで同時に指定することができる様になります。 例で書いた「垂直(=2)+両側目盛り(=8)」だと、10(若しくは単に2+8,2|8でもOK)とすることでいけます。 今回のトラックボックスは配置だけで操作も自由に出来て直感的にわかりやすいですね^^ 配置直後は今まで通り、そのトラックボックスが操作対象オブジェクトとなり、 statには配置したトラックボックスのIDが入ります。操作対象を変更する時にこのIDを使用しましょう。
#include "llmod.as"
#include "trackbox.as"

	pos 100, 50 : trackbox 400, 40, $100 // ツールチップ付加
	stop
配置の次はつまみ位置の取得及び設定をするtrackpos命令を説明します。 書式は「trackpos 設定位置,取得フラグ」でstatに結果が返ります。 設定時はp1に設定したい位置を入れるだけでp2は触りません statには常に0が返りますのでコレもあまり関係ありませんね。 取得する時はp2に1(0以外)を入れます。p1に入れても無視されますので無関係です。 statに取得した現在の値が入ります。 なんか…ちょっと無理矢理な作りとなっていますね。 別々に分けるのはダメだったのでしょうか…。
#include "llmod.as"
#include "trackbox.as"

	pos 100, 50 : trackbox 400, 40
	trackpos 50
	font "", 30
	objmode 2
	pos 500, 50 : input value, 64, 40

*main
	trackpos , 1
	objprm 0, stat
	wait 10
	goto *main
操作するトラックボックスを選択するsel_trackbox命令に入ります。 書式は「sel_trackbox 操作対象トラックボックスID」となっています。
#include "llmod.as"
#include "trackbox.as"
#define NUM 3 // トラックボックスの数

	sdim track, 128
	dim trackid, NUM
	repeat NUM,1
		if track != "" : track+ = "\n"
		track += "" + cnt
	loop
	pos 100, 50 :  index, 100, track
	pos 200, 50 : button "変更", *change
	repeat NUM
		pos 100, cnt * 50 + 100 : trackbox 400, 40
		trackid.cnt = stat
	loop

*main
	trackpos , 1
	trackpos stat + 1
	wait 10
	goto *main

*change
	sel_trackbox trackid.index
	goto *main
目盛りの取得・設定をするtrackmrk命令の書式は「trackmrk 目盛り位置,タイプ」です。 p2のタイプが0(又は省略)の時は、p1の位置に目盛りを1つ付けます。 p2が1の時は全目盛り数をstatに返します。全目盛りですので両端も含みます。 p2が2でtrackboxで書いていた目盛りを自動で付ける、というものが作動します。 何かと言うとp1で指定した間隔ごとに目盛りを配置するというものです。 例えば間隔を20とした場合、「20,40,60,80」が自動的に付けられるというわけです。 p2を3にすると、p1番目の目盛り位置をstatに返します。 p1で指定した目盛りがないと−1が返ります。ココでは両端の目盛りは含まないことに注意、です。 p2が4の時は、付けた目盛りを消去します。コレもデフォルトの両端の目盛りは含まない(消えない)です。
#include "llmod.as"
#include "trackbox.as"

	pos 100, 100 : trackbox 320, 40, 1 // 自動目盛り付加
	trackmrk 10, 2 // 10間隔
	stop
トラックボックスのデフォルト範囲は他と同じく0〜100で、範囲を変更するのはtrackrng命令です。 書式は「trackrng 最小値,最大値,取得フラグ」となっています。 この命令について他の命令よりあまり書かれていませんが、最小値にはマイナス値も指定できます。 また、最大値などに$ffffの制限について書かれていないのですが、 どのバージョンのcomctl32.dllでも同じ様にいけるのか未検証につき断言できません。 今までのパターンだとコレも無理な気がするのですがね…。 でも、もともとマイナス値もいけるし…。 旧バージョンではマイナスが無理なのか−32768〜32767のどっちかなのでしょうけど。 古いバージョンでいけるのかどなたか試していただけないでしょうか…。 …で、p3の取得フラグに1(0以外)を立てると、取得モードとなります。 p3に1を立てて、p1に1を立てると最小値を、 p3に1を立てp2に1を立てると最大値を取得し、statにそれぞれの値が返ります。 p1とp2両方共に1を付けた場合は、最小値側の値が取られるようです。
#include "llmod.as"
#include "trackbox.as"

	pos 100, 100 : trackbox 320, 40, $101
	trackrng -100, 100 // 範囲設定
	trackmrk 50, 2     // 目盛り間隔
	trackrng 1, , 1    // 最小値
	pos 100, 150 : mes stat
	trackrng , 1, 1    // 最大値
	pos 400, 150 : mes stat
	stop
トラックボックスの選択領域の取得と設定を行うtracksel命令を解説しましょう。 トラックボックスの領域を選択するというのがいまいちピンと来ないことでしょうが、 最後に書かれているサンプルスクリプトでも実行してこんなものか、と理解してください…。 書式は「tracksel 最小値,最大値,取得フラグ」と、範囲選択するtrackrngと一緒です。 コレもtrackboxのところで少し触れましたね。タイプで選択範囲できる$20を選ぶと有効になります。 p3を0(又は省略)とすると、p1〜p2の範囲を選択します。 p3を1にすると、p1(開始位置)のみ設定するようになります。 p3を2とすると、p2(終了位置)のみ設定します。 p3に3を指定すると、選択範囲を消去します。
#include "llmod.as"
#include "trackbox.as"

	pos 100, 100 : trackbox 320, 40, $20
	objsize 150, 30
	button "", *set

*set
	switch flg
		case 0 : objprm 0, "開始位置セット"
			flg++
			swbreak
		case 1 : objprm 0, "終了位置セット"
			trackpos , 1
			 min = stat
				tracksel min, , 1
			 flg++
				swbreak
		case 2 : trackpos , 1
			max = stat
			tracksel min, max
			flg = 0
			goto *set
	swend
	stop