過去の桐井戸端BBS (桐ver.8)
2403 桐8のイベント処理ってそんなに良い? 白石 可勝 1999/8/16-17:51
お久しぶりです。でもこの掲示板は毎日拝見しています。
 最近、桐8を勉強しているうちに、しょっちゅう壁にブチ当たるせいか思うこと
があり、皆さんにお聞き(ぐち?)したく書き込みました。
 イベント処理って、そんなに良いものなのでしょうか?
 「システム」コマンドは使えないし、他のイベント処理中発生しない「タイマーイベント」は何に
使うのか?ただフォームを[オーバーラップ]や[ポップアップ]で開けるだけ
(捨てがたいが)がメリットのような気がします。
それだけで有れば、従来通りの一括処理の方がいろんな事が出来るように思えます。
(本当にぐちになりました。)
 そこで、イベント処理と通常一括処理のメリット・デメリットをいろいろと教えて頂けませんか?
宜しくお願いいたします。
2407 Re: 宮城 1999/8/16-22:09
記事番号2403へのコメント
う〜ん、ですね。良いか悪いかという問題ではないような気がします。

Dos桐からの移植という意味ではイベント処理は不要でしょう。
代替コマンド探して、フォーム・レポート作り替えて・・・。

ただし、完全に別ソフトだと割り切って、さらから作ってみるとどうですか?
一括処理を使わないでアプリケーションができますよということではないでしょうか?
しかし、じゃあ何をするの?というところで、はたと困ってしまうんですけどね。
2408 Re: 白石 可勝 1999/8/17-09:41
記事番号2407へのコメント
 宮城さん、早速のレス、いつも有り難う御座います。

>完全に別ソフトだと割り切って、さらから作ってみるとどうですか?

 宮城さんのおっしゃれるとおり、基本的には割り切っているつもりなのですが、
勉強不足のせいか「一括」で出来て「イベント」で出来ないことが多すぎます。
(あくまでも私のレベルではです。)

 例として、始めにはまったことは、

 A.フォームにラベル1とサブフォーム1、そしてイベントファイルはA.kev
 サブフォームにB.フォーム。
 B.フォームにはコマンドボタン1、B.kev
として、コマンドボタン1が押されたときA.フォームラベル1の標題を変える。

ということが出来ません。
こんなレベルで悩んでいますから終わっています。(未だに解決していません。)

>良いか悪いかという問題ではないような気がします。

 私も、今考えると良い悪いではなくて、勉強不足ですね。
2410 Re: いかすぱげてぃ 1999/8/17-12:55
記事番号2408へのコメント
白石さん、こんにちわ。
古典一括とイベントの使い分け、なかなか頭が痒くなる問題ですね。
さて、

> A.フォームにラベル1とサブフォーム1、そしてイベントファイルはA.kev
> サブフォームにB.フォーム。
> B.フォームにはコマンドボタン1、B.kev
>として、コマンドボタン1が押されたときA.フォームラベル1の標題を変える。

という処理、どんな点にはまってしまいましたか?(^^)

考え方とすると次のようになるかと思います。
-----------------------------------------------------------------------------
A.kev(Aフォーム)

フォーム開始イベントにて
&aHd = &hwindow
として、メインフォームのウインドウハンドルを変数に取得しておきます。

B.kev(Bフォーム)

コマンドボタン1の左マウスボタンクリックイベントにて
 オブジェクト操作 ハンドル=&aHd,@Aのラベル.表題="変えたい表題名"
として、マウスボタンがクリックされた時、メインフォームのラベルオブジェクト
の表題を変更する処理を記述します。
-----------------------------------------------------------------------------
これでたぶんうまくいくかと思います。

現在、確かにイベントはフォームにのみのクローズされたものですので
数々の制約もあり、一部使いにくい状況も発生します。それは間違いありません。
しかし、これも時代の流れなのでしょうね。
もう、K3は古典一括を見捨て、今後、桐の一括はやはりイベントの拡充に終始して
いくことでしょうから…

これは私の考え方ですが、V8では、やはりまずイベント処理で考えてみること
が必要だと思います。(特に新規に作成する場合)
そして、イベントで制約が発生する処理は、まずコマンドボタンに割り付けられないか
考えてみるというのが一番手っ取り早い迂回策のような気がします。
それでも仕様的に出来ない処理の場合は、やはりフォームから抜けて一括に戻って
実行するしかないわけですが…
しかし、この使い方でも、イベントはそのフォーム単体の制御には有効ですから…
美味しいところは使いたいわけですね。

ところが、このような使い方をした時の問題は(起点を古典一括にして、ウインドウ
会話からイベントを使った場合)、そのイベント処理の中で作成した他のウインドウを
イベント処理(やコマンドボタン)では閉じることが出来なくなってしまう点に注意を
要すのです。(これは古典一括を起点として作成されたウインドウは「閉じる」が
「一括処理に戻る」に意味を変えてしまうため)
従って、ちょっとしたウインドウのクローズ制御の度に一括に戻らされるわけです。
実際、こいつには私もしばらく悩まされましたが、この辺が一番ユーザーを混乱
させるのではないでしょうか。

正直言って、私はこれに嫌気がさします。
そして、また結局、すべてイベントで出来ないかという「鶏と卵」状態に陥って
しまうわけです。(^^;

まっ、しかし、そんな愚痴を言っても仕方ありません。
ユーザーはやれることとやれないことを見極めてやるしかないのですから。(とほほ)

イベント処理、是非、頑張ってご習得下さい。(^^)
2411 Re: 白石 可勝 1999/8/17-13:43
記事番号2410へのコメント
 いかすぱげてぃさん、非常に参考になるレスをいただきまして有り難う御座います。

>ユーザーはやれることとやれないことを見極めてやるしかないのですから。

 その通りですね。

>イベント処理、是非、頑張ってご習得下さい。(^^)

 頑張ります。今後ともご指導下さい。宜しくお願いいたします。

>フォーム開始イベントにて
> &aHd = &hwindow
>として、メインフォームのウインドウハンドルを変数に取得しておきます。

 私は、「&aHd = &hwindow」をA.kev(Aフォーム)のメインに書いていますが、「無効
なウィンドウズハンドルです。」が出てきて、&aHdが0になってしまいます。[フォーム開始]
イベントに記述するのと意味が変わるのでしょうか?
 初めてレスをいただいた直後で恐縮ですがさらに教えていただけないでしょうか。
2413 Re:やっと理解できました 白石 可勝 1999/8/17-16:20
記事番号2411へのコメント
 メインフォームのオブジェクトをサブフォームのイベントファイルに記述して変更することが出来なかった
理由がやっと解りました。やっぱり私は未熟者!!いかすぱげてぃさん、有り難う御座いました。
 その1、
> 私は、「&aHd = &hwindow」をA.kev(Aフォーム)のメインに書いていますが
 メイン処理では、ウインドウハンドルを取得出来ないみたいです。
 その2、
 サブフォームのメイン処理の流れの中では、他のウインドウハンドルを指定する[オブジェクト操作]が出
来ないみたいです。
 しかし、具体的な理由はさっぱり解りません。

 再度、いかすぱげてぃさん、本当に有り難う御座いました。
2418 Re: いかすぱげてぃ 1999/8/17-20:24
記事番号2413へのコメント
白石さん、こんにちわ。

>> 私は、「&aHd = &hwindow」をA.kev(Aフォーム)のメインに書いていますが
> メイン処理では、ウインドウハンドルを取得出来ないみたいです。
> その2、
> サブフォームのメイン処理の流れの中では、他のウインドウハンドルを指定する[オブジェクト操作]が出
>来ないみたいです。
> しかし、具体的な理由はさっぱり解りません。

「名札 メイン」もイベントですから、まず、このイベントが発生するときの状態を
考える必要があります。
具体的に言えば、「名札 メイン」では、対象フォームの全オブジェクトが読み込まれ、
フォーム定義画面で宣言した局所変数が宣言されている状態での処理のみ記述できます。
この状態ではウインドウはまったく開かれていませんので、カレントのウインドウハン
ドルは当然、取得できません。(ちなみに、そのフォームで使用する対象表もこの段階
では開かれていませんので表番号なども取得できません)
そして、サブフォームの「名札 メイン」イベントはこのイベント処理の直後の段階で
発生しますので、同様にウインドウハンドルを取得することは出来ないわけです。

次に発生する「フォーム開始」イベントですが、このイベントは、表を開いた後、実際に
フォームをウィンドウとして開く前に発生する段階のイベントです。
ですから、「名札 メイン」イベントでの処理、プラス「サブフォームのメイン処理」
「編集対象表のオープン」「グループ化」、さらに「[開始条件種別]の[開始条件名]
などの実行が終わっている状態で行える処理が最初に記述出来るわけです。
ただし、間違えやすいのはこのイベントの段階では「ウインドウはまだ実際には開かれて
いない」というところになります。
従って、「フォーム開始」イベントを完全に終了するまでは、ウインドウハンドルが不定に
なる場合が多々あります。
これを具体的に言うならば、フォーム開始イベントで、さらに別のフォームを開いた場合
そのフォームから呼び出し元のフォーム(ウインドウ)はハンドルが不定になり扱えなく
なります。
さらに、現状ではさらに大きな問題も秘めています。
実際にシステムを組む場合、フォームを開いた直後に、そのフォームからまた、別のフォ
ームを開いてやりたい処理が発生する状況が多々あります。
例えば、そのフォームを扱うにあたり、パスワードを入力させるダイアログをモーダルで
開きたいケースなどです。
このような場合、本来は「実行時ボタン:開始」を利用してウインドウ開いた直後に、
(最初に)実行したい処理を指定できるのですが、現状では、なぜか、呼び出し元のウイ
ンドウハンドルが不定になってしまいます。(まっ、簡単に言いきってしまえばバグです(^^;)
正直言って、この辺はかなり悩まされました。
対応するには常に「ウインハンドル」を指定しない形式で記述するしかないのが現状です
が、そうすることにより汎用性が著しく制限されてしまいます。
たぶん、この辺は今月末辺りに配布されるSP2版で解消されているかとは思いますが、
気をつけないとドツボにはまるところだと思います。(^^;

長々と書いてしまいましたが、ようするに開こうとするフォームのウインドウハンドルは
「フォーム 開始」イベントで書くのが「お決まり」という風に覚えておく方が宜しいかと
思います。
この位でよろしいでしょうか?(^^)


ちなみに、この辺の仕組みと仕様をもう少し、しっかり説明しなければならないのではな
いかとK3に強く言っておきました。(あてにならんが…(^^;)
2423 Re:恐縮ですが再度教えて下さい。(これが最後) 白石 可勝 1999/8/18-09:39
記事番号2418へのコメント
 いかすぱげてぃさん、なるほどなるほどです。皆さん勉強されているんですね。
そして、改めてこの掲示板の凄さを感じます。非常に役に立ちます。
 そこで、またまた恐縮ですが最後にもう一つ教えていただけないでしょうか。

 コマンドボタンの機能から一般手続きを実行させて、その中で[オブジェクト操作]をすると、
その手続きが終了しないとオブジェクトが変更になりません。例えば、

手続き定義開始 AAA()
 オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”変えたい文”
 繰り返し &繰返 1,100000,1
 繰り返し終了
 オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”元の文”
手続き定義終了

とすると、最終的には何も変わらなくて困って(はまって)います。

 何をしたいかというと、一般手続きの実行状況や経過をリアルタイムにラベルに表示したい。
「只今、絞り込み中」とか「1個目のファイルを複写終了しました。」など。
 [タイマー]イベントを使えば出来るかなと思っていますが・・・・。

 何卒、何卒、宜しくお願いいたします。
2424 Re: いかすぱげてぃ 1999/8/18-11:24
記事番号2423へのコメント
白石 可勝さん,こんにちわ。

> コマンドボタンの機能から一般手続きを実行させて、その中で[オブジェクト操作]をすると、
>その手続きが終了しない
>とオブジェクトが変更になりません。例えば、
>
>手続き定義開始 AAA()
> オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”変えたい文”
> 繰り返し &繰返 1,100000,1
> 繰り返し終了
> オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”元の文”
>手続き定義終了
>
>とすると、最終的には何も変わらなくて困って(はまって)います。

確かにこの辺も、V8イベントでは、ハマりがちなところですね。(^^;

まず、基本的にイベントでは、その手続きを終了しないと、結果がウインドウには
反映されません。さらに、変数値の変更等の場合では、値を変更し、手続きを終えて
もウインドウに反映しないのです。
そのために、V8イベントでは、「変数変更」と「再描画」というメソッドが用意され
ています。これらは手続きが終わった後にオブジェクトを再描画予約するためのものです。
但し、これらのメソッドを使っても、その手続き内では描画が行われません。(予約ですから)
その場合は、「描画更新」メソッドを使用します。
このメソッドでは、再描画予約したオブジェクトを直ちに実行します。
一部、描画更新メソッドでも再描画しないケースも発生しますが、その時は最後の手段として
ウインドウ更新コマンドを利用します。(^^;

ですから、

手続き定義開始 AAA()
 オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”変えたい文”
 メソッド @ラベル_1.再描画()
 メソッド @フォーム.描画更新()
 繰り返し &繰返 1,100000,1
 繰り返し終了
 オブジェクト操作 ハンドル=&hwindow,@ラベル_1.標題=”元の文”
手続き定義終了

という形で大丈夫かと思います。
(再描画メソッドは省略しても動くと思いますけど・・・)

では、では・・・
2428 Re:有り難う御座いました。 白石 可勝 1999/8/18-13:31
記事番号2424へのコメント
 いかすぱげてぃさん、本当に有り難う御座いました。
 イベント処理では出来ないと思い、桐8を捨てようとしていましたが、出来るんですね。
まだまだ勉強不足でした。
 今後とも宜しくお願いいたします。

戻る