Appeon PB 電子会議室
発言No. | 更新日 | 題名(クリックすると発言内容と関連するコメントが表示されます) |
---|---|---|
24569 | 20/02/27 18:51:40 | RE(3):PBAppeonPB2017: DW.Print()を実行後、後続コードの実行前にウィンドウを閉じることができてしまう By asano01 |
24568 | 20/02/27 17:29:13 | RE(2):PBAppeonPB2017: DW.Print()を実行後、後続コードの実行前にウィンドウを閉じることができてしまう By Wutian |
24567 | 20/02/06 20:12:32 | RE:PBAppeonPB2017: DW.Print()を実行後、後続コードの実行前にウィンドウを閉じることができてしまう By 178504 |
24566 | 20/02/06 16:08:48 | PBAppeonPB2017: DW.Print()を実行後、後続コードの実行前にウィンドウを閉じることができてしまう By 178504 |
カテゴリ:PowerBuilderの不具合?
日付:2020年02月27日 17:29 発信者:Wutian
題名:RE(2):PBAppeonPB2017: DW.Print()を実行後、後続コードの実行前にウィンドウを閉じることができてしまう
この事象、PBのバグというより仕様なんじゃないですかね。
ボタンクリックなどのイベントはイベントキューに追加されるので非同期です。
なのでcb_1のクリック後、cb_1の処理が動いているときにcb_2や×ボタンをクリックできるのは
仕様になると思います。
cb_1の処理が終わってCloseWithReturn()が動いた後にcb_2のCloseWithReturn()が動く
(タイミングによっては逆もあり)と最初のCloseWithReturn()ですでにresponse!のウィンドウが
閉じられているため2回目のCloseWithReturn()がエラーになるのでしょう。
(×ボタンの時はcb_1の処理前にClose()で閉じられてるからかな)
これを回避するためにはcb_1クリック直後にcb_2をDisableにするとか、プログラムで対策が
必要になりますね。(Javaとかで作ったWebシステムでもそんな対策をした記憶が・・・)
main!の時にエラーにならないのは、CloseWithReturn()はレスポンスウィンドウだけで
使用できるとマニュアルに書いてあるので、main!のウインドウではそもそも動かない(無視?)
のだと思います。
以上はほぼ個人的な意見ですが参考にしてください。
>自己レスになります。
>
>ウィンドウの種類がresponse!のウィンドウ上でPrint()を行うと、
>後続処理が走行する前にウィンドウが操作可能な状態にあり、
>他の操作ができることに起因していました。
>
>Print()の後続処理としてCloseWithReturn()がある場合、
>Print()後のウィンドウが操作可能なタイミングで×などによって
>ウィンドウを意図的に閉じる(とてもシビアなタイミングなので×を連打しまくる)と、
>当然のごとくCloseWithReturn()でエラーとなります。
>
>確認していませんが、ウィンドウを意図的に閉じた場合、
>ウィンドウが破棄されているため、恐らくオブジェクト操作をする
>実装が行われていると必ず死ぬのでは・・・。
>
>そもそもPrint()を実行後に、後続処理がまだ終わっていないのに
>ウィンドウを操作できることに問題があると思われます。
>
>これはPBの不具合でしょうか?
>また、ウィンドウの種類をmain!にすると上記のような現象は発生しません。
>回避策としてはそれしかないでしょうか?
>
>
>
>
>>下記のようなコードがあった時、画面Bでcb_1をクリック後、
>>すぐさまウィンドウの×ボタンをクリックしたり、cb_2をクリックすると、
>>CloseWithReturn()が走行するより前にウィンドウが閉じてしまい、
>>CloseWithReturn()でエラーになってしまいます。
>>
>>実装コードとしては非同期処理を実施しているわけでもないのに、
>>コード処理の途中でウィンドウメッセージが伝わるのが
>>変な気がするのですが、PBの不具合なんでしょうか?
>>
>>回避する方法はありますでしょうか?
>>
>>この現象はPB12.1でも発生していました。
>>Windows7、Windows10のいずれでも発生します。
>>
>>
>>【A:呼び元画面】
>>OpenWithParm(print_test, dw_1)
>>
>>【B:呼び先画面(ウィンドウの種類reponse!)】
>>[Instance Variables]
>>DataWindow idw
>>
>>[open()]
>>idw = Message.PowerObjectParm
>>
>>[cb_1:clicked()]
>>idw.Object.DataWindow.Print.Page.Range = ""
>>idw.Object.DataWindow.Print.Copies = "1"
>>idw_current.Object.DataWindow.Print.Collate = "Yes"
>>idw.Print( true )
>>
>>CloseWithReturn( parent, 1 )
>>
>>[cb_2:clicked()]
>>CloseWithReturn( parent, 0 )
>>
付加情報:
PowerBuilder Version AppeonPB2017
Client SoftWare
OS Windows7
DBMS DBMSクライアントソフトウェアなし
Browser その他
Server SoftWare
OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.