過去の桐井戸端BBS (桐ver.9)
18603 繰り返しでセットした「オブジェクト操作」の内容が正常に反映しない はちがめ 2003/01/19-08:50
皆さんこんにちは。
状況説明
一覧表形式のフォームで項目(に該当するもの)を9個設定しています。
編集対象表は9項目以上あります。
そこで、変数&m先頭ソース番号に数字をセットして下記の一般手続きを呼び出します。
結果として&m先頭ソース番号の項目番号以降の連続する項目を表示したいということです。

現象
手続きの中で「確認」をはずして実行すると、9項目全てに同じ内容が表示されます。
推測するに、最後の設定内容で全て表示されてるようです。
そこで、確認を入れて1項目ずつ[OK]していくと正常に期待どおり表示される。

疑問点
「確認」を実行するしないで挙動が変わるのはなぜか?
不可解でなりません。
なぜこのような現象がでるのかご教授お願いします。


手続き定義開始 設定()
 繰り返し &i=0,8
   代入 &m対象項目名="t項目名"+#str(&i+1)
   代入 &m対象項目値="t項目値"+#str(&i+1)
   オブジェクト操作 &m対象項目名.ソース = \
"#項目属性(&m先頭ソース番号+&i,1)"
   オブジェクト操作 &m対象項目値.ソース = \
"#項目属性(&m先頭ソース番号+&i,0)"
*確認 #項目属性(&m先頭ソース番号+&i,1)    /* ← 本来はありません
 繰り返し終了
手続き定義終了

環境 桐V9 WIN2K

なお、この後返答が遅れるかも知れませんがお許し下さい。
18606 オブジェクトのソース変更は 佐田 守弘 2003/01/19-11:37
記事番号18603へのコメント
はちがめさん
通常は、フォームのオブジェクトは固定値なのですが、どうやら
オブジェクトのソースを動的に変化させようという大変に高度な事をされている様ですね。

オブジェクト操作コマンドを使えば、オブジェクトのソースを変化させる事も可能ではあるのですが、
その条件があると思います。

●フォームが開く手順
フォームが開かれるとイベントファイルを開き、イベントファイルの
メイン部分が実行されます。
次いで対象表が開かれ、項目が読み込まれてオブジェクトに表示されます。

私の理解では、オブジェクト属性のうち、フォームの対象表やオブジェクトのソースといった基本的な属性は、
編集表が開かれる前に確定している必要があると思います。

つまりこれらはイベントのメインの部分で予め行っておく必要があると思います。
イベントハンドラの中でオブジェクトのソースを変更しする事は、
本来できないのではないかと考えます。
ただし、本来できなくても(動作保証がされていなくても)、
たまたま確認コマンドで時間遅延を入れたためにソースの変更が
できてしまった現象が起きたのではないかと思うのですが。

佐田守弘(KS-00119)
私の理解が当っているかどうか、後日にはなりますが、確認しておきます。
18608 Re:オブジェクトのソース変更は うにん 2003/01/19-11:50
記事番号18606へのコメント
佐田 守弘さん

>イベントハンドラの中でオブジェクトのソースを変更しする事は、本来
>できないのではないかと考えます。

オブジェクトの種類や属性によって、できるものとできないものがあります。
一括処理&イベントリファレンスで「オブジェクト操作 設定」を見てください。

ラベルの標題やテキストのソースは、変更できます。
変更後「再描画」すればうまく表示できます。
一括処理&イベントリファレンスで「再描画」を見てください。

18615 Re:オブジェクトのソース変更は 佐田 守弘 2003/01/19-15:27
記事番号18608へのコメント
うにんさん
フォロー有難うございます。
テキストのソースは再描画で有効でしたか。
勘違いしてました。

佐田守弘(KS-00119)
18632 オブジェクトのソース変更は はちがめ 2003/01/20-00:03
記事番号18615へのコメント
佐田さん、うにんさん ありがとうございます。

>イベントハンドラの中でオブジェクトのソースを変更しする事は、本来
>できないのではないかと考えます。
多分そうなのでしょう。先の手続きを実行後再定義画面に移動した時ソースの内容は変わっていません。
しかし表示上はそれなりの表示になっています。
ただ、確認を入れない場合同じ内容で表示されるのが不思議です。
確認を入れると連続した項目名と項目内容が表示されます。

>変更後「再描画」すればうまく表示できます
ひょっとしたらその辺かなと思っていました。
確認を入れる入れないで挙動が変わるのは、
「確認」を実行したらその都度再描画を行っているからなのかなーと思います。
ただ、コマンド的には設定を完了した時点で一括して表示したいなーと思いますね。
今回の件ではそれは難しいということでしょうか?

>一括処理&イベントリファレンスで「再描画」を見てください
指定したオブジェクトの操作結果だけをウィンドウ上に反映させるために、再描画を予約します。
このメソッドは、変数をソースに指定しているオブジェクトの再描画を制御するために使用します。
たとえば、同じ変数値をソースにしているオブジェクトがふたつあるとき、
一方のオブジェクトの値だけを、画面上に表示するために使用します。
再描画を予約したオブジェクトは、[描画更新]メソッドで再描画させることができます。
[描画更新]メソッドを使用しなかった場合は、イベントハンドラがすべて終了したときに再描画されます。

上記はヘルプの内容ですが、読んでみてもいまいち理解できません。

一般に「確認」は変数等の状況を確認したり、コマンドを一時停止してそのときの
状況を確認するのに利用しますね。
しかし、それで処理の内容が変わることはほとんどありませんし、
そのようなことがあってはならないと思います。
でなければ「確認」はうかつに使えません。
それが、みごとに現象が変化する・・・それがなぜなのか?それが問題だ(^^;

まだやってませんが、今回の解決策としては「再描画」をつかって解決を図ろうか
と思っていますが、「確認・・・の部分が釈然としないため投稿しました。

話は変わりますが、ひょっとしたら別スレッドかと思いますが、
あえてここに書きます。

今回の事案は一括→イベントの過程で出てきました。
一括ではウインドウ作成・会話で表形式で表示していました。
イベントに移行する時点で、表形式で表示ができないため(?)、
フォームを定義する必要に迫られフォームで多項目を表示する手法として苦心しています。
フォーム呼び出し以外で転置集計表を表示するそのような方法があればご教授下さい。
ちなみに、この表あるいはフォームは単に確認のためで入力作業等は一切ありません。
18639 Re:オブジェクトのソース変更は いかすぱげてぃ 2003/01/20-12:42
記事番号18632へのコメント
はちがめさん、こんにちわ。

------------------------------------------------------------------------------------
手続き定義開始 設定()
 繰り返し &i=0,8
   &m対象項目名="t項目名"+#str(&i+1)
   &m対象項目値="t項目値"+#str(&i+1)
   オブジェクト操作 &m対象項目名.ソース = "#項目属性(&m先頭ソース番号+&i,1)"
   オブジェクト操作 &m対象項目値.ソース = "#項目属性(&m先頭ソース番号+&i,0)"
 繰り返し終了
手続き定義終了
------------------------------------------------------------------------------------

まず、この処理だと最終的にはすべての項目(t項目名1〜t項目名8及t項目値1〜t項目値8)の
ソース値に「#項目属性(&m先頭ソース番号+&i,1)」が入ってしまいます。
言い換えれば、その時(繰り返し処理が終わった時)の&iの値は「9」であるわけですから、
すべて最後の値(&i=9)で表示されるのはごく正常な動作のように思えます。

次に「確認 #項目属性(&m先頭ソース番号+&i,1)」コマンドでは、その時の(&i)の値を
繰り返し処理内でリアルタイムに表示しているので、ソース値の設定とは無関係です。
インクリメントされるその都度、(&i=0〜8)の値に対応した値を表示しているのでこれも正常だと思います。

では、正しく設定したい場合は…
------------------------------------------------------------------------------------
手続き定義開始 設定()
 繰り返し &i=0,8
   &m対象項目名="t項目名"+#str(&i+1)
   &m対象項目値="t項目値"+#str(&i+1)
   オブジェクト操作 &m対象項目名.ソース = "#項目属性(&m先頭ソース番号+"+#str(&i)+",1)"
   オブジェクト操作 &m対象項目値.ソース = "#項目属性(&m先頭ソース番号+"+#str(&i)+",0)"
 繰り返し終了
手続き定義終了
------------------------------------------------------------------------------------
と、こんな感じになるのではないでしょうか。
ご確認ください。

いかすぱ

PS.好き好きにもよりますが、例えば設定するソース値が画像データ(のような重いもの)を
   指定するような場合には、描画更新メッソドをソース変更後に発生させるといいでしょう。

   描画更新メソッドなし:すべてのソース変更後、すべての画像を一気に表示しようとする
              ので処理後待たされます。その代わり「画面が一気に書き変わります」
              擬音的には「んんんーーーーーん、ぱっ!」(まい ましん)
           あり:1ソース変更の度に表示されますので、「ぺら、ぺら」という感じの表示になります。
              (無論、トータル的には遅くなります)

   表示負担の少ないものは、どちらでも同じに見えます。

18640 Re:オブジェクトのソース変更は うにん 2003/01/20-12:42
記事番号18632へのコメント
>ひょっとしたらその辺かなと思っていました。確認を入れる入れないで挙動が変わ
>るのは、「確認」を実行したらその都度再描画を行っているからなのかなーと思い
>ます。ただ、コマンド的には設定を完了した時点で一括して表示したいなーと思い
>ますね。今回の件ではそれは難しいということでしょうか?

繰り返しのあとで描画更新すればよさそうな気がしますが。

>一般に「確認」は変数等の状況を確認したり、コマンドを一時停止してそのときの
>状況を確認するのに利用しますね。しかし、それで処理の内容が変わることはほと
>んどありませんし、そのようなことがあってはならないと思います。でなければ
>「確認」はうかつに使えません。

桐の場合データが変わることはあまりないと思いますが、WindowsというマルチタスクOSの上で動いている以上、
途中で「確認」で止めた場合に止めない場合と表示上の動作が変わるのは仕方ないと思います。
時間の流れは止めようがないので。。。(詳しく検証してないので桐のバグでないとも言い切れませんが)

>今回の事案は一括→イベントの過程で出てきました。
>一括ではウインドウ作成・会話で表形式で表示していました。
>イベントに移行する時点で、表形式で表示ができないため(?)、フォームを定義
>する必要に迫られフォームで多項目を表示する手法として苦心しています。
>フォーム呼び出し以外で転置集計表を表示するそのような方法があればご教授下さ
>い。

なるほど。「表呼び出し」コマンドがあればいいのですがねえ。
たゆーさんのところに、宮田さんの作った表形式表示フォームのサンプルがあります。
http://mokuchan.hp.infoseek.co.jp/download/dl-list.htm

>ちなみに、この表あるいはフォームは単に確認のためで入力作業等は一切ありませ
>ん。

ウィンドウ作成で転置集計した表のウィンドウを表示するところまでで一旦イベントの処理を終了させて、
ユーザが確認してそのウィンドウを最小化するとタイマーイベントで続きを実行する、なんてことをやってみました。

名札 メイン
変数 整数{&hw,&hw2}

手続き定義開始 コマンドボタン_1::マウス左アップ(長整数 &マウス位置[2],長整数 &明
細番号,長整数 &フラグ)
*確認前の処理*手続き実行 転置集計()
ウィンドウ作成 表, 位置=(0,0), サイズ=(400,300), ハンドル=&hw, カーソル位
置=先頭, オプション=通常
オブジェクト操作 @フォーム.タイマー値1 = "0.5"
確認 "ウィンドウを最小化すると処理を続行します"
手続き定義終了

手続き定義開始 フォーム::タイマー1()
ウィンドウリスト取得 &hw2
if (&hw<>&hw2)
*確認用のウィンドウが一番手前でなければタイマーを中止して続きを処理
オブジェクト操作 @フォーム.タイマー値1 = "0.0"
確認 "続行中"
*確認後の処理*手続き実行 何か()
end
手続き定義終了

18642 Re:オブジェクトのソース変更は いかすぱげてぃ 2003/01/20-13:24
記事番号18639へのコメント
なるほど。
もう一度、ご質問を読み返してみて追加します。

多分、「確認コマンド」を入れると、その時、項目(オブジェクト)の値も正常(のよう)に表示されているのだと思います。
これはある面、再描画メソッドを発行していないが為、一見正常のように見えてしまった為ではないかと推測出来ます。
(ソース値が再評価されていない)

ですから、確認コマンドを入れて一見正常に表示されても、なんらかの処理によりフォームが
再度描画更新されてしまえば、すべて同じ値になってしまいます。(&iの値が不安定ですから未定義になるかも・・・)

試しに、繰り返し後、すぐに再描画コマンドを発行してみると分かるかもしれません。
多分、すべて&iの最後の値(もしくは未定義)に代わってしまうはずです。

最近、また桐を触っている いかすぱ

18659 解決しました。 はちがめ 2003/01/20-22:19
記事番号18639へのコメント

いかすぱげてぃさん、こんばんは。

参考手続きを示して頂きありがとうございました。
よく見てみると、私のコマンドの記述のミスに気づきつい笑ってしまいました。
そうですね。ソースの内容は「”」で囲ってありましたね。

結論から書きます。
オブジェクト操作 &m対象項目名.ソース = \
          "#項目属性("+#str(&m先頭ソース番号+&i)+",1)"
オブジェクト操作 &m対象項目値.ソース = \
          "#項目属性("+#str(&m先頭ソース番号+&i)+",0)"
いかすぱげてぃさんのコマンドと若干異なりますが、大きなヒントを戴きました。
これで、完璧に動作します。スピードは決して早いとはいえませんが、眺めるだけですのでなんとか満足のいく程度です。
先のスレッドで教えて頂いた
メソッド呼び出し @t項目名9.ソース値取得( &mWFM右端項目名, 0)
の結果も見事に反映し、制御もうまくいきます。(それまでは両端でうまく止まってくれませんでした。)

表示上だけですが、「確認」あるいは「メソッド呼び出し @フォーム.描画更新()」で
見かけ上問題なく表示される件については、現在も「?」です。

とりあえず、無事解決しました。ありがとうございました。
18660 解決できました。 はちがめ 2003/01/20-22:56
記事番号18640へのコメント
うにんさん、こんばんは。
コメントありがとうございます。

いかすぱげてぃさんへの返事で書きましたが、無事解決しました。
ソース値設定内容が文字列であることに気づかず連番が機能していませんでした。
先のスレッドでうにんさんに教えていただいた「ソース値取得」の結果も期待どおり取得できるようになりました。

>なるほど。「表呼び出し」コマンドがあればいいのですがねえ
そうですよね。ほしいですよね。
私がちょっと言ったために、ご丁寧に具体案をご教示頂きありがとうございます。
ただ、申し訳ありませんがいまのところ確認・実行していません。「タイマーイベント」は勉強不足で、
どのようなケースでどのように使うのか解りません。いずれ使ってみたいと思いますので、お許し下さい。

今後ともよろしくお願いします。
18662 Re:解決できました。 うにん 2003/01/20-23:44
記事番号18660へのコメント
>いかすぱげてぃさんへの返事で書きましたが、無事解決しました。

よかったですね。

>ソース値設定内容が文字列であることに気づかず連番が機能していませんでした。

テスト用の表を作るのに横着して自動定義のを使ったので、自分のとこでは勝手に
オブジェクト操作 &m対象項目値.ソース = "["+#JIS(#JIS(&STR)+&i)+"]"
こんなことをやっていたので気づきませんでした(^^;

>「タイマーイベント」は勉強不足で、どのよ
>うなケースでどのように使うのか解りません。

ユーザの操作と無関係に一定間隔でイベントが発生します。
先の例では、ボタンのクリックイベント処理が終了して会話処理になった状態で
タイマーイベントでウィンドウの操作を監視しています。

実は私も実務でタイマーを使ったことはまだありません(^^;

18664 タイマーイベント はちがめ 2003/01/21-00:46
記事番号18662へのコメント
うにんさん、こんばんは。レスありがとうございます。

>>「タイマーイベント」は勉強不足で、
>>どのようなケースでどのように使うのか解りません。
>タイマーイベントでウィンドウの操作を監視しています。
なるほど。なんとなく雰囲気が見えてきました。
先の私の例では、コマンドボタンを単発でクリックしますが、
「押し続けることで連続スクロールする」みたいなことを連想していましたが、
仰るような利用法があるのですね。
勉強してそのうち使えるようになりたいと思います。

>たゆーさんのところに、宮田さんの作った表形式表示フォームのサンプルが
>あります。
宮田さんの作品見ました。
すばらしいですね。軽快に走っています。
あのようなイベントが書ければいいなあと思います。
ただ、今回の私の場合は、単に確認のためだけですしマウスで操作したいと思いましたので、
宮田さんの作品は、いつか別の機会に活用できたらと思います。
しかし、すばらしい。

戻る