コンソールアプリケーションでは「メインとは」の処理が最後まで到達するとプログラムは自動的に終了しました。
しかし、GUIアプリケーションでは「メインとは」の処理が最後まで行っても終了せず、ウィンドウは開いたままです。一般的には、このあと何らかのマウス操作やキー入力などのイベントで引き続き処理が行われることになります。次のような感じです。
(1)メインが起動
→初期画面を描画する
(2)イベントが発生1
→対応するイベント処理をおこなう
→何らかの画面の変化が起こることが多い
(3)イベントが発生2
→対応するイベント処理をおこなう
→何らかの画面の変化が起こることが多い
・・・以下同様・・・
実は「メインとは」の処理もまた、イベントとして実行されています。アプリケーションが起動した後、最初のイベントは”メインを実行する”ことです。
- 注
-
上記で
メインが起動 → 初期画面を描画する
とありますが、メインの末尾まで到達すると初期画面の描画が完了するわけではありません。
ユーザプログラムで何らかの描画をおこなった場合、すべて内蔵のGUIエンジンへのリクエストとして保留され、ほんのわずかな時間を置いて実際に描画されます。
多くの場合「メインとは」の最後まで来た段階ではまだほとんど実際の描画は行われていませんが、この時間差はわずかであるため見た目としては直ちに描画されているように見えます。イベント処理での描画についても同様です。
GUIアプリケーションは以下のいずれかで終了します。
・「メインウィンドウを ウィンドウを閉じる」を実行する
・「実行終り」を実行する
・重大エラーの発生(ランタイムライブラリ内での強制終了)
・タイトルバー右上隅にある「×」をクリック(Windows OS標準)
・Alt-F4 の打鍵(Windows OS標準)
「ウィジェット」は「ラベル」や「ボタン」など、ウィンドウ内に置く部品です。小さな部品だけでなく「テキストウィジェット」や「キャンバス」といった大規模なものもあります。ウィンドウ自体も1つのウィジェットです。
サンプルプログラムの一つ、hellowin.exe を起動してみてください。
hellowin はラベルを一つだけ描画するごく小さなGUIプログラムです。
次にソースファイル、hellowin.src をご覧ください。
hellowin.src
メインとは
ラベル1は ID
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
ラベル1を 有効化して配置する。
まず、「ラベルのIDを取得」でラベルウィジェットを生成する準備に入ります。
次の行で「テキストを設定」によってそのラベルに文字(列)を設定しています。
次の、
ラベル1を 有効化して配置
にて、ラベル1をここで確定・生成し、さらに「配置」までおこなっています。
ウィジェットは生成するだけではまだ画面に現れません。画面内にどのように配置するかの指示であるところの「配置」をもってようやく画面に表示されます。
- 注
-
上記で
「配置」をもってようやく画面に表示されます
と書いていますが、厳密には「配置」を実行すると直ちに描画がおこなわけではありません。
「配置」に限らずユーザプログラムでの描画操作はすべて内蔵のGUIエンジンへのリクエストとして保留され、ほんのわずかな時間を置いて実際に描画されます。多くの場合「配置する」の直後ではまだ、実際の描画は行われていません。しかしこの時間差はわずかであるため見た目としては直ちに描画されているように見えます。
ウィジェットを画面に表示するには最後の手続きとして「配置する」と書くことが欠かせない・・という意味であるとご理解ください。
ウィジェットのIDを取得
構文=
<親ウィジェット>で ラベルのIDを取得 → ID
<親ウィジェット>で ボタンのIDを取得 → ID
<親ウィジェット>で メッセージのIDを取得 → ID
<親ウィジェット>と <桁数>で エントリーのIDを取得 → ID
ラベルを表示する時の全体
(ID取得)
<親ウィジェット>で ラベルのIDを取得 → ラベルID
(属性設定)
・・・を <ラベルID>に ○○を設定 → ・
・・・を <ラベルID>に ○○を設定 → ・
(有効化(配置))
<ラベルID>を 有効化して配置 → ・
ラベル、ボタンなど単純なウィジェットの生成準備をおこないます。
単純なウィジェットの種類:
ラベル
|
文字を表すためのウィジェットで短いテキストに使います
(ウィジェット幅より長い文字列は末尾が表示されません)
(ビットマップやイメージも表示できます)
|
ボタン
|
名前の通り
ボタンを押したときにイベントを発生させることができます
|
メッセージ
|
ラベルと似ているが長いテキストを表示するのに使われます
(長い文字列を折り返すことで確実に全長を表示します)
(ビットマップやイメージも表示できます)
|
エントリー
|
キーボードから文字列入力をおこなうためのウィジェット
|
プログラム例:(ID取得のみ)
メインとは
ラベル1は ID ←IDを格納する変数
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
↑親ウィジェット
プログラム例:(描画までの全体)
メインとは
ラベル1は ID
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
ラベル1を 有効化して配置すること。。
<親ウィジェット>はこのラベル/ボタンの親となるウィジェットを指します。簡単なアプリでメイン画面内に直接設置する場合の親は「メインウィンドウ」になります。つまり、
メインウィンドウで ラベルのIDを取得
のように書くことが多いです。「メインウィンドウ」とはそのアプリケーションのメインウィンドウのことです。
■IDについて
これらの処理単語はIDと呼ぶ整数値をスタックに返します。これに限らず「ID」と名が付くものはすべて整数で、変数に格納して後続処理のために使います。(大域変数でも局所変数でも構いません)
IDを記憶するための変数の宣言は、
○○は ID
にて行ってください。「ID」は「変数」の等価語であるため、「○○は 変数」でも同じなのですが、IDを格納する意図がはっきりします。
記: 「キャンバス」の章で解説しますが ”図形ID”と呼ぶものは例外的に倍精度整数の変数を使うことから、「○○は 図形ID」で宣言することになります。
■ラベルを表示するサンプルプログラム
ウィジェットにテキストを設定
構文=
<文字列>を <ウィジェットID>に テキストを設定
プログラム例:
指定する文字列を、IDで指定するウィジェットに設定します。
ラベル、ボタンに限らず、中に文字を表示できる多くのウィジェットに適用できます。
エントリーウィジェット
キーボードから1行の文字列を入力するウィジェットです。既に
ウィジェットのIDを取得 の項に登場していますが、改めてIDの取得から含めた手順を示します。
構文=
(ID取得)
<親ウィジェット>と <桁数>で エントリーのIDを取得 → エントリーID
(属性設定・有効化)
・・・を <エントリーID>に ○○を設定し
・・・を <エントリーID>に ○○を設定し
<エントリーID>を 有効化 (及び 配置 )
(入力値の参照)
<エントリーID>を 入力文字列を参照 → 文字列
プログラム例:
エントリー記憶は ID。
ボタン押下処理とは (引数1、引数2、・・、引数個数 → ・)
イベント引数を捨て
エントリー記憶の 入力文字列を参照し ○○する。
メインとは
エントリーは ID
〜略〜
メインウィンドウと 20桁で エントリーのIDを取得し
エントリーに 入れ
エントリーを エントリー記憶に 入れ
灰色を エントリーに 背景色を設定し
エントリーを 有効化し
・・と ・・と エントリーで 3個で
これらの配置のIDを取得し 配置し
上の例で解説します。
まず「メイン」の中で「エントリーのIDを取得」を使い、エントリーウィジェットの設置を始めます。指定する桁数は入力できる桁数ではなく、ウィジェットの表示幅の意味になることに注意してください。(表示幅以上に入力できます)
上の例ではエントリーIDを記憶する局所変数「エントリー」から、「エントリー記憶」という大域変数にコピーしています。これはイベント処理でIDを参照できるようにするためです。(局所変数「エントリー」はメイン外から参照できないため)
入力域のデフォルトの背景色は白ですが、「背景色を設定」によって指定することもできます。
この先で述べますが、初期値の設定や伏字の設定もできます。
最後に有効化と配置によってウィジェットが見えるようにします(他のウィジェットと同様です)。
エントリーウィジェット自体には”入力を完了した”ことを検知する仕組みは無いので、通常は近くにボタンを配置し、それを押してもらうことでタイミングを得ることになります。
上記例ではボタンが押されるとイベント処理に入って来るので、「入力文字列を参照」を使い、入力された文字列を読んでいます。
文字の入力中は、カーソル移動キー、BSキー、Delキー、などによって入力文字を編集できます。他にも編集関係のキー操作がありますが,詳細は
「テキストウィジェット」−「人による編集機能」 の項目をご覧ください。(テキストウィジェットと違い、カーソルは左右しか動けないのでこのすべては使えません)
■サンプルプログラム
- entry.src
- 単純なエントリーウィジェット。
入力した文字列をそのままラベル内容として表示するだけのものです。
ウィンドウを開いた時、エントリーウィジェットにフォーカスを当てています。
- entry-dentaku.exe
- 数式を入力することで簡易的な電卓のように使います。
「計算式を評価」を使っています。
■入力域の初期値
エントリーウィジェットが表示された時、既に入力域に文字列が入っている状態を作ることができます。
構文=
<初期値文字列>を <エントリーID>に 先行入力文字列を設定 → ・
注:この設定は 有効化の後 かつ 配置の前 に行うこと
注:設定した文字列は最終的な入力文字列に含まれる
プログラム例:
「03-」を エントリーに 先行入力文字列を設定し
上記プログラムを実行すると、エントリウィジェットが表示されたとき既に、先頭に「03-」が入力済みとなります。
■伏字
エントリウィジェットへの文字列入力中、入力した文字をエコーバックせずに伏字(記号 *)とする機能があります。パスワードのような、他人に見せたくない文字列の入力に使います。
構文=
<エントリーID>に 伏字使用を通知 → ・
プログラム例:
複数のウィジェットのIDを取得
◇◇同一種のウィジェットを複数取得
構文=
<親ウィジェット>と <個数>で ラベルのIDを複数取得
→ ID、ID、・・・
<親ウィジェット>と <個数>で ボタンのIDを複数取得
→ ID、ID、・・・
<親ウィジェット>と <個数>で メッセージのIDを複数取得
→ ID、ID、・・・
たとえば、
例1a:
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
メインウィンドウで ラベルのIDを取得し ラベル2に 入れ
メインウィンドウで ラベルのIDを取得し ラベル3に 入れ
上記は似たようなことの繰り返しで煩雑です。これは、
例1b:
メインウィンドウと 3個で ラベルのIDを複数取得し
ラベル1と ラベル2と ラベル3に 入れ
と書けば簡略化することができます。
◇◇異なるウィジェットの組み合わせで取得
構文=
<親ウィジェット>で ボタンとラベルのIDを取得
→ ボタンID、ラベルID
<親ウィジェット>で ラベルとボタンのIDを取得
→ ラベルID、ボタンID
<親ウィジェット>で ボタンとメッセージのIDを取得
→ ボタンID、メッセージID
<親ウィジェット>で メッセージとボタンのIDを取得
→ メッセージID、ボタンID
<親ウィジェット>で ラベルとメッセージのIDを取得
→ ラベルID、メッセージID
<親ウィジェット>で メッセージとラベルのIDを取得
→ メッセージID、ラベルID
上記は読んで字のごとくの機能です。ボタンとラベルを各1つだけ、あるいはラベルとボタンを各1つだけ、という簡単なプログラムはよくあるため、このような処理単語群を用意しています。
プログラム例:
メインウィンドウで ボタンとラベルのIDを取得し
ボタン1と ラベル1に 入れ
多くのウィジェットを生成するのに便利な機能
たとえば、3個のボタンを持つアプリケーションがあったとします。IDの取得についてはたとえば、
例2a:
メインウィンドウと 3個で ボタンのIDを複数取得し
ボタン1と ボタン2と ボタン3に 入れ
のように一括取得できますが、得られたID群を変数に代入するのは上記のように個々の変数への代入を書く必要があります。将来ボタンが増えた場合は、「3個」の個所を「4個」にするだけでは済まず、
例2b:
メインウィンドウと 4個で ボタンのIDを複数取得し
ボタン1と ボタン2と ボタン3と ボタン4に 入れ
のように変更することになり、変数への代入が煩雑になります。このような多くのウィジェットのIDを操作するのを容易にする仕組みを以下に解説します。
■複数のIDを配列に格納
構文=
<ウィジェットID> <ウィジェットID> ・・・を
<ID配列>に 複数のIDを配列に格納 → ・
プログラム例:
メインとは
〜略〜
ボタンテキストは 文字列定数配列
「子ウィンドウを開く 」
「子ウィンドウを隠す 」
「子ウィンドウをアイコン化」
「子ウィンドウを見せる 」
↓ボタンの数をコンパイラが計算
ボタン数は 定数 ボタンテキストの 要素数
ボタン群は ボタン数の ID ※←IDの配列を宣言
〜略〜
メインウィンドウと ボタン数で ボタンのIDを複数取得し
ボタン群に 複数のIDを配列に格納し
長いソースコードですが、多くのボタンを持つアプリケーションで典型的なスタイルとなります。(ボタンでなくラベルでも同様に書けます)
まず、
ボタンテキストは 文字列定数配列
「子ウィンドウを開く 」
「子ウィンドウを隠す 」
〜略〜
により、ボタンに表示するテキスト群をまとめて文字列定数配列として定義しています。文字列定数配列にしたことのメリットは集中管理できることのほかに、ボタンの数をコンパイラが把握できる点にあります。
先のプログラム例ではさらに、
ボタン数は 定数 ボタンテキストの 要素数
ボタン群は ボタン数の ID ←配列の宣言
↑要素数をこのように書けば具体的な数値を書かなくて済む
とすることで、配列「ボタン群」の要素数を定数「ボタン数」としてコンパイラに計算させています。このケースではボタンは4個ですが、ソースのどこにも「4」とは書いていません。これにより将来的にボタンが増えたとしても、どこかの数字を変更する必要がありません。
次に、
メインウィンドウと ボタン数で ボタンのIDを複数取得し
ボタン群に 複数のIDを配列に格納し
として、複数取得したボタンID群をまとめて配列に格納しています。
次に、ボタン群への属性設定ですが、上記のような配列状であれば「回数指定」の構文を使うことで次のように簡便に書けます。
プログラム例:
○○とは
明朝20は 文字列定数 「{MSP 明朝} 20」
〜略〜
ボタン数を
回数指定し
明朝20を ボタン群(回数)に フォントを設定し
ボタンテキスト(回数)を ボタン群(回数)に テキストを設定し
・・・・を ボタン群(回数)に イベント処理を登録し
"#c0c0c0"を ボタン群(回数)に 背景色を設定し
20と 5を ボタン群(回数)に パディングを設定し
繰り返し
上のようにすれば、属性設定は1つのボタン分だけ書けば、結果的に多くのボタンに設定を行えるためプログラムが簡単になります。
上記「・・・・」の部分はアプリケーションによってさまざまなのでここには書いていませんが、たとえばサンプルプログラム samplew\dialog-lowlevel-manypos.src の「メインとは」の中の繰り返し構文を参考にしてください。
■配列から複数のIDを取り出し
構文=
<ID配列>から 配列から複数のIDを取り出し →
<ウィジェットID> <ウィジェットID> ・・
上記のように、配列を指定して多数のIDを一気にスタックに積むことができます。これを使えば、たとえば、
プログラム例:
(まとめて有効化する書き方)
ボタン群から 配列から複数のIDを取り出し
ボタン数で これらを有効化する
(まとめて有効化して配置する書き方)
ボタン群から 配列から複数のIDを取り出し
ボタン数で これらを有効化して配置する
のようにして、まとめて有効化や配置をおこなうことができます。
■多くのウィジェットをまとめて扱うサンプルプログラム
"window-withdraw-and-iconify.src" のメイン記述が参考になります
(参考までに)
このサンプルでは4つのボタンを表示していますが、縦に並んだボタンの横幅を揃えるため、末尾にわざと空白を埋てすべてのボタンの文字数を同じにし、さらに等幅フォント(MS 明朝)を使用しています。ボタン幅を揃える簡便な方法です。
以前に下記のようなソースコードを示しました。
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
上記ではテキストの設定のみをおこなっていますが、一般的には、
↓IDを格納する変数
メインウィンドウで ○○のIDを取得し △△に 入れ
「こんにちは。」を △△に テキストを設定し ↑
赤色を △△に 文字の色を設定し ウィジェットの属性を設定
・・・を △△に ・・・・を設定し ↓
△△を 有効化する
上のように多くの属性を設定することがあります。パディングを指定したり、色を指定する、形状を指定するなどです。
それらについて、ウィジェットの属性指定 でさらに詳しく解説します。
■有効化
ウィジェットへのパラメータ設定をおこなった段階ではまだウィジェットは生成されていません。「有効化」という処理単語を呼ぶことで実際にウィジェットの内部生成が行われます。
構文=
先のプログラムを「有効化」まで書くとすれば次のようになります。
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
・・・を ラベル1に ○○○○を設定し
・・・を ラベル1に ○○○○を設定し
ラベル1を 有効化する
ここまで実行するとようやく内部的にウィジェットが作成されます。
(注:しかし、この段階ではまだ画面には表示されません)
■これらを有効化
複数のウィジェットを同時に有効化します。
構文=
<ウィジェット1>と <ウィジェット2>と ・・・と
<個数>で これらを有効化 → ・
プログラム例:
ラベル1と ボタン1と メッセージ1と 3個で これらを有効化し
- 注
-
配置については 配置の詳しい解説 にて改めて解説します。併せてお読みください。
有効化の段階ではまだウィジェットはウィンドウに現れません。引き続き「配置」をおこなう必要があります。ウィンドウに対してウィジェットをどのように表示するかの指示です。
■並べ配置について
ウィジェットをウィンドウに配置するのに3つの機構が使えますが、ここでは簡単でよく使われる「並べ配置」を解説します。
並べ配置は、ウィジェットを 上から下へ 、あるいは 左から右へ と順に詰めて配置する手法です。ウィジェットの位置を具体的に(たとえば座標で)指定する必要はなく、GUIライブラリが自動的かつ適切に配置します。
いわばお任せで良いのでプログラムとしては楽ですが、より凝った配置にするに他の配置機構のほうが向くこともあります。
まず並べ順ですが、デフォルトは「上から下」です。
たとえば2つのラベルを単に「配置」すると以下のようになります。これがデフォルトの並び順です。
・−−−−−−・
|・−−−−・|
||ラベル1||
|・−−−−・|
|・−−−−・|
||ラベル2||
|・−−−−・|
・−−−−−−・
一方、配置IDに対して、
左から右を 配置1に 並べ方向を設定
のように並べ順をオプション指定すると以下のように左から右になります。
・−−−−−−−−−−−−・
|・−−−−・・−−−−・|
||ラベル1||ラベル2||
|・−−−−・・−−−−・|
・−−−−−−−−−−−−・
指示が「右から左」なら次のような配置になります。
・−−−−−−−−−−−−・
|・−−−−・・−−−−・|
||ラベル2||ラベル1||
|・−−−−・・−−−−・|
・−−−−−−−−−−−−・
■並べ配置のIDを取得 (単一ウィジェットを配置)
構文=
<ウィジェットID>で 並べ配置のIDを取得 → 配置ID
プログラム例:
○○とは
配置1は ID
ラベル1で 並べ配置のIDを取得し 配置1に 入れ
まず「並べ配置のIDを取得」により配置をおこなう準備に入ります。この処理単語に与えるものは配置対象となるウィジェットのID、つまり、”配置の子となるウィジェット”です。
「並べ配置のIDを取得」は配置IDと呼ぶIDを返してきます。
配置IDは局所変数に格納して使うこともありますが、配置IDに対してオプションを設定することが無ければ、下記のように変数に入れず、直ちに「配置する」に渡してしまっても構いません。
プログラム例:
〜略〜 ↓直ちに「配置」に渡す
ラベル1で 並べ配置のIDを取得し 配置する
■これらの並べ配置のIDを取得 (複数ウィジェットを配置)
構文=
<ウィジェット1>と <ウィジェット2>と ・・・と <個数>で
これらの並べ配置のIDを取得 → 配置ID
複数のウィジェットを収容する配置を取得するには上記のように記述します。
収容対象のウィジェットIDを並べ、最後に個数を積んでから処理単語を呼びます。
プログラム例:
ラベル1は ID
ボタン1は ID
メッセージ1は ID
配置1は ID
ラベル1と ボタン1と メッセージ1と 3個で
これらの並べ配置のIDを取得し 配置1に 入れ
■配置
構文=
上の「配置」によって、ようやくウィジェットが画面に描画されます。
プログラム例1:
メインとは
ラベル1は ID
配置1は ID
〜略〜
ラベル1の 並べ配置のIDを取得し 配置1に 入れ
配置1を 配置すること。
配置系の"ID取得"とその"配置"とで手続きが分かれているのは、パディングの指定や拡張など、配置に対して各種パラメータ指定ができるようにするためです。もし、配置IDに対するパラメータ設定が不要なのであれば、下記のように取得した配置IDを変数に格納せず、直ちに「配置する」としたほうが簡単になります。
プログラム例2: (こちらのほうが簡単)
メインとは
ラベル1は ID
〜略〜
ラベル1の 並べ配置のIDを取得し 配置すること。
改めて、ラベルのID取得から配置までの全体を示すと以下のようになります。
プログラム例3: (全体像)
メインとは
ラベル1は ID
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
ラベル1を 有効化し
ラベル1で 並べ配置のIDを取得し 配置すること。
(この先で解説する「有効化と配置のコンビネーション」を使うとさらに簡単になります)
■有効化と配置のコンビネーション
(単一ウィジェットを配置)
構文=
<ウィジェットID>を 有効化して配置 → ・
<ウィジェットID>を 有効化し並べ配置のIDを取得 → ID
(複数ウィジェットを配置)
構文=
(構文1:配置のIDを得るだけの場合)
<ウィジェット1>と <ウィジェット2>と ・・・と <個数>で
これらを有効化し並べ配置のIDを取得 → ID
(構文2:有効化と配置を同時に行う)
<ウィジェット1>と <ウィジェット2>と ・・・と <個数>で
これらを有効化して配置 → ・
「有効化して配置」は、
(ウィジェットの)有効化、
配置のIDを得る、
配置
を一気におこなう上位語です。この定型文は利用頻度が高いためコンビネーションを用意したもので、配置に対するオプション指定が無ければこれが最も簡単な表記となります。
「これらを有効化し・・」系の処理単語はそれの複数ウィジェット対応版です。
プログラム例4: (全体像- 「有効化して配置」を使う)
メインとは
ラベル1は ID
メインウィンドウで ラベルのIDを取得し ラベル1に 入れ
「こんにちは。」を ラベル1に テキストを設定し
ラベル1を 有効化して配置すること。
■有効化して配置のサンプル
hellowin.src にそっくりなサンプル、hellowin2.src があります。まったく同じ処理をしますがソースコードが少し違います。配置に関して前者は簡単に済ませていますが後者は律儀な手続きになっています。前者の「有効化して配置」が内部的にはどのようなものなのかが分かります。
プログラム: hellowin.src (簡単な記述)
プログラム: hellowin2.src (律儀な記述)
〜略〜
ラベル1を 有効化し
ラベル1で 並べ配置のIDを取得し 配置する。
■ウィジェットを削除
構文=
<ウィジェットID>を ウィジェットを削除 → ・
指定したウィジェットを削除します。
表示すべきものが一つ消えるため、ウィンドウサイズを明示していない場合はその分だけウィンドウが縮小します。
また、ウィジェットがウィンドウの場合はウィンドウが消え、さらにはそれがメインウィンドウの場合はアプリケーションが終了します。
記: ウィンドウを削除するのが目的であれば、等価語としての「ウィンドウを閉じる」のほうが意図が明確なのでそちらを勧めます。
■ウィジェット存在?
構文=
<ウィジェットID>が ウィジェット存在? → 真偽
指定したウィジェットが存在しているかを(=削除されていないかを)確認します。
たとえば、一旦表示したラベルやボタンを削除したい場合、プログラムが複雑な場合はそのタイミングで既に削除されていることもあり、存在することに確信が持てない場合には本単語を使って事前チェックをすることを勧めます。存在しないウィジェットを削除しようとするとGUIエンジンレベルでのエラーが発生し、強制的にアプリケーションが終了してしまうからです。
「ウィジェット存在?」の利用例としては、サンプルプログラム "after.src" が参考になります。ボタンを押すと所定の時間経過後にボタンを削除するものですが、ボタンを2度押しされることもあり、誤って既に消えたボタンを削除することを防ぐために使っています。

-