過去の桐井戸端BBS (桐ver.8)
15592 イベントの書き方で教えて下さい。 jyuuyuu 2002/03/29-06:30
イベントの書き方について教えて下さい。

一括処理で顧客管理のフォームを開き、そのフォームに下記「印刷.Kev」が設定してます
コマンドオブジェクト属性(印刷)では
1)オブジェクト名 P印刷
2)標題      印刷
3)機能名の1   手続き実行
として確かに「印刷」コマンドボタンを押したときには、顧客カードC.RPTの印刷が実行されます。

次に項目数が多く1枚のフォームでは表示が細かくなるためにもう1枚のフォーム
「kyusai4S.wfm」と切り替えて入力したいと考えて下記コマンドボタンを作りました

1)オブジェクト名 スティック
2)標題      表示切替
3)機能名の1   手続き実行

しかし一括処理でフォームを開いた時「印刷」のコマンドボタンははっきり表示しますが
「表示切換」が薄く表示(これはフォーカスしてないと表現?)されて、この時点でまともに動かないな!!!と解りましたが、
いろいろ過去ログを調べてますが、イベントの書き方
自体が勉強不足で解ってないので
どこに誤りが有るのか教えて下さい。
文章表現がまずく、質問の意味不明でしたら、逆質問お願いします・・・・


======================印刷.Kev===================================
名札 メイン
  */KYUSAI4.WFM を

変数宣言 数値{&印刷行}
変数宣言 整数{&状態}
変数宣言 整数{&新規番号}

          /*     ↓この部分自信無し
手続き定義開始 P印刷::フォーカス取得(文字列 &喪失オブジェクト名)
      絞り込み 行数=1
      レポート印刷 "顧客カードC.rpt",開始ページ=1,終了ページ=1,編集
表=する,部数=1,罫線印字=する,カラー印刷=しない,ソート=しない,
手続き定義終了


手続き定義開始 スティック::フォーカス取得(文字列 &喪失オブジェクト名)
    多重化 使用フォーム="KYUSAI4S.WFM",表番号=&新規番号
手続き定義終了
================================================================
15604 イベントの書き方(1)一般論 佐田 守弘 2002/03/30-01:09
記事番号15592へのコメント
jyuuyuuさん
いくつか質問内容で不明な点があります。
それは、書かれているイベントハンドラをどの様に作ったかで、これが重要な分かれ目でもあります。
それはさておき、気がついた点をまず述べます。
●イベントと一般手続きの違い
一口にイベント(広義)と言いますが、狭義にはイベントハンドラと一般手続きの2つがあります。

イベントハンドラは、例えばフォーカス取得やマウスクリックなどのイベントが発生した時に呼び出されるものです。
イベントハンドラが正しく実行されるには、そのオブジェクトの該当するイベントにチェックマークが付いている事と、
呼び出されるイベントハンドラが存在する事が必要です。
イベントハンドラは、イベント名をダブルクリックする事によって、自動的に作らせます。
作られるのは手続き定義開始と手続き定義終了コマンドです。
手続き定義開始コマンドは、次の形になります。
 手続き定義開始 <オブジェクト名>::<イベント名> (<自動変数リスト>)
イベントハンドラを手続き実行で実行する事も可能ですが、普通はしません。

一般手続きは、手続き実行コマンドまたはコマンドボタンの機能名の手続き実行で実行されます。
一般手続きの方は、次の形で、これは直接記述して作ります。
 手続き定義開始 <手続き名> ()   (←変数リストを記述することも可能)
一般手続きはイベントでは実行されません。

さて、私の推定ですが、書かれているイベントハンドラは、イベント名のダブルクリックで作ったのではなくて、
直接記述したのではないでしょうか。
皮肉な話ですが、まともに動かなくて良かったと思います。
もしきちんとできていたら、プリンタがゴミの山を築いた事でしょう。

●一括処理とイベント
桐のシステムは、一括処理主体で作る古典一括型と、イベントハンドラ主体で作る形があります。
どちらを取るかによって、使えるコマンドなどが変わります。
私は基本的には一括からフォームを開く形ではなく、フォームを直接開き、イベントを使う方法をお奨めるします。

一括で起動した場合には、イベントファイルを別に作らず、その一括処理の末尾にイベントハンドラを記述できると思います。

●フォームの切り換え
フォームを直接開いた場合には、フォーム呼出しで新しいフォームを呼び出したり、
コマンドボタンの機能名の「フォーム選択」などが使えます。
一方、一括処理でフォームを開く場合、「ウインドウ作成」「ウインドウ会話」で
フォーム編集を行う形になります。
この場合には、コマンドボタンに「一括に戻る」を設定しておき、このボタンを押して
一括に戻った後(この時にフォームが閉じられる)、改めて新しいフォームウインドウを開きます。
試した事はありませんが、多重化コマンドであららしいフォームを開く事はできないと思います。

なお、フォームの切り換えに関しては、#15533と#15534に詳しい解説をしておりますので、これも読んで下さい。

●フォーカス取得イベントとは
フォーカス取得イベントは、そのオブジェクトがフォーカスを取得する時に発生するイベントです。
ですから、もしきちんと動作していたとすると、クリックせず単にマウスカーソルがボタンの上を通っただけで、
イベントハンドラのコマンドが実行されます。

佐田守弘(KS-00119)
15605 イベントの書き方(2)改善案 佐田 守弘 2002/03/30-01:41
記事番号15592へのコメント
jyuuyuuさん
続いて改善案です。前コメントにも書きましたが、一括処理主体で動かすか、
イベント主体で動かすかで、改善案は大きく変わります。

■一括処理主体の場合
コマンドボタンには、単に「一括に戻る」だけを設定して下さい。
この設定で、ボタンが押されると、押されたボタンのオブジェクト名が変数に代入され、
フォームウインドウが閉じて一括に戻ります。
一括では、おそらく次の様に書かれていると思います。
一括に戻ると、<次のコマンド>が実行されます。
 表 <表名>,使用フォーム=<フォーム名>
 ウィンドウ作成 フォーム,ハンドル = &HW
 ウィンドウ会話 &HW,ボタン=&OBJ,終了状態=&END
 <次のコマンド> 

この<次のコマンド>では、ケースコマンドなどで&OBJの値を判定し、
新しいウインドウを開かせる処理を行います。
 ケース開始
  ケース (&OBJ="P印刷")
   使用フォーム "KYUSAI4S.WFM"
   ウィンドウ作成 フォーム,ハンドル = &HW
   ウィンドウ会話 &HW,ボタン=&OBJ,終了状態=&END
 ケース終了

■ イベント主体の場合
●コマンドボタンの設定
コマンドボタンには次の様に設定します。
 機能名:手続き実行
 パラメータ:P印刷(あるいはスティック)

●一般手続きの設定
このコマンドボタンで呼び出される一般手続きは、単に次の様に書きます。
 手続き定義開始 P印刷()
  絞り込み 行数=1
  レポート印刷 "顧客カードC.rpt",・・・・
 手続き定義終了

●フォームの切り換え方
簡単にはフォーム呼出しコマンドで"KYUSAI4S.WFM"を開くの簡単でしょう。
同じ表が多重化されて開かれますから、フォームの許可作業で多重化にチェックを入れておいて下さい。
多重化で開かれますから、単に開いただけでは、
前のフォームで表示していたレコードと同じレコードが表示されるとは限りません。
前のフォームで処理対象行を変数などに代入しておき、同じレコードにジャンプさせるなどの仕組みが必要になります。

同じ表でフォームだけ切り換えるなら、コマンドボタンの機能名の[フォームの選択]を使うのが賢い方法です。
同じ表の処理対象行のまま、フォームだけが入れ替わります。
ただし、前のフォームがモーダルの場合には、この方法は使えません。
一括処理で開いたフォームも同じだと思います。

佐田守弘(KS-00119)

私のサイトに、イベントに関する記事がありますから、これも参考にしてみて下さい。
http://www.ne.jp/asahi/m.sada/kiri/GUIDE/GUIDE_TOP.html

15608 有難うございます。 jyuuyuu 2002/03/30-07:36
記事番号15605へのコメント
佐田先生 懇切丁寧なレス有難うございます。

ですが、私の勉強不足で「モーダル」「ハンドラ」等の単語の意味すら解っていませんもう少し一から勉強します。

>書かれているイベントハンドラをどの様に作ったかで、これが重要な分かれ目でもあります。

これは【多遊】さんのHPの中から一部をコピー&ペーストして作ったよう、記憶してます
一応は私の必要な処理(顧客カードの印刷)はします。
しかし先生指摘の通り、マウスでなくても、【Enter】キーでカーソルが通っただけでも
起動されますので、絶対通らないフォームの右下にボタンを配置してます。

とにかく私のシステムは一括処理のファイル6本で成り立ってます、イベントを使えないこと解っただけでも、
一歩前進で他の方法(例えばフォームを画面より大きく取りスクロールさせるとか・・・)で考えてみます。

どうも有難うございます。

15610 〔用語解説〕モーダルとは 佐田 守弘 2002/03/30-11:36
記事番号15608へのコメント
jyuuyuuさん

●モーダル
「モーダル」とは、そのダイアログを閉じない限り、元に戻れない事をいいます。
ただしモーダルダイアログから次のダイアログは開けますが、戻る時には逆の順に閉じて戻ります。

例えば、各種アプリから印刷メニューを選ぶと、印刷のダイアログが開きます。
そしてそこからプリンタのプロパティのダイアログを開く事ができます。
しかしこれらのダイアログを表示したまま、編集をやり直そうとしてもできませんね。
これはこれらのダイアログがモーダルだからです。
編集をやり直すには、印刷を終えるか、中止して印刷ダイアログを閉じる必要があります。

一方、桐の定義画面を例にすれば、各種の属性設定ダイアログ(パネル)がありますが、
このダイアログは表示したまま、定義画面の定義が行えます。こういった表示したまま
元の画面なり前のダイアログに戻れるダイアログはモーダルではありません。

●モーダルで開かれるフォーム
開いたフォームがモーダルになるかどうかは、フォームの形式や開き方で決まります。
例えばフォーム呼出しで開いたフォームは、必ずモーダルで開かれます。
一括処理で開いたフォームがモーダルになるかどうかは、使ってないのではっきり憶えておりません。

●メニュー構成とモーダルなフォーム
例えば「売上伝票入力」「顧客マスタ保守」「製品マスタ保守」の3つのメニューがあったとします。
これらを同時に開いて、自由に編集させるような作り方も可能ですが、
売上伝票入力の最中にマスタの保守を行うのは一般的に良い結果にはなりませんね。
その方が便利という場合もあるかも知れませんが、一般にはそういった操作はさせません。
そこで、売上伝票の入力を行っている時には、入力が終わるまで他のメニューは選ばせない様にします。
それには、売上伝票のフォームをモーダルで開けばよいのです。
逆にいうと、モーダルで開いたフォームの場合には、その次のフォームは呼び出せますが、
開いたまま元のメニューに戻って別のメニューを開く事はできないわけです。

●フォーム呼出しはサブルーチンの実行と同じ
フォーム呼出しは、手続きの実行と同じで、一種のサブルーチンを呼び出す機能に相当する
と考えると分かりやすくなります。またシステムを組む場合もそういった考え方で作ると良いでしょう。
フォーム呼出しで呼び出したフォームから、続けて次のフォームをフォーム呼出しで開けます。
そして開いたフォームを閉じれば、フォーム呼出しコマンドの次に制御が戻ります。

佐田守弘(KS-00119)
15611 〔用語解説〕イベントハンドラのハンドラとは 佐田 守弘 2002/03/30-12:05
記事番号15608へのコメント
jyuuyuuさん
●イベントとは
イベントとは、起こった事象の事をいいます。
桐のイベントの場合について言えば、フォーム開始やレコード移動、ソース値更新、あるいは
キーダウン、マウスクリックといった、桐での何らかの操作や実行結果を差します。
そしてイベントとはそう言った事象なり操作結果の事を意味します。

●イベントハンドラとは
上記のイベントが起きた時に実行させる事になっているコマンドです。
イベントハンドラは、手続き定義開始コマンドで始まり、手続き定義終了コマンドで終わる一連のコマンドです。
そして実際に実行されるのは、この2つのコマンドの間に書かれているコマンド群です。

そして、この2つが混同されているケースが散見されます。
良く、「イベントで作成する」と言います。
間違ってはいないのですが、作るのはイベントではなくて、イベントハンドラの方です。

●何で「ハンドラ」と言うの?
と聞かれそうなので先に言っておきます。
これは自動車のステアリングホイール、電車のマスタコントローラ、さては飛行機の操縦悍を
ハンドルと呼ぶのと同じだ、程度に理解しておいて下さい。
要するにそこを持って取り扱うからハンドルであり、取り扱わせるからハンドラなのだ、
位の意味で良いと思います。

似た様な話で「メソッド呼び出しのメソッドって何?」があります。どうしてメソッドと
言うのかを聞かれても分かりません。

より正しく言えば、プログラムの世界でそういった概念を、その様な用語で呼ぶ事が「しきたり」になっている、
が本当なのでしょうね。
業界用語と同じです。
その概念を知っている人にはすんなりと受け入れられるのでしょうが、概念そのものを知らない
素人は狐にでもつままれた気分になります。
そして「どうしてそう呼ぶんだ?」と聞きたくなります。
でもこれは、そういった用語を最初に使い出した米国マイクロソフト社か、ビルゲイツ会長にでも聞いてみるしかありません。

佐田守弘(KS-00119)
15612 Re:〔用語解説〕イベントハンドラのハンドラとは jyuuyuu 2002/03/30-12:21
記事番号15611へのコメント
佐田先生 Jyuuyuuです。
またまた、懇切丁寧な解説有難うございます。
15年ほど前はN88BASICで給料計算とか財務会計など
プログラムを組んだこと有りますので、今回の解説で80%位
理解出来たような気がします。
もう少し頑張らなくちゃー・・・・・

15613 Re:〔用語解説〕イベントハンドラのハンドラとは hidetake 2002/03/30-13:12
記事番号15611へのコメント
>そして「どうしてそう呼ぶんだ?」と聞きたくなります。
>でもこれは、そういった用語を最初に使い出した米国マイクロソフト社か、ビルゲイツ会長に
>でも聞いてみるしかありません。

前にも書いたけど・・・
http://www.fuku3.com/~habata/kbbs/kakov8/06299.htm

ちゃんと調べたりウラを取りましょう!
http://www.shoeisha.com/book/pc/20c/chap08/gen.htm


15614 自己解決の報告 jyuuyuu 2002/03/31-12:36
記事番号15592へのコメント
いろいろやってるうちに、出来ました

前に書いた通りメインメニューより、一括処理でkyusai4.wfm(顧客管理その1)で
新規または訂正入力へ行きます、

そこに顧客カード印刷のイベントボタンと表示切換のコマンドボタンを配置し、
表示切換ボタンを押すと、kyusai4S.wfm(顧客管理その2)と切り替わります。

kyusai4.wfmに同様なボタンを配置して、その1とその2交互に切り替えできるようになりました。

後学のためどこに間違いが有ったかを(自分でも充分解って無い部分もありますが)書き留めます。

【コマンドオブジェクトの内容】(表示切換)
1)オブジェクト名 コマンドボタン_157
2)標題      表示切替
3)機能名の1   フォームの選択   (右窓)"kyusai4s.wfm"

◎その下の行に 一括処理起動時に有効(C)の窓に チケックを入れる

kyusai4s.wfmフォームでは
3)機能名の1   フォームの選択   (右窓)"kyusai4.wfm"

◎印の部分をいれるかが、思い通りなるか? の分かれ道でした!!!


15615 Re:自己解決の報告→略記「コマンド」 悲しげ 2002/03/31-15:49
記事番号15614へのコメント
老婆心ながら(^^;)

>【コマンドオブジェクトの内容】(表示切換)

これは「コマンドボタン」オブジェクトのことだろうと思います。
ちなみに「コマンドボタン」を略記する場合は、他の人が読むことを考慮して、
「コマンド」とはせずに、「ボタン」にした方がよいです。
なぜならば、「コマンド」と略記する場合は、DOS桐からの流れやcmdとkev含めて、
一般的には「一括処理コマンド」を指すからです。
逆に「ボタン」と略記すれば、今の桐では「コマンドボタン」以外を指すことは有り得ないですし。

今回のjyuuyuuさんの場合は、コマンド=コマンドボタンのことであることは、
文脈上たまたま一目瞭然だったのではありますけれども、
しばしばどちらを指すのかが判りにくい投稿も少なくないので、
この機会に一言コメントさせていただいた次第であります。
15616 Re:自己解決の報告→略記「コマンド」 悲しげ 2002/03/31-15:57
記事番号15615へのコメント
原文を読み直してみて気が付きました。

#15614
>そこに顧客カード印刷のイベントボタンと表示切換のコマンドボタンを配置
し、

jyuuyuuさんは、ボタンの種類に「イベントボタン」と「コマンドボタン」の
2種類があるとお考えなのですね?
(だから「コマンドオブジェクト」とは後者の方であると・・・・)
う〜ん、「イベントボタン」なる用語は無かったと思います。どちらも「コマンドボタン」の筈ですが・・・。

15617 混乱させて申し訳有りません jyuuyuu 2002/03/31-18:32
記事番号15616へのコメント
悲しげさん

>jyuuyuuさんは、ボタンの種類に「イベントボタン」と「コマンドボタン」の
>2種類があるとお考えなのですね?(だから「コマンドオブジェクト」とは
>後者の方であると・・・・)
>う〜ん、「イベントボタン」なる用語は無かったと思います。どちらも「コ
>マンドボタン」の筈ですが・・・。
>

そう言わればそうです、私用語の意味が正確に理解してないことが原因だと思います
何しろ旧制中学(5年制)の3年の時予科練に行き、親には英語は敵国語だから
零点でも構わない言われてました。
横文字の意味を自分に都合よいように解釈してしまう癖が有ります
悲しげさん ご指摘有難うございます、今後気を付けます。

15618 勉強させて頂きました。 佐田 守弘 2002/03/31-22:39
記事番号15613へのコメント
hidetakeさん
貴重な情報有難うございます。さっそく勉強させて頂きました。

私のHPの「桐ver.8Q&A イベントハンドラ」(November 8, 1999)にもそこそこ書いて
おりますが、メソッドに限った話ではなく、日常用語と同じ言葉が別の概念で使われていると
日常の概念にとらわれて、概念が理解しにくい事は確かだろうと思っています。

特に、プログラム開発と縁遠い人に、こう言った専門用語とも言える概念を説明する時に苦労しております。

「メソッドって何?何でメソッドって言うの?」と聞かれて、
*オブジェクトはプロパティとメソッドを持っている。
 プロパティは設定したり変更するもの、メソッドは実行するもの
などと定義通りに答えても、答えになりません。

仮に自分で理解する事ができたとしても、それを初めての人に理解してもらえるように説明するのは、
至難の業だと感じる事も少なくありません。
時には、本来の定義を理解してもらうまでの必要はなく、理解した気分になってもらうだけでも
良いといった場合もあったりしております。

佐田守弘(KS-00119)
15619 Re:勉強させて頂きました。 hidetake 2002/03/31-23:10
記事番号15618へのコメント
>時には、本来の定義を理解してもらうまでの必要はなく、理解した気分になってもらうだけでも
>良いといった場合もあったりしております。

別にそうだとしてもマイクロソフトやゲイツを持ち出す必要は無いと思います。


戻る