過去の桐井戸端BBS (桐ver.8)
11734 コマンドオブジェクトからのイベント(イベントとボタンで手続き定義を共用する) 磯田 2001/06/18-20:09
現在イベントに挑戦中なのですが、
フォームのテキストオブジェクトでソース値更新によるイベントは
何とかうまくいきました。
同じ手続き(イベントファイルに記述)をコマンドボタンを押したときに発生させたいのですが、
キーダウンイベントはコマンドオブジェクトにはないようなので、
コマンドボタンの機能名に"手続き実行"を指定して、パラメーターに手続き名を入れました。
この方法ではうまくいかないのですが、方向的にはこれでいいのでしょうか?
よろしくお願いします。

11738 イベントとボタンで手続き定義を共用する 悲しげ 2001/06/18-22:03
記事番号11734へのコメント
どもっ、磯田さん

え〜、まずタイトルですが、「コマンドオブジェクト」と云うのは、聞いたことがありませんので、
これは「コマンドボタンからのイベント」に勝手に読み変えて(^^;)、
ついでにタイトルも大幅に(^^;)変えてコメントさせていただきます。
全然外していたらすいません。

>フォームのテキストオブジェクトでソース値更新によるイベントは何とかうまくい
>きました。同じ手続き(イベントファイルに記述)をコマンドボタンを押したときに
>発生させたいのですが、キーダウンイベントはコマンドオブジェクトにはないよう
>なので、コマンドボタンの機能名に"手続き実行"を指定して、パラメーターに
>手続き名を入れました。この方法ではうまくいかないのですが、方向的にはこれで
>いいのでしょうか?よろしくお願いします。

少し混乱があるような気がします。(^^;)
テキストオブジェクトの「ソース値更新」イベントは、あるテキストオブジェクトで
[Enter]キーをダウンして確定した時に発生するイベントです(ついでに云えば[Esc]キーをダウンしても発生しません)。
確かに[Enter]キーをダウンはしていますが、
これを以て「キーダウン」イベントとは、普通は云わず、
単に「ソース値更新」イベントとだけ認識しておいた方が混乱しないと思います。
よって、以下は「キーダウン」イベントには言及しません。

つまりは、某テキストオブジェクトの「ソース値更新」イベントで実行させる某処理を、
別途コマンドボタンのクリックでも実現させたい、
云い換えれば、某処理を「ソース値更新」コマンドとコマンドボタンの処理を共用させたいのだと推測します。
---------------------------------------------
手続き定義開始 某テキスト::ソース値更新()
 手続き実行 某磯田処理()
手続き定義終了

手続き定義開始 某磯田処理()
 ・・・・・・・・・/*某処理*/
手続き定義終了
---------------------------------------------

片や、当該コマンドボタンの記述は、次のようになります。
---------------------------------------------
機能名    機能パラメータリスト
手続き実行  某磯田処理
---------------------------------------------

「この方法ではうまくいかない」とすれば、どこかが間違っていると思います。
それがどこかなのかは、ご本人じゃないと判りませんが、記述から大胆に推測するに、
まさか機能パラメータリストに「某テキスト::ソース値更新()」と記述している訳じゃないですよね。(^^;)
11739 コマンドボタンからの一般手続きの実行 佐田 守弘 2001/06/18-22:04
記事番号11734へのコメント
磯田さん

●イベントハンドラと一般手続き
伊部とが発生して自動的に実行される処理(プログラム)をイベントハンドラと呼ぶのに対して、
コマンドボタンの機能名で呼び出す処理を一般手続きと言います。

コマンドボタンをマウスでクリックしたり、カーソルキーでボタンを選んでEnterキーを押して実行するには、
御質問に
>コマンドボタンの機能名に"手続き実行"を指定して、パラメーターに
>手続き名を入れました。この方法ではうまくいかないのですが、
>方向的にはこれでいいのでしょうか?よろしくお願いします。
と書かれている通りで、これが正解です。

動作しないのは、手続き名の記述が間違っているとか、
手続き定義開始コマンドの後ろの手続き名の後に括弧が付いていないなど、
記述上のエラーではないかと思います。

佐田守弘(KS-00119)
11740 ヒントはここにあり! 佐田 守弘 2001/06/18-22:15
記事番号11738へのコメント
磯田さん
悲しげさんが書かれたコメントを見て、ふと思い浮かんだのですが、
手続き実行のパラメータ記述を確認して下さい。
以下は悲しげさんのコメントから引用です。
>するに、まさか機能パラメータリストに「某テキスト::ソース値更新()」と記述
>している訳じゃないですよね。(^^;)
手続き実行で一般手続き(イベントハンドラも含む)を呼び出す時には、
手続き名だけをパラメータに記述します。
手続き定義開始コマンドには、一般手続きの場合にも仮引数(この概念はfortranと同じ)
を記述するために使う括弧を、引き数がない場合でも記述します。
しかし呼び出す側では、手続き名の後ろに括弧は付けません。

佐田守弘(KS-00119)

前コメントは悲しげさんと1分差。
11744 イベントハンドラと一般手続きの違い 小松亀一 2001/06/19-09:57
記事番号11739へのコメント
佐田先生、おはようございます。
>
>●イベントハンドラと一般手続き
>イベントが発生して自動的に実行される処理(プログラム)をイベントハンドラと
>呼ぶのに対して、コマンドボタンの機能名で呼び出す処理を一般手続きと
>言います。
私は現時点では殆どこの一般手続でイベントを実行しております。

佐田先生のテキストの中には、イベントハンドラの中には、イベントで呼び出される手続の他に、
コマンドボタンの「手続き実行」機能で呼び出す手続を記述でき、
これを「一般手続」と言いますと解説されてます。

これによると「一般手続き」も「イベントハンドラ」の一種とも読めますが、
更に、イベントで呼び出される手続を「イベントハンドラ」と呼び、手続き実行機能で呼び出される手続きを
「一般手続き」と呼び両者は別物と読めるような説明もあります。

言葉の問題かも知れませんが、同じイベントファイルに記述するのに「一般手続」と
「イベントハンドラ」に区別する実益がどこにあるのかよく判りません。
両者の区別についてご教示いただければ幸いです。




11746 うまくいきました 磯田 2001/06/19-10:28
記事番号11734へのコメント
悲しげさん、佐田先生貴重なコメントありがとうございます。うまくいきました。

私の説明不足で申し訳ありません。具体的に書きます。
フォームのボタンに<次データ>というのがあり、そのボタンに


  機能名   パラメータ
  なし    #代入(&受験番号,&受験番号 + 1)
 手続き実行  画面表示,&受験番号

というコマンドを割り当てています。そしてそのフォームのイベントファイルに次のような手続きを作っています。


 手続き定義開始 画面表示(数値 &受験番号)
   条件(&受験番号>0 .and &受験番号<2000) 代入 &希望コース表示=1,&普希表示=0,&特別
活動表示=0
   条件(&受験番号>2000 .and &受験番号<3000) 代入 &希望コース表示=1,&普希表示=1,&
特別活動表示=0
   条件(&受験番号>3000 .and &受験番号<4000) 代入 &希望コース表示=0,&普希表示=0,&
特別活動表示=1
   条件(&受験番号>4000) 代入 &希望コース表示=1,&普希表示=1,&特別活動表示=0
   オブジェクト操作 ハンドル=&サブハンドル,@b希望コース.画面表示=&希望コース表示
   オブジェクト操作 ハンドル=&サブハンドル,@t希望コース.画面表示=&希望コース表示
   オブジェクト操作 ハンドル=&サブハンドル,@b普希.画面表示=&普希表示
   オブジェクト操作 ハンドル=&サブハンドル,@t普希.画面表示=&普希表示
   オブジェクト操作 ハンドル=&サブハンドル,@b特別活動.画面表示=&特別活動表示
   オブジェクト操作 ハンドル=&サブハンドル,@t特別活動.画面表示=&特別活動表示
 手続き定義終了


結局私の #代入 関数の書式のミスで動かなかったことが判明しました。
最初 代入(&受験番号=&受験番号 + 1) と書いていました。お恥ずかしい限りです。
しかし、少しずつイベントがわかりかけてきたかな?という感じです。まだまだこれからですけど.....。

11747 Re:イベントとボタンで手続き定義を共用する bonito 2001/06/19-10:48
記事番号11738へのコメント
悲しげさん、相変わらず、すばらしきコメントで...
特にタイトルに花まるを...   (^^;

蛇足ですが
「手続き実行 イベントハンドラ」 つまり 
手続き実行 <オブジェクト名>::<イベント名>(<式>,…)
という書き方もあります。 

悲しげさんのをそのままパクって書くと

---------------------------------------------
手続き定義開始 某テキスト::ソース値更新()
 ・・・・・・・・/*---なんか処理---*/
 ・・・・・・・・/*---どんな処理---*/
 ・・・・・・・・/*---こんな処理---*/
手続き定義終了

手続き定義開始 ボタン1()
 手続き実行 某テキスト::ソース値更新()
手続き定義終了
---------------------------------------------

当該コマンドボタンの記述
---------------------------------------------
>機能名    機能パラメータリスト
>手続き実行  "ボタン1"
---------------------------------------------

手続き実行 イベントハンドラ そのうち何かで役にたつ
かなぁと思っているのだが、まだ使った事がない (^^;



11748 Re:イベントハンドラと一般手続きの違い 悲しげ 2001/06/19-10:59
記事番号11744へのコメント
割り込みです。(^^;)
特に小松さん宛の直接的なコメントではないのですが、私自身は「イベント系の手続き」と
「一般手続き」は殆ど別物と認識しています(タイプミスの可能性無きにしも非ずの感もありますので、
あえて「イベントハンドラ」の語への言及は避けておきます)。

以下は、特に小松さんへのコメントと云う訳でもありませんが。
イベント系の手続きは、あるイベントが発生した際に実行させるイベントで、
細部の書式は桐の方に指定してもらいます(wfm・kevともに)。
kevの記述は例えば次のようになります。
----------------
手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &ス・・・・
 ・・・・
----------------
片や、一般手続きはイベントに関係なく、ユーザ側が任意に設定し、任意の時点で呼び出す手続き定義です。
例えば次のように(ただしカッコ内は空でもよい)。
----------------
if(&朝昼夕="朝")
 手続き実行 挨拶実行("おはよう")
else if(&朝昼夕="夜")
 手続き実行 挨拶実行("おばんです")
end

手続き定義開始 挨拶実行(文字列 &挨拶)
 ・・・・
----------------
これらの見た目の最大の違いは開始部の「::」の有無でしょうか。(^^;)

もうひとつ、コマンド牡丹押下時の「ボタンの機能」に掛る呼び方ですが、
説明の際には「イベント」なる云いかたを避けた方がいいのではないかと、
私は思っています。確かにコマンド牡丹をマウス左クリック(またはダウン)
すると云う「イベント」は発生しているのですが、コマンド牡丹に掛るイベントは
それとは別個に各種設定可能ですから、混乱を避けるために、
例えば「ボタンの機能」とのみ呼んだ方が無難でしょう。
併せて、ボタンの機能のひとつである「手続き実行」で呼び出せる手続きは
(「ボタンの機能」は「イベントでは無い」との上の記述に符合して)、
イベント系の手続きではなく「一般手続き」となる訳です。

ついでに冒頭で避けた「イベントハンドラ」。私は「イベント系手続き」と
殆ど同義ではないかと、取り敢えずは理解しています。
11749 Re:イベントハンドラと一般手続きの違い 悲しげ 2001/06/19-11:11
記事番号11748へのコメント
bonitoさんの#11747によりますれば、「手続き実行 <イベントハンドラ>」
ってのもあったようで……知らんかったです(^^;)。
この間の一連の記述はそのことを加味して読み変えていただきますよう……。(^^;)
でも、混乱を拡大するかも(^^;)(^^;)。
                    PS:bonitoさん、どうもっす。
11757 Re:イベントハンドラと一般手続きの違い 佐田 守弘 2001/06/19-20:04
記事番号11744へのコメント
小松亀一先生
まず先にお断りしておきますと、イベントハンドラと一般手続きの違いを議論しても余り得るものがないと思います。
むしろ使いこなす方が重要です。
ですから私は講習の際には、お手持のテキストにも記載しておきました通り、
「イベントハンドラと一般手続きは別物」と決めつけて言い切ってしまいました。
その方が、一般論としては分かりやすいだろうと思ったからです。

●敢てその違いなどを議論すれば
イベントハンドラも一般手続きもどちらもイベントファイルに記述する点では、共通しております。
しかしこれらがどの様に実行されるかの点から見れば、別のものと考えた方が簡単かと思います。
つまり、
@イベントハンドラ:そのイベントが発生した時に自動的に実行される
A一般手続き:手続き実行コマンドやコマンドボタンの機能で実行される
です。そしてほとんどの場合には、「どの様に実行されるか」で区別されます。
ただし、bonitoさんの#11747にあります通り、イベントハンドラを一般手続きの様に
呼び出せる事を考えてしまうと、どちらがどうなのかと言った疑問になってしまいます。

●イベントハンドラは「特殊手続き」と考えれば分かりやすい
イベントファイルは、「手続き定義開始」〜「手続き定義終了」で括られる
手続きの集合体です。
別の言い方をすればサブルーチン集とも言えるでしょう。
つまり、イベントハンドラも一般手続きもどちらも「手続き」です。
そして、イベントハンドラも「手続き実行」でも実行できるとすれば、
どちらも「一般手続き」の機能を備えています。
つまり、「イベントハンドラは一般手続きに含まれる」と言えなくはありません。

しかしイベントハンドラは、一般手続きにはない特殊機能を持っています。
その特殊機能とは、「イベントの発生で自動的に呼び出される」です。
イベントハンドラに自動実行機能を持たせるため、イベントハンドラには
一般手続きと違う条件が決まっています。
その条件とは次の通りです。
@手続き名は<オブジェクト名>::<イベント名>で記述する事に決められている
 これはシステムが発生したイベントと実行したい手続きとの関連付けをしているためです。
Aシステムで決められている引き数を必ず記述する

言葉を変えるなら、イベントハンドラは一般手続きの特殊なケースとも言えます。
つまり、イベントファイルに記述する手続きのうち、発生したイベントによって
自動実行させる特殊な手続きをイベントハンドラ(=特殊手続き)と呼び、
イベントでは実行されない一般的なものを一般手続きと呼ぶという事だと思います。

繰り返せば、両者の違いはイベントで自動実行されるかどうかの違いです。

なお、イベントハンドラを一般手続きの様に呼び出す使い方は、それ程多くはないだろうと思います。
私はまだその様な使い方をしたケースがありませんが、
もしその様な使い方をする場合には、悲しげさんが#11738に書かれている様に、手続きで実行させたい
処理内容は一般手続きとして記述しておき、イベントハンドラからはその一般手続きを呼び出す形で記述すると思います。
イベントハンドラと一般手続きは明確に分けておいた方が紛らわしくないと思います。

佐田守弘(KS-00119)
11769 Re:イベントハンドラと一般手続きの違い 小松亀一 2001/06/20-08:54
記事番号11757へのコメント
悲しげさん、佐田先生、おはようございます。
ご丁寧なレス有り難うございました。

>まず先にお断りしておきますと、イベントハンドラと一般手続きの違いを議論
>しても余り得るものがないと思います。むしろ使いこなす方が重要です。
仰るとおりと思います。習うより慣れろですね。

ただそれでなくてもちんぷんかんぷんの管理工学のマニュアルを理解するのに、
少しは言葉の定義づけも覚えておいた方が少しは役に立つだろうとも思いました。

>@イベントハンドラ:そのイベントが発生した時に自動的に実行される
>A一般手続き:手続き実行コマンドやコマンドボタンの機能で実行される

>つまり、イベントファイルに記述する手続きのうち、発生したイベントによって
>自動実行させる特殊な手続きをイベントハンドラ(=特殊手続き)と呼び、
>イベントでは実行されない一般的なものを一般手続きと呼ぶという事だと思います。

一般手続きと特殊手続きの関係と言った方が素人には判りやすいですね。
悲しげさんのご説明で、少しずつ曇りが晴れてきたのが、更に佐田先生のご説明で、
大部晴れてきた感じです。

オンラインマニュアルのイベント部分を改めて読んでみましたが、
これまで全くちんぷんかんぷんだったものが少しは理解できるような気がしてきました。

お陰様にて自力でもイベントに挑戦してみようと言う気になってきました。
有り難うございました。
11779 Re:うまくいきました きりぎりす 2001/06/20-20:03
記事番号11746へのコメント
ちょっと気になったので、コメントします
示されている手続きのコードでは受験番号2000,3000,4000番のとき
何もしないで終わりますが、これでいいんでしょうか?
11784 Re:うまくいきました 磯田 2001/06/21-09:58
記事番号11779へのコメント

>示されている手続きのコードでは受験番号2000,3000,4000番のとき
>何もしないで終わりますが、これでいいんでしょうか?

何もしないわけではなくてオブジェクト操作で画面表示のする、しないを変数に代入して操作しています。
たとえば3000番台のときは特別活動のオブジェクトを表示、他の2つのオブジェクトが非表示になるように設定しています。

11802 Re:うまくいきました Ogo 2001/06/21-21:40
記事番号11784へのコメント

>>示されている手続きのコードでは受験番号2000,3000,4000番のとき
>>何もしないで終わりますが、これでいいんでしょうか?

理解できていないようですね?

>条件(&受験番号>0 .and &受験番号<2000)
>条件(&受験番号>2000 .and &受験番号<3000)
>条件(&受験番号>3000 .and &受験番号<4000)

&受験番号=2000
&受験番号=3000
&受験番号=4000

の時は、どの条件にも属さないですよ? との指摘ですよ?

もちろん、それで問題がないシステムの組み方もあるわけですが。


11805 Re:うまくいきました 悲しげ 2001/06/21-22:32
記事番号11802へのコメント
云い換えれば、例えば

条件(&受験番号>0 .and &受験番号=<2000)
条件(&受験番号>2000 .and &受験番号=<3000)
条件(&受験番号>3000 .and &受験番号=<4000)

のようにどちらかに等号を加えた方がいいんじゃないでしょうか、
と云うことですよね?
11807 Re:うまくいきました 磯田 2001/06/21-23:20
記事番号11802へのコメント
Ogoさん、どうもです。たいへん失礼しました。
私が今作っているシステムは受験生のデータ処理で
2000番台は2001から3000番台は3001から始まるので、実際には必要ないのです。
ですから、2000番、3000番という番号はありえないので、入力ミスをなくす意味でもわざとはずしています。
プログラムを見て、そういった点にすぐに気が付かれるとは…。
11830 Re:イベントとボタンで手続き定義を共用する mudagam 2001/06/23-20:07
記事番号11747へのコメント

 コマンドボタンの機能パラメータリストに直接、
「"<オブジェクト名>::<イベント名>"」を設定することで
可能かと思いますが…。

---------------------------------------------
手続き定義開始 某テキスト::ソース値更新()
  ・・・・・・・/*---処理---*/
手続き定義終了
---------------------------------------------

コマンドボタンの記述
---------------------------------------------
>機能名     機能パラメータリスト
>手続き実行  "某テキスト::ソース値更新()"
---------------------------------------------
機能パラメータリストは、
「()」の有り無しどちらで可能です。


 ちなみに私は、キーダウンイベントで設定した内容を、
コマンドボタンから呼び出したりして使っていますが。
Escが押されたときのキーダウンイベントの内容をコマンドボタンから
呼び出す場合に、

イベントファイルの最初、名札 メインに
---------------------------------------------
変数 局所,長整数{&参照}
---------------------------------------------
の一行を設定しておき。

コマンドボタンの記述
---------------------------------------------
>機能名     機能パラメータリスト
>手続き実行  "フォーム::キーダウン()",27,0,0,&参照
---------------------------------------------
と云う風に使っています。

まちがいはないですよね…?(あまり確信がない)

11834 Re:イベントとボタンで手続き定義を共用する 悲しげ 2001/06/23-21:02
記事番号11830へのコメント
>コマンドボタンの記述
>---------------------------------------------
>機能名     機能パラメータリスト
>手続き実行  "フォーム::キーダウン()",27,0,0,&参照
>---------------------------------------------

なるほどっ!
全体をダブルクォーティションで囲めばよかったんですか!!
これはよいことを教わりました。どうもありがとうございました。<(_ _)>

ところで、

>イベントファイルの最初、名札 メインに
>---------------------------------------------
>変数 局所,長整数{&参照}
>---------------------------------------------
>の一行を設定しておき。

「局所変数」として設定する理由をよければ教えて下さい。
11836 Re:イベントとボタンで手続き定義を共用する mudagami 2001/06/24-00:43
記事番号11834へのコメント
>>イベントファイルの最初、名札 メインに
>>---------------------------------------------
>>変数 局所,長整数{&参照}
>>---------------------------------------------
>>の一行を設定しておき。
>
>「局所変数」として設定する理由をよければ教えて下さい。

 あまり自信をもってお返事できるレベルではありません。
参照型の変数にたいして何も分かっていない時に、
(今もよく分かっているレベルではない)試行錯誤して
設定したもので、当該箇所に引数を指定する際
長整数の変数以外は受け付けないために、
やむをえずイベントファイルの最初に変数を設定したのです。
コマンドボタンの後ろの行に、その参照型変数の値を
参照する処理でもあればその変数が生きるのでしょうが。
ためしに、その「&参照」変数の代わりに0〜9の数値を
入れてみてもエラーになります。

戻る