「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@722) [中] [---]
@722■ (#2291) 「母艦の閉じた時は」の中では、「秒待つ」が利かなくなる。 - じん (2014-03-17 11:05) /緊急 未処理
【症状】「母艦の閉じた時は」の中では、「秒待つ」が利かなくなる。

【再現方法】
# ------ ここから ----------#
母艦の終了可能はオフ
母艦の閉じた時は
  「終了しますか?」と二択
  もしそれがはいならば
    ダイアログ表示時間は1
    「30秒後に終了します。」と言う
    6回
      4秒待つ ###### ここだけ機能しない ######
      ダイアログ表示時間は1
      「あと{30-回数×5}秒で終了します。」と言う
    母艦の終了可能はオン
    終了
  違えば
    「終了をキャンセルしました」という
# ------ ここまで ----------#
(このプログラムは再現させるためだけに作ったもので、
プログラム自体にはあまり意味はありません。)

【要望】「母艦の閉じた時は」の中でも、「秒待つ」が機能するようにしてほしい。

【バージョン】デラックス版 1.539

【その他】
「母艦の閉じた時は」の中で「秒待つ」を使いたいシーンがいっぱいあります。(+_+)
 なんとか対応してください。

(#2374) とりあえずの対処方法 - こころちゃん (2014-12-14 13:23) /中 未処理
私も同現象が発生します(デラックス版1.546)が、とりあえず次の方法で対処しています。参考にしてください。

# ------ ここから ----------#
母艦の終了可能はオフ
母艦の閉じた時は
  「終了しますか?」と二択
  もしそれがはいならば
    ダイアログ表示時間は1
    「30秒後に終了します。」と言う
    6回
      OLDシステム時間=システム時間
      1の間
        もし(OLDシステム時間+4*1000<システム時間)ならば抜ける
      ダイアログ表示時間は1
      「あと{30-回数×5}秒で終了します。」と言う
    母艦の終了可能はオン
    終了
  違えば
    「終了をキャンセルしました」という
# ------ ここまで ----------#

(#2388) なるほど! - じん (2015-01-10 10:34) /中 未処理
「タイマー」とか「ダイアログ表示時間」とかいろいろ試してみましたが、「システム時間」を使うことは思いつきませんでした。(゚〇゚)
なるほど、これもありですね!(*^。^*)
今のところ、のなおさんに教えていただいた API の Sreep 関数で一時しのぎしています。
Sleep(dwMilliseconds) =DLL("Kernel32.dll","VOID Sleep(DWORD dwMilliseconds)")
こうした「一時しのぎ」ではなく、ちゃんと「秒待つ」が機能してくれるようになるのが一番よいのですが。(-_-;)ゞ

(#2389) うまくゆかない根本の原因はWindowの仕様 - うぇいく (2015-01-14 22:38) /中 ---
一応、補足。

フォーム(Window)の作成中と閉じている途中というのは、特殊な状態となっており、それを確定させるまで、自身については他のこと(イベント/メッセージ処理)をできません。作成中ならば、作成を完了させるまで(なでしこではこの部分は内部で処理しています)、閉じている途中ならば、キャンセルしてイベントを終わらせるか、キャンセルせずにイベントを終わらせる(=閉じる動作を継続する)までが、該当します。

待つ命令が、自身のフォームの移動やリサイズを受け付けられるを見て分かる通り、他のことするための命令になっていて、上記の仕様と相いれません。
(他のことを受け付けない、WIN32APIのSleepならば可能です。また、モーダルダイアログを開いた場合は、自身のことを出来ないので、これも大丈夫です。)

どうしても、閉じる途中でなにか長い処理を挟み込みたい場合には、1度、閉じるをのキャンセルして、別途長い処理をしたうえで、その後に、まだ必要ならば、閉じることでうまく見せかける形になると思います。

もともとのWindowsの仕様上の制限の話なので、ちゃんと動くようにする方法は私には思いつきません(仕様通り、動かないようにするのならできますが)
実装上、よい方法があればコメント等でよろしくお願いします。

サンプルと異なる、実際にやりたいことがある場合、それを仕様の範囲内でうまく実装してみてください(それも、プログラミングの面白さの1つですし、万能ではないからこそ、うまく実装できたプログラムと人が評価されます。)

(#2291)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能