楽しいオブジェクト作成(後半)
前半は4つのオブジェクトと、オブジェクトを操作する命令について説明しました。
後半のオブジェクトは入力系を中心に紹介します。
ではインプットボックスの説明に入ります。
今までしてきたことはすべて画面への出力のみでしたが、
今回紹介するオブジェクトを使うことでキーボードからの入力を受け付けられるようになります。
書式の説明、「input 変数,xサイズ,yサイズ,最大文字数」です。
ボックス内に入った値又は文字列がそのまま変数(p1)に入ります。
1と入力すれば変数には1が、ABCと入力すればABCという文字列が入ります。
input命令は、ボタンの最後のところで説明したobjsize命令を使ってのサイズ変更は行いません。
p2に横幅,p3に高さを指定します。
省略するとobjsize命令で指定した大きさになります。
p4にはボックスで扱える最大文字数を指定します。3とすると、半角で3文字まで扱うことができます。
省略するとp1で指定した変数で扱える最大文字数になります。
pos 100,50 ; カレントポジションをxが100,yが50の座標に設定
input a,50,25,3 ; 半角で3文字まで入れることができます
stop
(例)ボタンを押すとボックス内容を表示するプログラム
input data,100,25,10 ; 入力ボックスの作成、内容は自動でdataに代入する(半角10文字まで入力可)
button "表示",*hyouji
stop
*hyouji
mes data
stop
尚、p1の変数を型宣言しなければ、初期設定の数値型変数になり、dataには0が入ります。
sdim命令で宣言しておくか、変数に文字列を入れておけば文字列型になります。
ボックス作成時に初め0が入っているのは嫌だな、という場合は
input命令で作成する前にinput命令で使用する変数に予め代入しておきましょう。
data = "何か入力してください"
input data,200,25,64
stop
最後のオブジェクト、mesbox命令について説明します。
mesbox命令はinput命令のマルチライン状のオブジェクト、入力できる複数行型入力ボックスです。
メモ帳等のエディターメイン部分がコレにあたります。
書式は「mesbox 内容を保持する変数,xサイズ(横幅),yサイズ(高さ),スタイル,入力可能文字数」です。
ちょっとパラメータが多いですが…設定内容は大したことありません。
p1には、メッセージボックス内に書き込まれている文字列を入れておく変数です。
この変数はあらかじめ大きめに領域を確保しておかないと入力し過ぎた際に不具合が起きてしまうので注意!
p2,p3は省略すればobjsize命令の大きさになりますがオブジェクトサイズを指定します。
p4のスタイルとは、大きく分けて、編集可能か否かの設定です。
ヘルプと同じ内容になってしまうのですが、p4には下記のいずれかの値を入力します。省略は0になります。
0スクロール可能なエディットボックス(書き換え不可)
1スクロール可能なエディットボックス(書き換え可能)
2スクロールなし、スタティックテキスト
4横スクロールバー付きエディットボックス(書き換え不可)
5横スクロールバー付きエディットボックス(書き換え可能)
0は読取専用ボックスで縦スクロールのみ可能です。入力テキストに対してコピーのみ可能です。
1は0の編集可能版です。編集可能なので、「切り取り」「貼り付け」も使用可能です。
2だけは少し違い指定された範囲に複数行の文字列を表示するだけの表示ボックスとなります。
3は何故かないようです・・・。試しても2と同じ(ような?)スタイルになりました。
4は0と同じですが、縦横共にスクロールが可能なボックスとなっております。
5は1の横にもスクロール可能となった編集可能な一番メモ帳に近い(?)ボックスです。
p5には最大文字数を設定します。sdim命令等で確保しない場合は0〜63の間の数値を入れてください。
sdim buf, 32000 ; 32KBまで扱えるようにする
mesbox buf, 640, 480, 1
stop
注意として、p1で指定する変数をあらかじめ文字列型で初期化しておく必要があります。
上記の例のようにsdim命令で確保するか、「buf = ""」の様にダブルクォートで囲むだけでもいいです。
buf = "64文字まで入力可能" ; 文字列型にしておく
mesbox buf, 640, 480, 5, 64 ; 64文字までの制限をしておく
stop
さぁコレで一通りオブジェクトを説明しました。
この他ツリー・アップダウン・トラックボックス等があるのですが
コレまでと違ってややこしいのでココではまだ説明しません。
オブジェクトの内容を変更すれば、そのオブジェクトに使用している変数は自動的に変更されますが、
逆のパターンで変数を変えただけではオブジェクトの内容までは変更されません。
sdim buf, 32000
mesbox buf, 640, 480, 1
buf = "この内容は変更されません"
stop
上記の例ではbufに文字が入っているにもかかわらずメッセージボックスには表示されていません。
こういう場合に使用するのがobjprm命令で、オブジェクトの内容を更新(変更)することができます。
objprm命令はオブジェクトにより何を変更させるのか、というのが変わってきます。
chkbox命令はチェックのON・OFF。
button命令はキャプション(ボタンに表示されている文字)。
input,mesbox命令は入力ボックスの内容。
combox,listbox命令はリストデータの文字です。
time = "ボタンを押したときの時刻を表示します"
input time, 300, 25, 64
button "取得", *now
stop
*now
repeat 3
gettime tm.cnt, 4 + cnt ; 時間・分・秒を取得
loop
time = "" + tm.0 + ":" + tm.1 + ":" + tm.2
objprm 0, time ; inputを更新する
stop
これらのオブジェクトが不要になった場合の削除の説明をします。
前章説明したようにオブジェクトは1つのウィンドウで64個までしか作成できません。
オブジェクトは書式「clrobj オブジェクトID,オブジェクトID」で削除可能です。
p1のIDは削除し始めるIDで、p2に指定したオブジェクトIDまで削除します。
p1を省略すると一番初めに作成したオブジェクト(ID0)になります。
p2を省略したり、実際にあるオブジェクト数より大きい値を指定しても問題はありません。
-1を指定すると、p1から最後のオブジェクトIDまでを指定したことになります。
指定オブジェクトだけを消して、新しくオブジェクトを追加した場合にオブジェクトIDはどうなるのか?
消したことにより、削除されたオブジェクト以降のIDが塗り替えられると言うことはありません。
IDが0〜5で、2と3だけを消したとしても残ったオブジェクトのIDは0,1,4,5となります。
そして、そこへ新しくオブジェクトを配置すると、空いているIDの一番小さいものから埋められていきます。
つまり、この場合新しく配置したオブジェクトのIDは2となるわけですね。
buf = "3秒後に消去されます"
mesbox buf, 640, 480, 0
wait 300
clrobj 0 ; IDの0番を削除する
stop
他にもウィンドウ全体をクリアする命令でcls命令と言うものもあります。
この命令はウィンドウ内にあるすべてのもの(画像・文字・オブジェクト)を消去するものです。
書式は「cls クリアする色」です。ウィンドウの背景色も変更可能で色は4種類あります。
0は白色で、「color 255,255,255」と同色です。
1は淡灰色で、「color 191,191,191」と同色です(フルカラーモード)。
2は灰色で、「color 127,127,127」と同色です。
3は濃灰色で、「color 63,63,63」と同色です。
4は黒色で、「color 0,0,0」と同色です。
color 200
boxf ; 赤色で全体を塗りつぶす
mes "ボタンを押すと消去します"
button "clear",*clr
stop
*clr
cls 2 ; 灰色でクリア
stop
現段階ではレベルの高いobjsend命令の解説で締めましょう。
オブジェクトは決められた動きしかできませんね。
ボタン命令を例に挙げると、凸状で表面に1行だけテキストが書かれたオブジェクトが配置され、
押すことで初めて凹んで指定したラベル位置の処理に飛ばすことが出来ます。
こうした一連の動きや見た目のどこかを変えてしまうことが出来るものがobjsend命令です。
新しく何の機能が追加されるのかはオブジェクトによって異なります。
とりあえず書式を書くと「objsend ID,Win32メッセージ,wParam,lParam,lParamタイプ」となります。
p1のIDはオブジェクトIDを指定します。IDは配置順に0から付けられていきます。
p2にオブジェクトに送るメッセージの種類を、p3にオブジェクトに渡すパラメータを、
p4に内部的に受け渡しをする為の変数を指定して、p5にソレのタイプを指定します。
…と、書いても何が何なのかサッパリ分からないことと思います。
Win32メッセージの種類だけでも膨大に存在し、とても全て覚えきることが出来ません。
下記に使い方の説明だけはしておきますが、各パラメータの意味などは一切しませんのでご了承ください。
p4で指定するのは数値ですが受け渡しに使用しているため、直接数値で指定するとエラーになるので
FAQにも書いていますが数値変数で指定します。それ以外は直接数値指定でも問題ありません。
サンプルとしてボタンを元々へこんだものにしてしまいましょう。
objsize 100, 25
pos 100, 50 : button"へこみ解除", cancel
type = 0
objsend 0, $f3, 1, type,1
stop
*cancel
stop
これ以外にもたくさん機能はありますが、とても全部紹介することはできませんので
TIPSやサーチエンジンにて検索する等々をしてください。