メニュバーの項目としてのチェックボタン は既に解説しましたが、このセクションで解説するものは単独で使うウィジェットであり、別のものです。
■チェックボタンを生成開始
構文=
<親ウィジェット>と <グループ名>と <実行情報>で
チェックボタンを生成開始 → ID
注:グループ名は補助的であり不要なら空列とする
グループ名の長さ制限は80桁
注:実行情報はイベントと対応させる場合に必要と
なるもので、不要なら0を与える
プログラム例1: (イベントは発生させない)
ボタングループは ID。
○○とは
メインウィンドウと
空列と (←グループ名は使わない)
0で (←イベントは発生させない)
チェックボタンを生成開始し ボタングループに 入れ
プログラム例: (イベントを発生させる)
ボタングループは ID。
チェックボタン変化時の処理は (イベント引数 → ・)
〜略〜
。
○○とは
メインウィンドウと
「好きな野菜」と
チェックボタン変化時の処理の 実行情報で
チェックボタンを生成開始し ボタングループに 入れ
後続するチェックボタン群の生成に先立ってこの処理単語を実行します。
チェックボタン群を代表するID(グループID)が返されるので大域変数に保存してください。
グループ名は任意ですが(不要なら空列)これを与えておくと、イベントが発生した時に引数に積まれて来るので、複数のチェックボタングループを1つのイベント処理でまかなう場合、どのチェックボタングループからのイベントなのかを識別するのに役に立ちます。
多くの場合、チェックボタン群とは別に、たとえばOKボタンのようなものを別に設け、そのOKボタンが押された時に、OKボタンのイベント処理の一環としてチェックボタンの状態を”見に行く”形でプログラムを書くことが多いでしょう。
そうではなく、チェックボタンのどれか1つでも変化したとき、その瞬間にイベントを発生させたい場合には、そのイベント処理の処理単語の実行情報を与えてください。
■チェックボタンを生成
構文=
<グループID>と <項目名>と
<デフォルトオン指定>で
チェックボタンを生成 → ボタンID
注:グループIDは「チェックボタンを生成開始」で
得たものを与えます
注:項目名はボタンの右側に表示される文字列です
項目名の長さ制限は80桁
注:デフォルトオン指定は整数値で1か0を指定
注:ボタンIDはウィジェットとしてのIDです
値を参照したり、配置するのに使います
プログラム例:
ボタングループは ID。
とまとのボタンは ID。
きゅうりのボタンは ID。
○○とは
ボタングループと 「とまと」と 1で
チェックボタンを生成し とまとのボタンに 入れ
ボタングループと 「きゅうり」と 0で
チェックボタンを生成し きゅうりのボタンに 入れ
とまとのボタンと きゅうりのボタンと 2個で
これらの並べ配置のIDを取得し 配置すること。
↓描画例
[v] とまと ←デフォルトオン指定あり
[ ] きゅうり
チェックボタンを一つずつ生成します。
デフォルトオン指定として真を与えることで、デフォルトのチェックをオンにすることができます。
返されるボタンIDはウィジェットとしてのIDです。このあとチェックボタンの状態を見たい時や、配置をおこなうのに使います。
この処理単語から戻った時、チェックボタンは既に有効化されています。
■チェックボタンの値を参照
構文=
<ボタンID>を チェックボタンの値を参照 → 値(文字列)
プログラム例:
○○とは
とまとの値は 文字列実体 長さ 1桁
きゅうりの値は 文字列実体 長さ 1桁
とまとのIDを チェックボタンの値を参照し とまとの値に 入れ
きゅうりのIDを チェックボタンの値を参照し きゅうりの値に 入れ
チェックボタンの現在の値を参照します。返される値は "1" または "0" いずれかの文字列です。数値のように見えますがデータ型としてはあくまで文字列なので注意してください。
参照した値で分岐するなら、たとえば、
とまとの値が "1"に 等しい文字列
ならば ・・・
つぎに
あるいは
とまとが好き?とは
とまとの値が "1"に 等しい文字列であること。
のように記述してください。
なお、本処理単語が返す文字列は、ライブラリ内部に設置した文字列実体を指す文字列情報であるため、この情報を消費ないうちに再度参照すると前回の文字列が上書きされてしまうため、1回の参照ごとにユーザが確保した文字列実体変数に値を格納してください。"1" or "0" と分かっているので、先の例のように 長さ 1 で構いません。
■チェックボタンのイベント処理
チェックボタンが変化したときにイベントを起こすことができます。「チェックボタンを生成開始」を実行する際に、イベント処理の実行情報を渡すことでおこないます。
いずれかのチェックボタンが変化すると(オフ→オン or オン→オフ)、イベントが発生し、登録しておいたイベント処理単語が呼び出されますが、その際の引数は以下の通りです。
構文=
イベント処理語
↓ ↓4th ↓3rd ↓2nd ↓Top(引数個数)
○○のイベント処理とは (グループ名、項目名、 値、 3 → ・)
〜略〜
〜略〜。
注:”値”は整数です。
プログラム例:
チェックボタン変化時の処理とは (グループ名、項目名、 値("1"or"0")、 3 → ・)
グループ名は 文字列
項目名は 文字列
値は 文字列
(引数個数が) 3と 異なる
ならば 「イベント引数が誤り」で 重大エラー
つぎに
グループ名と 項目名と 値に 入れ
〜略〜
〜略〜。
イベント引数のうち、グループ名は「チェックボタンを生成開始」で与えたものです。
項目名は「チェックボタンを生成」で与えたものです。
値はボタンが変化した後のオン・オフ状態を示し、"1" または "0" いずれかの文字列です。数値のように見えますが型としてはあくまで文字列なので注意してください。
- 注
-
イベント処理語に渡される グループ名 と 項目名 は、ライブラリ内部に設置した文字列実体を指す文字列情報であるため、再度のイベント発生があると前回の文字列が上書きされてしまいます。これらの文字列を消費しないうちに次のイベントを受ける可能性がある場合は得た値を大域変数としての文字列実体変数に退避してください。
(値 は文字列ではあるものの、文字列定数として発生しているので退避の必要はありません)
■チェックボタンのサンプルプログラム
- checkbutton.src
- 基礎的なチェックボタンの使い方が分かります
- checkbutton-event.src
- チェックが変化したときにイベントを発生させるサンプルです
- labelframe.src
- チェックボタンとラジオボタンの両方を使う少し複雑なプログラムです。
配置手段として格子配置を使う例にもなっています。
メニュバーの項目としてのラジオボタン は既に解説しましたが、このセクションで解説するものは単独で使うウィジェットであり、別のものです。
■ラジオボタンを生成開始
構文=
<親ウィジェット>と <グループ名>と
<実行情報>と <デフォルトオンの番号>で
ラジオボタンを生成開始 → ボタングループID
注:グループ名は補助的であり不要なら空列とする
グループ名の長さ制限は80桁
注:実行情報はイベントと対応させる場合に必要と
なるもので、不要なら0を与える
プログラム例1: (イベントは発生させない)
ボタングループは ID。
○○とは
メインウィンドウと
空列と ←グループ名は使わない
0と ←イベントは発生させない
1番で ←デフォルトオン番号
ラジオボタンを生成開始し ボタングループに 入れ
プログラム例2: (イベントを発生させる)
ボタングループは ID。
ラジオボタン変化時の処理は (・・イベント引数・・ → ・)
〜略〜
。
○○とは
メインウィンドウと
「利用選択」と ←グループ名
ラジオボタン変化時の処理の 実行情報と ←イベント処理
1番で ←デフォルトオン番号
ラジオボタンを生成開始し ボタングループに 入れ
後続するラジオボタン群の生成に先立ってこの処理単語を実行します。
ラジオボタン群を代表するID(グループID)が返されるので大域変数に保存してください。
グループ名は任意ですが(不要なら空列)これを与えておくと、イベントが発生した時に引数に積まれて来るので、複数のラジオボタングループを1つのイベント処理でまかなう場合、どのラジオボタングループからのイベントなのかを識別するのに役に立ちます。
多くの場合、ラジオボタン群とは別に、たとえばOKボタンのようなものを別に設け、そのOKボタンが押された時に、OKボタンのイベント処理の一環としてラジオボタンの状態を”見に行く”形でプログラムを書くことが多いでしょう。
そうではなく、ラジオボタンのどれか1つでも変化したとき、その瞬間にイベントを発生させたい場合には、そのイベント処理の処理単語の実行情報を与えてください。
デフォルトオンの番号は整数値で、初期描画時に選択状態にするボタンの通し番号(1から数える)を指定します。
■ラジオボタンを生成
構文=
<ボタングループID>と <項目名>と
<値(文字列)>で ラジオボタンを生成 → ボタンID
注:グループIDは「ラジオボタンを生成開始」が返した
ものを与えます
注:項目名はボタンの右側に表示される文字列です
項目名の長さ制限は80桁
注:値は選択値を参照する際に返すものです
値の長さ制限は40桁
注:ボタンIDはウィジェットとしてのIDです
配置するのに使います
プログラム例:
ボタングループは ID。
○○とは
デフォルトオンの番号は 定数 1
利用ボタン1は ID
利用ボタン2は ID
(生成開始)
メインウィンドウと
「利用選択」と
0と ←イベントは発生させない
デフォルトオンの番号で
ラジオボタンを生成開始し ボタングループに 入れ
(ラジオボタン生成1)
ボタングループと 「利用する」と "yes"で
ラジオボタンを生成し 利用ボタン1に 入れ
(ラジオボタン生成2)
ボタングループと 「利用しない」と "no"で
ラジオボタンを生成し 利用ボタン2に 入れ
(配置)
利用ボタン1と 利用ボタン2と 2個で
これらの並べ配置のIDを取得し 配置する
↓描画例
(.) 利用する ←初期選択(デフォルトオンの番号が1なので)
( ) 利用しない
ラジオボタンを一つずつ生成します。
ボタンに対して値(文字列)を指定しますが、これは「ラジオボタンの選択を参照」の時に返されます。そのボタンを識別できる文字列であれば何でも構いません。上記例では "yes" と "no" を指定しています。
返されるボタンIDはウィジェットとしてのIDであり、後続して配置をおこなうのに使います。
この処理単語から戻った時、ラジオボタンは既に有効化されています。
■ラジオボタンの選択を参照
構文=
<ボタングループID>を ラジオボタンの選択を参照 → 値(文字列)
プログラム例:
○○とは
利用希望は 文字列実体 長さ 3桁
ボタングループで ラジオボタンの選択を参照し 利用希望に 入れ
ラジオボタン群のうち現在選択されているボタンの値を参照します。返される値は、「ラジオボタンを生成」で登録した値(文字列)です。
先のプログラム例では「ラジオボタンを生成」で指定した値の "yes" か "no" のいずれかが得られます。
参照した値で分岐するなら、たとえば、
利用希望が "yes"に 等しい文字列
ならば ・・・
つぎに
あるいは、
利用希望?とは
利用希望が "yes"に 等しい文字列であること。
のように記述してください。
なお、本処理単語が返す文字列は、ライブラリ内部に設置した文字列実体を指す文字列情報であるため、この情報を消費ないうちに再度参照すると前回の文字列が上書きされてしまうため、1回の参照ごとにユーザが確保した文字列実体変数に値を格納してください。
■ラジオボタンのイベント処理
ラジオボタンによる選択が変化したときにイベントを起こすことができます。
この機能は「ラジオボタンを生成開始」の際、イベント処理をおこなう処理単語の実行情報を渡すことで有効となります。
ラジオボタンの選択が変化するとイベントが発生し、登録しておいたイベント処理単語が呼び出されます。その際の引数は以下の通りです。
構文=
イベント処理語
↓ ↓3rd ↓2nd ↓Top(引数個数)
○○のイベント処理とは (グループ名、 値(文字列)、 2 → ・)
〜略〜
〜略〜。
注:”値”は整数です。
プログラム例:
ラジオボタン変化時の処理とは (グループ名、 値(文字列)、 2 → ・)
グループ名は 文字列
値は 文字列
(引数個数が) 2と 異なる
ならば 「イベント引数が誤り」で 重大エラー
つぎに
グループ名と 値に 入れ
〜略〜
〜略〜。
イベント引数のうち、グループ名は「ラジオボタンを生成開始」で与えたものです。
値は選択されたボタンに対応した登録値です。先の「ラジオボタンを生成」のプログラム例での登録値は "Yes" "no" だったのでそのいずれかが返されます。
- 注
-
イベント処理語に渡される値(文字列)は、ライブラリ内部に設置した文字列実体を指す文字列情報であるため、再度のイベント発生があると前回の文字列が上書きされてしまいます。この値(文字列)を消費しないうちに次のイベントを受ける可能性がある場合は得た値を大域変数としての文字列実体変数に退避してください。
■ラジオボタンのサンプルプログラム
- radiobutton.src
- 基礎的なラジオボタンの使い方が分かります
- radiobutton-event.src
- ラジオボタンによる選択が変化したときにイベントを発生させるサンプルです
- labelframe.src
- チェックボタンとラジオボタンの両方を使う少し複雑なプログラムです
配置手段として格子配置を使う例にもなっています。
機能としてはチェックボタンやラジオボタンと似ていますが、たとえば都道府県を選ぶなど、選択肢が多い場合はチェックボタンやラジオボタンでは全体の表示域も大きくなってしまいます。そのようなときリストボックスを使えば、狭い表示域にたくさんの選択肢を収容することができます。また複数選択をおこなうこともできます。
■リストボックスの生成
構文=
(ステップ1)
<親ウィジェット>と
<行数>と <桁数>で
フレーム収容のリストボックスのIDを取得
→ リストフレーム、リストID、スクロールID
(ステップ2)
<選択モード>を <リストID>に リスト選択モードを設定 → ・
(ステップ3)
<リストフレーム>と <リストID>と <スクロールID>で
リストボックスをスクロールバー付きで有効化 → ・
注:行数と桁数は整数
注:後続してリストフレームを配置することで描画してください
プログラム例:
リストボックスを設置とは (・ → ・)
Listフレームは ID ←これら3つのIDで1セット
ListIDは ID
ScrollIDは ID
(リストボックスの確保)
メインウィンドウと
8行と 15桁で
フレーム収容のリストボックスのIDを取得し
Listフレームと ListIDと ScrollIDに 入れ
(動作モード)
単一選択を ListIDに リスト選択モードを設定し
(有効化)
Listフレームと ListIDと ScrollIDで
リストボックスをスクロールバー付きで有効化し
(配置)
Listフレームを 並べ配置のIDを取得し 配置すること。
リストボックスの表示は手間がかかります。ネイティブなリストボックスに加え、それとセットになるスクロールバーの確保も行うために少し複雑になっています。ただ、定型文として扱えばそれほど難しくはありません。
リストボックスとスクロールバーを合わせて1フレームに収容する仕様です。
他のウィジェットの配置もある場合には、リストボックスのフレーム(上記例で "Listフレーム" )を1つのウィジェットであるかのように扱ってください。
記: フレームにまとめるのはGUIエンジンの仕様ではなく、本ライブラリの設計としてそのようにしています
行数と桁数について補足します。
行数はリストボックスの見た目上、何行分を表示するかを指定するものです。
リスト項目数がこの行数より多い場合には先頭のうちこの行数分だけがとりあえず表示され、奥のデータはスクロールして見ることになります。この表示のための行数とリスト内部の収容能力とは関係がなく、内部収容としての行数には特に制限はありません。
桁数はウィジェットの表示上の横幅を指定するものです。桁数を超えたデータでもリストに入れられますが、末尾のみ異なる複数のデータを見た目で区別できなくなるため、予想されるデータの最大桁数を指定するのが良いでしょう。
■リストボックスの属性設定
構文=
↓文字列定数
<選択モード>を <リストボックスID>に
リスト選択モードを設定 → ・
選択モード:以下のいずれかの単語名を指定してください
単一選択
複数選択 ←あまり使わない
拡張選択 ←複数選択はこちらを推奨
リスト項目を単一で選ぶのか複数選ぶのかを指定します。「リストボックスをスクロールバー付きで有効化」より前に指定してください。
複数の場合は「複数選択」ではなく「拡張選択」のほうをを推奨します。理由は、Ctrl-左クックやShift-左クリックによる選択追加、Ctrl-Aによる全選択など、Windowsでの標準的な項目選択の機能が使えるからです。サンプル "listbox-multi.src" でもそのようにしています。
■リストボックスの項目追加
構文=
<項目名>を <リストボックスID>に リスト項目を追加 → ・
リストに1つの項目を(末尾に)追加します。項目数分だけ繰り返しおこなってください。
追加された項目に対しては、先頭を1とした整数が自動的に振られます。選択結果から番号を得たとき、その番号が返されます。
項目名に含まれる文字の注意は以下の通りです。
- ・改行コード(文字列定数であればソース中に &LF& を挿入)
- リスト表示では改行は無視されますが、選択結果には改行が含まれます(あまり推奨できません)
- ・波括弧 { }
- 開きと閉じの対応がとれていれば使えます。アンバランスな場合には実行時にエラーが発生します
■選択結果を取得
構文=
(方法1)
<リストボックスID>を 選択結果を取得 → 選択結果文字列
(方法2) ↓文字列実体変数明記
<リストボックスID>を <文字列実体変数>をつかい
選択結果を取得 → 選択結果文字列
選択結果を特殊な1つの文字列形式として得ます。
何も選択されない場合の選択結果は空列です。
「方法2」は、得た文字列の原始格納先となる文字列実体変数を明示する方法です。
”選択結果文字列”は、ライブラリ内部に設置した文字列実体を指す文字列情報であるため、この情報を消費しないうちに再度取得すると前回のデータが上書きされてしまいます。これを避けるためには、取得の都度消費してしまうか、あるいは前記 「方法2」 で示すように、取得先の文字列実体変数を(取得毎に異なる文字列実体を)明示する形式で呼び出してください。
ライブラリ内部で結果を蓄える文字列実体変数は長さが4000バイトであるため、多くの選択肢があって、それらを全部選択するような操作を許容して容量を超えそうなケースも 「方法2」 によって取得してください。
■選択結果のフォーマット
選択結果となる原始文字列は次のようなフォーマットになっています。(下記はGUIエンジン次元でのデータであり、3項目が選択されていた場合です)
11 12 13
上記のように複数の項目番号を空白で区切って連結した形式です。(GUIエンジン仕様では項目番号は0から数えています。
何も選択されなかった場合には、選択結果を表す文字列は空列になります。つまり選択結果が空列であることをして「キャンセルされた」と解釈すると良いでしょう。
単一選択の場合は、数値1つだけの結果が得られます。たとえば、
0 ←先頭項目が選択されていた場合
のようなものです。
ここまでGUIエンジン内部のデータ形式を解説しました。次に、Mindのプログラムとしては次のような記述で個々の項目番号を取り出してください。
(単一選択を処理する例)
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
選択結果は 文字列
項目番号は 変数
・・で 選択結果を取得し 選択結果に 入れ
選択結果が 空列?
ならば ・・キャンセル対応の処理・・
さもなければ
選択結果を 一つの選択を数値に変換し 項目番号に 入れ
項目名(項目番号)を ・・し
・・・・
つぎに
「一つの選択を数値に変換」は後述します
\___________________________/
(複数選択を処理する例)
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
選択結果は 文字列
単語は 文字列
項目番号は 変数
・・で 選択結果を取得し 選択結果に 入れ
選択結果が 空列?
ならば ・・キャンセル対応の処理し・・
終り
つぎに
ここから
選択結果から 単語切り出し 単語に 入れ
単語が 空列?
ならば 打ち切り
つぎに
単語を 一つの選択を数値に変換し 項目番号に 入れ
項目名(項目番号)を ・・し
繰り返し
「一つの選択を数値に変換」は後述します
\___________________________/
少し話が飛びますが、上記の赤字部分を補足します。
項目名(項目番号)を ・・・・し
という記述で項目名を得ています。
リストボックスを生成するとき、全項目名を配列形式で保持するようなプログラムになっていて、その配列名が「項目名」だと仮定しています。その配列をここで参照して項目名を得た・・という想定のプログラムです。
リストに入れるべき多くの項目名を保持する方法としてたとえば、"listbox.src" というサンプルプログラムでは、
野菜名は 文字列定数配列
「大根」 「人参」 「ジャガイモ」 「サトイモ」・・・
「れんこん」 「やまのいも」 「白菜」 「キャベツ」・・
のように、項目名を文字列定数配列として定義しています。この配列状の項目名は、リストを生成する段階で使うだけでなく、選択肢番号から元の項目名を再生するのにも使えます。
■一つの選択を数値に変換
先のプログラム例で既に使っていますが、選択結果から項目番号を(文字列として)一つ得たあと、それを数値としての項目番号に変換するのに使う簡単な処理単語です。
構文=
<項目番号(文字列)>を 一つの選択を数値に変換 → 項目番号(数値)
(例)
文字列 "3" を与えると → 整数 4 が返されます。
GUIエンジン次元では項目番号は0から数えていますが、本処理単語が介入し、1からの番号に補正しています。
■選択を解除
構文=
それまでの選択を解除して無選択の状態にします。
サンプル "listbox-multi.src" で使っています。
■リストボックスのサンプルプログラム
- listbox.src
- 基礎的なリストボックスの使い方が分かります
(並べ配置を使っています)
- listbox-multi.src
- 複数項目を選択できるリストボックスです
(外観は listbox とそっくりですが格子配置を使っています)
見出し付きフレームはフレームの一種です。通常のフレームはその存在を隠し、複雑な配置をするために使いますが、見出し付きフレームはあえて存在を見せるもので、かつ枠上に見出しを付けられます。
いくつかのウィジェット群を、見た目上でグループ化させる目的で使います。
基本はフレームであるため、使い方はフレームとよく似ています。
フレーム の解説も併せてお読みください。
■見出し付きフレームのIDを取得
構文=
<親ウィジェット>で 見出し付きフレームのIDを取得 → フレームID
■見出しを設定
構文=
<文字列>を <フレームID>に 見出しを設定 → ・
プログラム例:
「ごはんの量」を ボタン群のフレームに 見出しを設定し
■見出しの位置を設定
構文=
<位置の指定>を <フレームID>に 見出しの位置を設定 → ・
位置の指定:以下のいずれかのシンボルを指定してください
西寄り
北西寄り ←デフォルト
北寄り
北東寄り
東寄り
南東寄り
東南寄り
南寄り
南寄り
南西寄り
プログラム例:
ボタン群のフレームは ID。
ごはんの量のフレームを設置とは (・ → ・)
メインウィンドウで 見出し付きフレームのIDを取得し
ボタン群のフレームに 入れ
北寄りを ボタン群のフレームに 見出しの位置を設定し
「ごはんの量」を ボタン群のフレームに 見出しを設定し
ボタン群のフレームを 有効化し
(注:引き続き配置が必要です。この例では「ボタン群のフレーム」を
配置してください)
見出し付きフレームの枠上に見出しを付けられますが、枠のどの位置に表示するかを指定します。デフォルトは北西寄りなので枠の左上隅(線上)に表示されます。
(見出しの位置)
┌見出し−−┐ ┌−見出し−┐ ┌−−見出し┐
| | | | | |
|北西寄り | |北寄り | |北東寄り |
| | | | | |
└−−−−−┘ └−−−−−┘ └−−−−−┘
┌−−−−−┐
|西寄り | 西寄り・東寄りは
見出し | 見栄えが悪いので
| | あまり使えません
└−−−−−┘
┌−−−−−┐ ┌−−−−−┐ ┌−−−−−┐
| | | | | |
|南西寄り | |南寄り | |南東寄り |
| | | | | |
└見出し−−┘ └−見出し−┘ └−−見出し┘
■見出し付きフレームのサンプルプログラム
"labelframe.src" というサンプルプログラムがあります。このアプリの画面ではチェックボタン群とラジオボタン群の2つの表示域に大きく分かれていて、それぞれの表示域を見出し付きフレームで囲っています。
プログラム例:(labelframe.src より抜粋)
チェックボタンを設置とは (・ → ・)
〜略〜
メインウィンドウで
見出し付きフレームのIDを取得し
Checkボタンのフレームに 入れ
Checkbutton群のタイトルを Checkボタンのフレームに 見出しを設定し
北寄りを Checkボタンのフレームに 見出しの位置を設定し
Checkボタンのフレームを 有効化し
〜略〜
ラジオボタンを設置とは (・ → フレームID)
〜略〜
メインウィンドウで
見出し付きフレームのIDを取得し
Radioボタンのフレームに 入れ
Radioボタン群のタイトルを Radioボタンのフレームに 見出しを設定し
北寄りを Radioボタンのフレームに 見出しの位置を設定し
Radioボタンのフレームを 有効化し
〜略〜
これとは別に、時間経過後にイベントを発生する「遅延実行」という概念(処理単語は「遅延実行を予約」)もあります。詳細は 「イベント処理」−「遅延実行」 をお読みください。
所定の時間経過後にある処理を行いたい場合には 「遅延実行」 という機構がありました。
それとは別に、単純に所定の時間だけ待つ機能が「遅延」という処理単語です。
■遅延
構文=
プログラム例: (3秒の遅延)
3000ミリ秒だけ 遅延し
↑数字に続く「ミリ秒」に意味はありません。
プログラムの意図が分かるよう書いたものにすぎません
単に時間待ちをおこなう処理単語です。待ち時間の長さとしてミリ秒単位の整数を指定します。
待ちの間にもGUIエンジンのイベント処理は行われるのでマウスやキーボードにも反応できます。
時間指定がミリ秒単位になっているものの、その単位で正確なわけではありません。誤差があることを承知して使ってください。(この点は、遅延実行の機構と同じです)
- 記:
-
「遅延」と同じ目的で、コンソールアプリケーションのための(fileライブラリ装備の)「一秒待ち」などの処理単語も使えます。
「遅延」に該当するのは「ミリ秒単位で待ち」になり、スタック仕様は同じです。
- 記:
-
「遅延」あるいは「ミリ秒待ち」に与える値として20ミリ秒以下を指定するのは誤差のため意味がないので避けてください(元々、20ミリぐらいの誤差があります)。
- 注:
- 遅延待ちの間に別のイベントが発生し、そちらでも遅延を行わせると(タイミング的に重複)極端に大きな誤差か出ることがあります。(「遅延」ではなく「n秒待ち」系の単語を使った場合も同様です)
たとえば以下のようなケースです。
イベント処理A
・・・・
Aミリ秒だけ 遅延し
イベント処理B
・・・・
Bミリ秒だけ 遅延し
または
外部プログラムの実行など時間のかかる処理
・・・・
上記において、「イベント処理A」実行中に(多くの場合遅延中)、「イベント処理B」が呼び出され、そちらでも遅延をおこなった場合(あるいは外部プログラム実行など時間のかかる処理をおこなう)、最終的に「イベント処理A」での遅延は Aミリ秒 ではなく、[Aミリ秒かBミリ秒の大きい方にわずか加えた] 値となり、期待したものより大きな遅延になる可能性があります。
このようなプログラム構成とタイミングで使われる場合には遅延時間はあまり当てにならなくなります(しかし期待したものより小さな遅延になることはありません)。これはGUIエンジンの特性によるもので、障害ではありませんのでご承知ください)
この問題を回避するためには、「遅延」や「n秒待ち」ではなく、「遅延実行を予約」を使ってください。なお本機能と遅延実行の機構との併用は可能です。
「遅延」による時間待ちは簡単に書けるのが利点ですが、上に書いたような使用上の制限があります。それが気になる場合は「遅延実行を予約」のほうをお使いください。すべての事象は明なイベントを発生させて処理するというGUIプログラミングの考え方としては(ソースコードは増えますが)「遅延実行を予約」が本来の形です。
「遅延」より「遅延実行を予約」のほうを選択すべき例を下に挙げます。
プログラム例:(改善前)
メインとは
〜略〜
"〜"を ロゴ表示し
〜略〜
〜略〜
2000ミリ秒だけ 遅延し
ロゴ表示を消すこと。
上のプログラムはアプリケーション起動時にロゴを表示するものです。
2秒間だけの表示とするため、メインの最後で2秒の遅延のあとロゴを消しています。
一見するとまったく問題ないように見えます。事実、これで特段の問題は無いのですが、ここは「遅延」ではなく、「遅延実行を予約」のほうを使うべきです。
たとえば次のようにします。
プログラム例:(改善後)
ロゴを消すイベント処理とは (イベント引数 → ・)
イベント引数を捨て
ロゴ表示を消すこと。
メインとは
〜略〜
"〜"を ロゴ表示し
〜略〜
〜略〜
2000ミリ秒と
ロゴを消すイベント処理の 実行情報と 空列で
遅延実行を予約すること。
思い起こして欲しいのですが、「メイン」もまたイベント処理の一つであり、イベント処理というものはすべからく、なるべく早く処理を終わらせてリターンすることが肝要です。
この点で言うと改善前のプログラムでは、「メイン」の実行がその末尾で2秒間も滞留することになります。
一方、改善後のプログラムは遅延実行を予約するだけで直ちにメインを終了できており、こちらのほうが理想となります。
「遅延」は簡単なテストプログラムであるとか、プログラムの構成上やむを得ないケースに留めるのが良いでしょう。
■遅延のサンプルプログラム
- delay.src
- 3秒だけ遅延する簡単なテストです
■計算式を評価
構文=
<計算式(文字列)>を 計算式を評価 → 結果(文字列)、合否(整数))
注:結果は数値そのものではなく、数値を
表す文字列であること注意してください。
注:計算式が正しくない場合(無効な文字や
演算子を含んだり、演算子の組み合わせ
が異常など)には空列と偽を返します。
数式を文字列として指定するとそれを計算し、数式が正しければ文字列形式の値と真を、さもなければ空列と偽をして返してきます。整数のほかに実数も使えます。
たとえば文字列として、
「sqrt(100)」
を与えると、
「10.0」
という文字列形式の値と、成功を示す 真 の2つがスタックにが返されます。
プログラム例:(entry-dentaku.src よりイベント処理部を抜粋)
ボタン押下処理とは (0(引数個数=0) → ・)
結果は 文字列
合否は 変数
メッセージは 文字列実体 長さ 100桁
イベント引数を捨て
エントリー記憶で 入力文字列を参照したものを
計算式を評価し 結果と 合否に 入れ
合否が 偽?
ならば 「数式に誤りがあります」をつみ、
さもなければ
「結果は 」を メッセージに 入れ
結果を メッセージに 追加し
「 です」を メッセージに 追加し
メッセージをつみ
つぎに
ラベル記憶に テキストを設定し
ラベル記憶を 変更を反映する。
記: 本処理単語は生成した文字位置列をライブラリ内部の文字列実体変数に格納し、そこを指す文字列情報をスタックに返します。その仕組み上、2度続けて本単語を呼び出すと後の実行で前の文字列を破壊してしまうので、もし最初に取得した文字列を消費しないまま次の単語呼び出しをする場合は、ユーザが別途獲得した文字列実体変数に退避するか、あるいは、得た結果を直ちに数値に変換してから保存するようにしてください。(小数が返されるケースに注意)
Mindの標準でも [ 〜 ] を使うことで数式表現がサポートされています。たとえば、
[単価 × 数量]を ・・・し
のような書き方です。しかしMindでの数式表現では数式自体(=計算の構造)はハードコーディングになっているので、”実行時に数式が与えられる” ことには対応できません。本機能はそのようものにも適用でき、電卓のように使うことができます。
- 注
-
GUIエンジンのTclに制御を渡すことで実現しています。(Tcl管轄の expr というコマンドを使っています)
数値の扱いや演算能力はTclの能力に依存するため、業務用途に使うには事前に調査をしてからご利用ください。
- 注
-
記:表現できる数式表現や精度など詳しいことは検索サイトで「Tcl/Tk 数値計算」を検索するなどして調べてください。
例としては他者さんのサイトで恐縮ですが、たとえば以下のWebページは参考になるかと思います。(別タグで開きます)
--------------
Tclの数式について | ITドカタ
https://blog.it-see.net/it-dokata/tcl-tk/calculation/
--------------
Tcl8.4.1コマンドリファレンス expr
https://www.freesoftnet.co.jp/webfiles/ 〜略〜 expr_jp.htm#google_vignette
--------------
■計算式を評価のサンプルプログラム
- entry-dentaku.exe
- 数式を入力することで簡易的な電卓のように使います。
処理単語「計算式を評価」を使っています。