【要望】タブ無効時の「変更を保存しますか?」のダイアログ

  1. タブが無効の状態で、複数の編集中ファイルを一度に閉じる際に「変更を保存しますか?」のダイアログが出ますが、該当ファイル数ほどダイアログが連続して出るとありがたいです。

    タブの有効/無効を切り替えて使っておりまして、タブが有効の状態ではダイアログが連続して出ますので、挙動が統一されれば助かります。

    【状況】
    Meryにてタブが無効の状態で、Windowsのタスクバーにて「すべてのウィンドウを閉じる」を実行

    【環境】
    Mery 2.2.5.5016
    Windows7 64bit

     |  saku  |  返信
  2. 書き込みありがとうございます。

    > Meryにてタブが無効の状態で、Windowsのタスクバーにて「すべてのウィンドウを閉じる」を実行

    確かに…
    これはそうしたほうが良さそうですね。
    技術的に全然やり方が分かりませんが、ちょっとやってみます!

     |  Kuro  |  返信
  3. > 技術的に全然やり方が分かりませんが、ちょっとやってみます!

    ぐふ・・・。難しすぎる・・・。
    さすらいの Delphi 使いさんがいらっしゃったら、情報頂けませんか~。

    Delphi の SDI アプリで小窓をいくつか開き、Windows 7 のタスクバーから「すべてのウィンドウを閉じる」を受信したとき (Delphi 的にはすべての小窓に Close のメッセージが来てるだけな気がする) に、小窓の CloseQuery で確認ダイアログを表示して、

    [はい] [いいえ] [キャンセル] を表示。

    [はい]、[いいえ] をクリックした場合は続けて次の小窓に対しても同じ処理、[キャンセル] をクリックした場合はそこで処理を中断。

    っていういわゆる普通の動作をさせたいだけなのに、Application.MessageBox を使用するとどのボタンを押してもそこで処理が中断されるし、普通の MessageBox を使用すると [キャンセル] を押しても処理が続行されてしまう。

    これ Delphi のバグじゃないのかしら…

     |  Kuro  |  返信
  4. お疲れ様ですm(_ _)m

    > これ Delphi のバグじゃないのかしら…
    Windowsアプリケーション開発(ましてやDelphi)には無知ですが、バグ回避コード等を仕込んでコードが乱れるようでしたら、個人的には今のままで十分です。
    タブの有効/無効をショートカットキーに登録してますので、編集中ファイルを一度に閉じる時にはタブ形式にすれば良いですし。

    MeryはSDI/MDIが切り替えられてとても便利です!

     |  saku  |  返信
  5. ●Kuro さん

    > Delphi の SDI アプリで小窓をいくつか開き、Windows 7 のタスクバーから「すべてのウィンドウを閉じる」を受信したとき (Delphi 的にはすべての小窓に Close のメッセージが来てるだけな気がする) に、

    メッセージを覗いたところ,
    ・メインのフォームは WM_SYSCOMMAND(SC_CLOSE) を WM_CLOSE に変換して処理されている
    ・他のフォームは WM_SYSCOMMAND(SC_CLOSE) を無視している(WM_CLOSE に変換していない)
    という動きをしているようです.
    これが Delphi 的にどのような解釈になるのか不明ですが,何か解決の助けになれば.

    # ただこのタスクバーから閉じる動き,ネットを見ているとどうにかしたくても「仕様です」な場合も多いみたいですね

     |  ks  |  返信
  6. ● ks さん

    情報ありがとうございます。
    なかなか情報が見つからず困っていましたが、WM_SYSCOMMAND と WM_CLOSE あたりのキーワード、大変参考になりました。いくつか有益な情報を見つけることはできましたが、Delphi 的に綺麗な実装方法は発見できませんでした…

    Delphi では MDI はサポートされているものの SDI は無理やり実装している感じですので、仕方ない部分なのかもしれません。

    > # ただこのタスクバーから閉じる動き,ネットを見ているとどうにかしたくても「仕様です」な場合も多いみたいですね

    ちゃんと実装できている SDI アプリもあるようですので、どうにかすればできるのかもしれませんが、現状、「仕様です」ということで勘弁していただくことにしようと思います^^;

    ● saku さん

    ありがとうございます。
    いろいろ調査してみましたが、なかなか対応策が見つからず、現在のところは仕様上の制限ということで保留とさせてください。

    > タブの有効/無効をショートカットキーに登録してますので、編集中ファイルを一度に閉じる時にはタブ形式にすれば良いですし。

    Windows 7 のタスクバーからはできませんが、タブ形式にせずとも、すべてを一度に閉じるのは「ファイル」メニューの「すべて閉じる」(デフォルトでは SHIFT + ALT + X キー) で可能です。

     |  Kuro  |  返信
  7. ● saku さん
    不具合を緩和するプラグインを作成しました.
    もしよろしければお試しください.

    http://www.haijin-boys.com/wiki/タスクバーの「すべてのウィンドウを閉じる」実行時不具合の緩和

    ● Kuro さん
    全部のフォームを監視して WM_SYSCOMMAND が複数に来ていれば,
    タスクバーの「すべてのウィンドウを閉じる」とみなして Mery の「すべて閉じる」コマンドを発行する,
    という対処療法的なプラグインです.
    Delphi 的に綺麗に書き直せそうでしたら,是非に.

     |  ks  |  返信
  8. プラグイン、動きとしては理想的ですね!
    ソースを見させていただき、対処療法の意味がわかりましたw

    > Delphi 的に綺麗に書き直せそうでしたら,是非に.

    Delphi の挙動自体を直すか、Mery 側でごにょごにょするか悩ましいところですが…
    がんばってみますw

     |  Kuro  |  返信
  9. > Delphi 的に綺麗に書き直せそうでしたら,是非に.

    はじめにお礼を、、、ありがとうございます!

    Delphi の潜在的な挙動不審の原因はつきとめたのですが、そもそも Delphi の根本的な仕様に関わる部分なので修正できませんでした (涙

    結果、ks さんの対処療法をほぼそのまま採用させていただきました^^;
    ていうか ks さんの方法が一番綺麗です。(タイマーの部分だけちょっと書き換えました)

    ついでに気付いたのですが、タスクバーから「すべてのウィンドウを閉じる」機能、SDI モードに限らず、タブ有効時でもタブを分離して複数ウィンドウにして使用しているときにも効かないので、気付かれた方もいらっしゃるかもしれませんね…

     |  Kuro  |  返信
  10. ・ksさん
    たびたび有難うございますm(_ _)m
    以前は確か Mery.ini について教えて頂だきました。

    タスクバーの「すべてのウィンドウを閉じる」は、何かと重宝してますのでプラグイン助かります。
    MeryWikiにてプラグインを見つけられませんでしたが、kuroさんが作業なさっておられるようなので、更新を待ちたいと思います。

    ・kuroさん
    更新お疲れさまです!
    原因を根本まで調べるkuroさんの姿勢をみて、私も心して背筋を伸ばそうと思います。
    (調査は後回し…と、たまに魔が差しますので 汗)

     |  saku  |  返信
  11. > MeryWikiにてプラグインを見つけられませんでしたが
    すみません、Wikiの"プラグイン"の所を見てました。

     |  saku  |  返信
  12. ● Kuro さん
    本当にお疲れ様でした.

    > Delphi の潜在的な挙動不審の原因はつきとめたのですが、そもそも Delphi の根本的な仕様に関わる部分なので修正できませんでした
    Kuro さんの予想大当たりでしたね! さすがご慧眼!
    ……最新版だとどうなんでしょうかね.直ってたらXE2も直せやゴルァだし,直ってなかったら Delphi 大丈夫なんかだし

    > 結果、ks さんの対処療法をほぼそのまま採用させていただきました^^;
    > ていうか ks さんの方法が一番綺麗です。(タイマーの部分だけちょっと書き換えました)
    30 分で書いたコードが役に立ったようで何よりです!
    タイマーは,実は同じタイマー ID が内部で使われているとそれが動かなくなるというバグ入れ込んでますね,コレ.
    修正版 Mery 出たらプラグインの方は取り下げておきます……

    ● saku さん
    あちこちで出没している ks です.
    プラグイン見つかったようで良かったです.
    有志プラグインのページは自由に編集できる関係上、公式プラグインは別扱いになってるのかなーと思ってます.
    快適な Mery ライフをお送りください.

     |  ks  |  返信
  13. Mery 2.2.6.5031  にて実装してみました。
    たぶん直ってると思うのですが、手元に Windows 7 (64bit) しかなくて他の環境では試せてません…

    ● ks さん

    > Kuro さんの予想大当たりでしたね! さすがご慧眼!

    全然そんなことないです!ks さんのヒントと Google 先生のおかげです^^;
    Delphi で作ったアプリって裏に一枚、アプリケーションフォームという秘密のフォームが隠れてまして、こいつの仕業のようでした。Delphi は昔から伝統的にこの謎仕様なので XE2 以降も直らない気がします。

    > タイマーは,実は同じタイマー ID が内部で使われているとそれが動かなくなるというバグ入れ込んでますね

    10001 は使ってないはずですw
    しかし 30 分でできちゃうなんて神技としか思えません…

    ● saku さん

    > 原因を根本まで調べるkuroさんの姿勢をみて、私も心して背筋を伸ばそうと思います。

    そんなことないですって!w
    Delphi の場合、原因が分かったら 1 箇所直すだけで動いちゃう~!みたいなケースが多々あるので無駄な努力をしないためにも無駄に調べるようになってしまった感じです^^;

    あ、それと以前に話題にあがっていた「タブ幅をファイル名に合わせる」件ですが、隠し機能としてこっそり実装しておきました。

    以下を INI ファイルの General セクションに追記です。

    [General]
    TabRaggedRight=1

    これでタブが画面いっぱいに広がらず、左に寄ってファイル名の幅になると思われます。

     |  Kuro  |  返信
スポンサーリンク