オブジェクト操作 by llmod PART1
タイトルの通り、通常のコンポーネント(HSPでは単純にオブジェクト)で扱えない(扱いにくい)ものを
llmodを使用して拡張しちゃおうっていうのがこの章の目的です。
既存のオブジェクトを向上させたり、新しいオブジェクトを使えるようにします。
新しいオブジェクトはclrobj命令やcls命令では削除を行えません。
また、設定が通常のオブジェクトに比べ多いものが多く、戸惑う方が居られるかもしれません。

いくつか複数あり、ボリュームが増えすぎて書くほうも読むほうも後半はヤル気なくしちゃいますので、
章を分割して、とりあえずこの章では既存のオブジェクトを拡張する命令から入りましょう。

やろうと思えば、objsend命令でできるのですがmesbox内の1行を選択するlinesel命令を。
…というかこの命令自体、標準命令のみで作られているものなのですが。
この命令はllmod.asファイル内には記述されておらず、ime.asファイルにあります。
ですので、llmod.asと同時にime.asファイルもインクルードしなくてはなりません。
書式は「linesel mesboxのオブジェクトID,選択行」となっています。
p1のオブジェクトIDはmesboxでなくともエラーが出るというわけではありません。
ただ、やらずともお分かりかと思いますが、指定しても何の意味もありませんね。
p2に0から最大行-1までを指定すればその行が選択されます。
また、-1で現在のキャレットのある行が選択されますし、-2で全行が選択できます。
#include "llmod.as"
#include "ime.as"

	buf = "abcdef\nghijklmn\nopqrstu\nvwxyz"
	pos 100,50 : mesbox buf,320,100,1
	pos 100,180 : mes "選択行"
	pos 150,180 : combox index,100,"0\n1\n2\n3"
	pos 230,180 : button "選択",select
	stop

*select
	objsel 0 ; mesbox選択
	linesel zero,index
	stop
ユーザーによって(別オブジェクトを使用を使用して)選択させる場合は注意が必要です。 上記サンプルのようにlinesel直前で対象mesboxにフォーカスを合わせておく必要があります。 コレをしないとlinesel命令を実行しても行選択することが出来ません。 続いて、選択された文字を取得するselget命令を解説いたします。 コチラもllmod.asファイル内には記述されておらず、ime.asファイルに書かれています。 linesel命令の解説では、ime.asファイルにしか書いていないのに どうしてllmod.asファイルもインクルードするかを書いてませんでした。 それは単に、ime.asファイルには他にも命令が載っており、 それらの命令はllmod.asファイルがなければ使用できないものだから、かと思われます。 一応ime.asだけインクルードして実行してみました所…普通に動きました。 何なのかはちょっと分からないですが必要と書いてあるのだし一緒にインクルードしておきましょう... 書式は「selget 取得文字列を代入する変数,オブジェクトID」です。
#include "llmod.as"
#include "ime.as"

	sdim buf, 128
	sdim selstr, 32
	buf = "abcdef\nghijklmn\nopqrstu\nvwxyz"
	pos 100,  50 : mesbox buf, 320, 100, 1
	pos 230, 180 : button "取得",get
	stop

*get
	selget selstr, 0
	dialog "" + selstr, , "選択文字列"
	objsel 0
	stop
今回は前回のように予めフォーカスを合わせる必要はありません。 しかし例えば上の例なら選択文字をダイアログ表示しているわけですが、 ダイアログを消した後に先ほど選択していたものが消えてしまいます。 それが嫌なら上記サンプルのように結果表示後にフォーカスを合わせる、ということが必要となります。 p1の変数サイズより取得サイズの方が大きい場合でもエラーは出ません。 ただ、当然ですが変数のサイズ分までのテキストしか取得は出来ませんが。 では続きましてボタンに画像を貼っちゃう命令btnimgに入りましょう。 HSPを使い始めたハナタレの頃(注.実際は垂れてません)はオーナードロー系ボタンの作り方がわからず、 こんなやり方も知らずデフォルトの灰色ボタンを配置していたものです。 今は逆にデフォルトを使うことが多いですが…。 こういったものを当時知っていたら万歳三唱していたことでしょう、と妄想はコレくらいで置いておいて…。 パラメータは6つと多少多そうですが、gcopyと似たようなものなので大丈夫でしょう。 書式は「btnimg ボタンID,貼り付け元ウィンドウID,X位置,Y位置,幅,高さ」となっています。 また、この命令もllmod.asだけでなく、別ファイルmisc.asが必要となります。 今回はmisc.asからllmod.asを呼び出しているのでmisc.asだけにするというわけにはいきません。 まぁ...#includeせずに必要部分だけ直接埋め込むというので問題はないのですけどね…。
#include "llmod.as"
#include "misc.as"
#define BX 100 // ボタン幅
#define BY 25 // ボタン高さ

	buffer 2,BX,BY*2
	color 255, 0, 0 : boxf 0, 0, BX, BY
	color 0, 0, 255 : boxf 0, BY, BX, BY * 2
	gsel 0
	objsize BX, BY
	pos 200, 100 : button "表示されません", btn
	pos 200, 150 : button "コレも非表示", btn
	btnimg 0, 2, 0, 0, BX, BY
	btnimg 1, 2, 0, BY, BX, BY
	stop

*btn
	end
サンプルスクリプトのボタンキャプションに「表示されません」「コレも非表示」と書いていますが、 ボタンが表示されないのではなく、ボタンキャプションのテキストが表示されないことを表してます。 表示させるテキストも画像に埋め込まなければなりません。 では、次へと進みオブジェクト位置・サイズを取得する命令getobjsizeを説明します。 書式は「getobjsize 取得した数値を入れる配列変数,オブジェクトID」です。 取得結果はp1の配列に次の順番で入ります。 「オブジェクト幅」「オブジェクト高さ」「左上X座標」「左上Y座標」「右下X座標」「右下Y座標」です。 p1の配列変数は要素数6以上のものを指定しなくてはエラーとなってしまいます。気をつけましょう。 書かなくても分かるかと思いますが、座標の位置はウィンドウの相対座標となります。
#include "llmod.as"
#include "obj.as"
#define OBJX 200
#define OBJY 80

	sdim buf, 256
	dim info, 6
	pos 50, 50 : mesbox buf, OBJX, OBJY, 5
	getobjsize info,0
	mes "幅 = " + info.0
	mes "高さ = " + info.1
	mes "左上X = " + info.2
	mes "左上Y = " + info.3
	mes "右上X = " + info.4
	mes "右上Y = " + info.5
	stop
残り3つですが、ココではgetobjsizeの反対の機能をするresizeobj命令です。 反対の機能とは何ぞや。位置・サイズを変更するってものです。って分かりますね。 書式は「resizeobj オブジェクトID,位置・サイズを入れる配列,位置・サイズ変更フラグ」となってます。 p2には「オブジェクト幅」「オブジェクト高さ」「左上X座標」「左上Y座標」を指定します。 サイズ取得とは違い右上X,Y座標は必要ありません。 p3の変更フラグには、デフォルトの0指定でオブジェクト位置・サイズ両方を変更し、 1でサイズのみ変更、2で位置のみ変更させることが出来ます。
#include "llmod.as"
#include "obj.as"
#define DEFPX 200
#define DEFPY 150
#define DEFSX 160
#define DEFSY 100

	buf = "変更対象\nオブジェクト"
	posx = DEFPX : posy = DEFPY
	sizex = DEFSX : sizey = DEFSY
	pos    50,    23 : mes "位置     ,"
	pos   100,    20 : input posx, 50, 25, 3
	pos   170,    20 : input posy, 50, 25, 3
	pos    50,    53 : mes "サイズ    ,"
	pos   100,    50 : input sizex, 50, 25, 3
	pos   170,    50 : input sizey, 50, 25, 3
	pos    50,    80 : button "変更", *change
	pos DEFPX, DEFPY : mesbox buf, DEFSX, DEFSY
	stop

*change
	changed = sizex, sizey, posx, posy
	resizeobj 5, changed
	stop
入力エラーチェック等は行っておりません。 次は、オブジェクトの使用可・不可を操作できるobjgray命令をしましょう。 書式は「objgray オブジェクトID,使用不可フラグ」で、Tipsのモジュールとして使うよりシンプル。 p2のフラグに0を指定すると使用不可に、1で使用可になります。 また−1を指定することで現在の使用可・不可の状態を知ることが出来ます。 その場合、結果はstatに、使用可(=1)・不可(=0)が入ります。
#include "llmod.as"
#include "obj.as"

	font "MS 明朝", 100
	objmode 2
	objsize winx, winy / 2
	button "ボタン1", *push
	button "ボタン2", *push

*push
	btn = stat
	objgray btn, 0
	objgray 1 - btn, 1
	stop
さて、最後はツールチップをオブジェクトに付加するtooltip命令をしましょう。 ツールチップとは、オブジェクト上でカーソルを1,2秒ほど静止すると表示される小さなヘルプのこと。 検証してませんが、多分あらゆるオブジェクトに対してヘルプを付けられるのではないかと思います。 書式は「tooltip オブジェクトID,表示文字列,背景色」となっています。 p2の表示させるテキストは、モジュール側が255文字までの文字列しか対応していないので パラメータは最大で255文字までしか代入することは出来ません。 p3の背景色の指定は「赤輝度 + 緑輝度の8ビットシフト + 青輝度の16ビットシフト」を指定します。 言い換えると、「(B << 16) + (G << 8) + R」(R=赤,G=緑,B=青)となります。 また、この背景色の変更が出来るのはIE3.0以上が入っている環境のみ、のようです。 …といっても大半は入っていると思われるので考えなくてイイでしょう。
#include "llmod.as"
#include "misc.as"

	button "終了", *exit
	bg = 255
	bg += 255 << 8
	bg += 200 << 16
	tooltip 0, "Exit", bg
	stop

*exit