プログラム側から画面を閉じるときの動作

投稿者: 投稿日:2018/12/16(Sun) 23:40:55 No.2317

 こんにちは、お世話になります。

 Alt+F4で画面が閉じるのを抑止したいと思い、「閉じる時の手順」に「この時のキャンセルは、○」と書いたんですが、これをすると、プログラム側から画面を閉じることもできなくなってしまうようで、困っています。
 何かよい対処法はないでしょうか。
 以下が私が書いたサンプルソースです。

----------
メイン画面を表示する
待機する

メイン画面とは
ウィンドウを継承する

はじめ手順
初期化する
終わり

初期化する手順
この内容を「メイン画面」に変える

ボタン1というボタンを作る
その内容を「画面切り替え」に変える

ボタン2というボタンを作る
その内容を「終了」に変える
終わり

ボタン1がクリックされた時の手順
サブ画面を表示する
閉じる
終わり

閉じる時の手順
この時をキャンセルする
終わり

ボタン2がクリックされた時の手順
終了する
終わり
終わり

サブ画面とは
ウィンドウを継承する

はじめ手順
初期化する
終わり

初期化する手順
この内容を「サブ画面」に変える
終わり
終わり
----------

 このソースを実行して、「画面切り替え」ボタンを押すと、サブ画面は表示されますが、メイン画面が閉じずに残ってしまいます。
 何かアドバイスを頂けると幸いです。

 以上、よろしくお願いいたします。

Re: プログラム側から画面を閉じるときの動作

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2018/12/17(Mon) 23:21:40 No.2319

陸さん、こんばんは。アークです。

画面を閉じる方法は「ボタン2」として用意されていて、
それを使えば終了するのでウィンドウの「×」ボタンの事でしょうか。

確かに「この時をキャンセルする」してしまうと「×」ボタンも利かなくなるようです。
それに拘るのならキーイベントをフックして処理するプログラムを作成して、
常駐させる方法が思いつきますがC言語で作成する事になると思います。

Re: プログラム側から画面を閉じるときの動作

投稿者:とおり 投稿日:2018/12/17(Mon) 23:57:05 No.2320

常套手段としては、グローバルな変数をフラグとして持っておいて、
・フラグはオフで初期化しておく。
・閉じる時のイベントでは、フラグがオフなら、イベントをキャンセルするようにする。
・プログラム中から明示的に閉じたい時やプログラムを終了したい時等は、閉じるや終了の命令の間に、フラグをオンにする。
という感じです。

こういう事でしょうか?

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2018/12/18(Tue) 12:17:56 No.2321

陸さん、こんにちは。アークです。

サブ画面を表示した時にメイン画面を自動的に閉じたいという事なら、
とおりさんの言われるようにする事で目的は達せられます。
以下に修正後のソースを載せます。

----------
メイン画面を表示する
待機する

メイン画面とは
ウィンドウを継承する

はじめ手順
初期化する
操作は、「×」
終わり

初期化する手順
この内容を「メイン画面」に変える

ボタン1というボタンを作る
その内容を「画面切り替え」に変える

ボタン2というボタンを作る
その内容を「終了」に変える
終わり

ボタン1がクリックされた時の手順
操作は、「○」
サブ画面を表示する
閉じる
終わり

閉じる時の手順
この時のキャンセルは、○
もし操作が「○」なら
この時のキャンセルは、×
もし終わり
終わり

ボタン2がクリックされた時の手順
終了する
終わり
終わり

サブ画面とは
ウィンドウを継承する

はじめ手順
初期化する
終わり

初期化する手順
この内容を「サブ画面」に変える
終わり
終わり
----------

目的だけ考えてみました

投稿者:とおりすがりや 投稿日:2018/12/19(Wed) 04:39:57 No.2322

アークさんととおりさんとは違うアプローチで考えてみました。

「Alt+F4で画面が閉じるのを抑止したい」と書かれているので

キーが押された時の手順
  もしこの時のオルトキーが○かつこの時のキー名が「F4」なら
    この時の処理済みは、○
  もし終わり
終わり

これでalt+4Fキーではウィンドウを閉じなくなります。
なのでウインドウを閉じるのまで無効化されません。

ありがとうございます

投稿者: 投稿日:2018/12/19(Wed) 19:04:32 No.2323

 こんにちは、お世話になります。

 皆さん、ありがとうございます。

 すみません、少し説明不足でしたね。
 Alt+F4を無効化する方法も考えたんですが、画面上の×ボタンで閉じるのも抑止したかったので、最初に投降したようなソースになりました。
 イベント情報の「この時の理由」で分岐できないかとも考えたんですが、プログラム側から画面を閉じるのもキー操作等で画面を閉じるのも「ユーザ操作」となるようで、この方法は無理そうでした。
 やはり画面を切り替えるたびにフラグを立てないといけないですかね。
 少し面倒ですが、それで頑張ってみます。

 それでは。

Re: ありがとうございます

投稿者:とおり 投稿日:2018/12/19(Wed) 23:27:38 No.2324

どの程度手間がかかるかは、組み方次第 ということになるかと思います。
・フラグを立てて閉じる手順を作り、プログラムからは「閉じる」の代わりにそちらを呼ぶ。
 ※もし、ぷろでるが、継承して、同名の手順で置き換えた手順の中から、
  継承元にある元の機能の手順を呼ぶ方法があるなら、同じ「閉じる」という名前が使えます。
・閉じる時のイベントにて、フラグがオンで閉じる動作をキャンセルしなかったとき、すぐにフラグをオフに戻しておく。
とすると、だいぶ楽になるかと思います。

「※」の部分できれば、通常のウィンドウ(を継承したウィンドウ)と変わりなく使用できて楽ですが、ぷろでるでの記述方法はわかりません。継承の構造を持つ多くの言語では可能なことなので、ぷろでるにも、方法はあるのではと思います。

なお、質問の際には、もともとの目的(手段のための目的ではなく、本当にやりたかったことそのもの)を書いた方が回答がずれなくなります。うまい方法が無く行き詰まるような場合には、思考の2〜3手前で、方向を誤っていることも多いためです。

Re^2: ありがとうございます

投稿者: 投稿日:2018/12/22(Sat) 08:49:59 No.2326

 こんにちは、お世話になります。

> なお、質問の際には、もともとの目的(手段のための目的ではなく、本当にやりたかったことそのもの)を書いた方が回答がずれなくなります。うまい方法が無く行き詰まるような場合には、思考の2〜3手前で、方向を誤っていることも多いためです。

 確かにそうですね。
 以後気を付けます。

 それでは。

▲ページの先頭へ

- WebForum -