Last Update : 2007/07/xx
メッセージボックスオブジェクトの設置です。命令名の由来は、「message box」から。任意の文字列を複数行分表示することができる領域を持ったオブジェクトです。1行分の文字表示ならばinput命令を使用できます。
命令の形式は、下のようになっています。オブジェクトの表示位置はpos命令を使い、表示サイズはobjsize命令でも反映できます。メッセージボックスの設置前、第1パラメータの変数にあらかじめ文字列を指定しておくと、実際にそれが反映されたメッセージボックスが表示されます。
mesbox 変数, 横幅サイズ, 高さサイズ, スタイル, 最大文字数
第3パラメータのスタイルは下のような感じです。デフォルトではスタイル1が適用されており、横方向スクロールバーの有無と、編集できるかできないかの違いです。縦方向スクロールバーは必ず表示されます。(スタイル2と3は、HSP2とHSP3で挙動が変更されています。HSP3でスタティックテキストを表示したい場合は)
スタイル | 編集 | |
0 | 横スクロールバーのないメッセージボックス (行が収まらない時は右端で折り返し) |
X |
1 | O | |
2 | [HSP2] 文字列を表示する「スタティックテキスト」オブジェクト | X |
[HSP3] 横スクロールバーのないメッセージボックス (0と同じ) | X | |
3 | [HSP2] 文字列を表示する「スタティックテキスト」オブジェクト | X |
[HSP3] 横スクロールバーのないメッセージボックス (1と同じ) | O | |
4 | 横スクロールバー付きのメッセージボックス | X |
5 | O |
sdim buf, 1024 buf = "あいうえお\nメッセージボックス\nmesbox命令\n内部的にはエディトコントロール" ; オブジェクトの表示位置 pos 50, 50 ; メッセージボックス設置 mesbox buf, 200, 45, 0 mesbox buf, 200, 45, 1 stop
ボックスの内の表示文字列のフォントを指定するにはobjmode命令(モード2)+font命令を呼びます。メッセージボックスを削除するにはclrobj命令、ボックス内にフォーカスを移すにはobjsel命令を利用します。ボックス内に文字を入力できないよう無効化するには、objgray命令(obj.asモジュール)やHSP 3.2以降で標準のobjenable命令があります。
★ メッセージボックスの制限
HSPのメッセージボックスは、エディトコントロール(複数行)というGUIが使われてます。これにはWindowsの仕様で扱えるサイズ(文字量)に制限があり、デフォルトで「32KB」(32,766バイト)までとなってます。ただ、2倍の「64KB」(65,535バイト)まで拡張できるようになっており、HSPはこの拡張されたサイズが内部で適用してあります。ちなみに、Windows
9x系OS(Windows 98/Me)の場合は、この文字量に達する前の段階で挙動がおかしくなるバグがあります。
この他に、HSP3スクリプトエディタのようにフレーズごとに文字色を変えることはできません。このような制約を受けたくないならば、別のエディトコントロールを利用してください。(→
参照、HSP Tips:エディトコントロール)
メッセージボックスを設置した後に、ボックス内の文字列を変更するには、各種オブジェクトの様々な制御を行うobjprm命令を利用します。オブジェクトIDは、スクリプト上の設置順に0から割り振られるHSP独自の数値です。
下のサンプルでは、横スクロールバーの有無の違いが分かるよう、スタイル&フォントサイズの違うメッセージボックスを2つ用意し、同じテキスト文章を表示させる形になってます。テキストファイルの読み込みはbload命令ではなく、メモリノートパッド機能のnote〜命令(noteload命令)を利用します。
また、このサンプルではsdim命令で4048バイトを確保しているため、このサイズの文字量しか利用できません。上で書いたように扱える文字量の最大は「64KB」(65,535バイト)なので、sdim命令で明示的に確保してください。
// テキストファイルの読み込み表示 sdim buf, 4048 objmode 2 font "", 10 ; 横スクロールバーなし pos 10, 10 mesbox buf, 300, 400, 1 font "", 20 ; 横スクロールバーあり pos 310, 10 mesbox buf, 300, 400, 5 ; デフォルトGUIフォントに戻す用 objmode 1 button "読み込み...", *load stop *load ; ファイルの読み込みダイアログ dialog "txt", 16, "テキスト" if stat = 0 : stop notesel data noteload refstr ; メッセージボックス内の書き換え反映 objprm 0, data objprm 1, data stop
HSPに付属するサンプルコード(「sampe\basic\」フォルダ内)のリストから選択したスクリプトファイルを表示します。「*.hsp」のファイル一覧リストはdirlist命令を利用して取得します。
// サンプルファイルの超簡易ビューアー sdim list, 1024 sdim buf, 8096 ; 拡張子が「*.hsp」のファイルリストを取得 dirlist list, "sample\\basic\\*.hsp", 3 objsize 150 listbox id, 250, list button "表示", *load pos 150, 0 mesbox buf,450, 450, 5 stop *load ; ファイルリストからファイル名取得 notesel list noteget filename, id ; HSPファイルの読み込み notesel buf noteload "sample\\basic\\"+filename+" title "選択項目:"+id+" / ファイル名:"+filename+" / サイズ:"+strsize+"byte objprm 2, buf stop
ついでに、メッセージボックスの内容をテキストファイルとして保存する方法です。同じくメモリノートパッド機能のnote〜命令(notesave命令)を利用します。
// テキストファイルの出力保存 sdim buf, 4048 mesbox buf, 500, 200 button "保存...", *save button "クリア", *clear stop *clear ; 空文字指定ならクリア(全消去) objprm 0, "" stop *save ; ファイルの名前をつけて保存ダイアログ dialog "txt", 17, "保存名" if stat = 0 : stop notesel buf notesave refstr mes "保存しました。" stop
メッセージボックスに表示されている文字列の最後に新規の文字を追加する処理です。mesbox命令の第1パラメータで指定した文字列型変数には現時点で入力されている文字列が代入されてます。これに新規の文字をプラス(+)してから、ボックス内の文字列を変更するobjprm命令で反映させてやればOK。
// [HSP3] mesbox命令 文字の追加 sdim buf, 1024 buf= "HSP講座 mesbox命令\nだよーん" mesbox buf, 400, 200 button "時刻", *add stop *add ; 時刻の文字を追加 buf += "\n"+gettime(4)+"時 "+gettime(5)+"分 // こういう書き方もOK (こっちの方がパフォーマンスよろし) ; poke buf, strlen(buf), "\n"+gettime(4)+"時 "+gettime(5)+"分 ; メッセージボックス内に変更反映 objprm 0, buf
HSP2には、mesbox命令の第3パラメータにスタイル2を指定すると、スタティックテキスト(スタティックコントロール)というオブジェクトの設置になります。
このスタティックテキストオブジェクトは、単純に文字列を表示するオブジェクトです。編集は不可能、スクロールバーもありません。文字列の「描画」を行うmes命令と違って、オブジェクト上に表示されているので、もともと表示してある文字列を消す必要なく、objprm命令を使って文字列変更ができます。
; [HSP2のみ] スタティックテキスト buf = "数値UP" pos 10, 10 mesbox buf, 100, 20, 2 objsize 100 button "スタート!", *start stop *start repeat ; スタティックテキスト内の書き換え objprm 0, ""+cnt wait 16 loop
なお、HSP3(HSP 3.x)ではこのスタイルは廃止になっています。ただ、代替モジュール「common\hsp3util.as」が用意されており、winobj命令を利用して設置します。(→ 詳しくはHSP3 あれこれ オブジェクト3を参照)
メッセージボックスに関連したHSP3(HSP 3.x)向けの発展的なサンプルコードを公開しています。sendmsg命令、Windows API関数などを利用して、基本的な命令では実現できない発展的な処理を実現してみます。
たとえば、表示位置(左寄り・中央)の指定、1つの統一された文字色・背景色の変更、など。
→ HSP3オブジェクトの全般的な情報
→ sendmsg命令のコード
(入力ボックス・メッセージボックス)
→ メッセージボックス関連の発展的なサンプルソース