複数ファイルを編集中にひとつを閉じた時

  1. タブ表示でない SDI モードで、複数ファイルを編集している状態からファイルのひとつを閉じると、直前にアクティブだったウィンドウが再びアクティブになるはずですが、期待したとおりに動作しません。

    直前にアクティブだったウィンドウが別ファイル編集中の Mery の場合、機能を割り当てたショートカットキーは機能しますが、編集画面に対するキー操作は受け付けない状態です。直前にアクティブだったウィンドウが別のアプリケーションでも、似たような状況です。

    実はこのとき Alt + TAB を長押しすると閉じたファイルが表示に残っていることがわかります。どうやら閉じたファイルがフォーカスを別のウインドウに渡していないようです。この問題を回避するために「ファイルを閉じる」動作をマクロにして、ショートカットから実行しています。

    -------------------------------------------------------------------------------
    var MEID_FILE_CLOSE = 4119;
    editor.ExecuteCommandByID(MEID_FILE_CLOSE);
    if(editor.ActiveDocument)editor.ActiveDocument.Activate();
    -------------------------------------------------------------------------------

    上の解決方法を探している最中、editor.ExecuteCommandByID(MEID_FILE_CLOSE) の後で使用すると障害を起こすマクロコマンドをいくつか発見しました。

    1.Window.Alert() や PopupMenu.Track() などのインターフェースコマンドを使うと Invarid Pointer Operation エラーが起きます。

    2.タブモードが有効な場合に ExecuteCommandByID(MEID_WINDOW_PREVIOUS_DOCUMENT)や documents.item(index) などのドキュメントの並び順にかかるコマンドを使う とタブバーの表示が乱れ Access Violation エラーが起きます。

    なお、ExecuteCommandByID(MEID_FILE_CLOSE) でなく Document.Close() で閉じた場合は、それ以降のマクロコマンドは実行されません。マクロの呼び出し元がメモリーから消えるので納得の仕様ですが、ExecuteCommandByID(MEID_FILE_CLOSE) も同じ仕様にすると上のマクロは使えなくなります。

     |  goat  |  返信
  2. > タブ表示でない SDI モードで、複数ファイルを編集している状態からファイルのひとつを閉じると、
    > 直前にアクティブだったウィンドウが再びアクティブになるはずですが、期待したとおりに動作しません。

    直前のウィンドウをアクティブにしたらピヨンと最前面に出てきちゃったりと、なかなか期待通りの動作を
    実現できなかったため、どうせなら非アクティブでいいかな~って妥協していたのですが、
    ご指摘いただき、再度いろいろ調べてみましたところ、どうにか解決の糸口が見つかりそうです。
    次バージョンでは直せるかもです。(次バージョン出るのか?っていう話もありますが・・・)

    > 上の解決方法を探している最中、editor.ExecuteCommandByID(MEID_FILE_CLOSE) の後で使用すると
    > 障害を起こすマクロコマンドをいくつか発見しました。
    > 1.Window.Alert() や PopupMenu.Track() などのインターフェースコマンドを使うと Invarid Pointer Operation エラーが起きます。

    ほんとですね、Close系の処理をしたあとに例外が出ちゃう不具合はかなり潰したつもりだったのですが、
    ExecuteCommandByIDで呼び出した時は見落としてました、、、ご報告ありがとうございます。
    (そもそもExecuteCommandByIDメソッドは隠してたんですが、気付かれちゃいましたかw)

    > 2.タブモードが有効な場合に ExecuteCommandByID(MEID_WINDOW_PREVIOUS_DOCUMENT)や 
    > documents.item(index) などのドキュメントの並び順にかかるコマンドを使う とタブバーの表示が乱れ Access Violation エラーが起きます。

    うーん、どうも再現できませんでした。これって、Closeを呼び出した後の処理ってことでしょうか?

    > なお、ExecuteCommandByID(MEID_FILE_CLOSE) でなく Document.Close() で閉じた場合は、
    > それ以降のマクロコマンドは実行されません。マクロの呼び出し元がメモリーから消えるので納得の仕様ですが、
    > ExecuteCommandByID(MEID_FILE_CLOSE) も同じ仕様にすると上のマクロは使えなくなります。

    動作としてはExecuteCommandByID(MEID_FILE_CLOSE)でウィンドウを閉じた場合もマクロの処理をそこで中断する仕様が正しいですね。
    直すとしてもその方向になるかと思います。

     |  Kuro  |  返信
  3. > 直前のウィンドウをアクティブにしたらピヨンと最前面に出てきちゃったりと、なかなか期待通りの動作を
    > 実現できなかったため、どうせなら非アクティブでいいかな~って妥協していたのですが、
    個人的には、直前のウインドウが別アプリであったとしても Mery の別ファイルをアクティブにするという実装で問題ないのですが、好みがあるでしょうからねえ。

    > (そもそもExecuteCommandByIDメソッドは隠してたんですが、気付かれちゃいましたかw)
    ExecuteCommandByIDについてはkinzokuさんとの掲示板のやり取りを参考にさせていただいてます。ありがとうございます。

    > うーん、どうも再現できませんでした。これって、Closeを呼び出した後の処理ってことでしょうか?
    はい、2番についても ExecuteCommandByID(MEID_FILE_CLOSE)実行後の話です。エラーの条件がわかっていますので、基本的には「ExecuteCommandByID(MEID_FILE_CLOSE)の後にマクロコマンドは記述するな」でいいと思います。

    今は、フォーカスの問題をイレギュラーなマクロコマンドで対症療法的しているという状況ですが、これで問題は回避できています。非タブ表示派の情報共有と思ってバグ報告させていただきました。次バージョン(出て欲しいな)、気長に待ってます。

     |  goat  |  返信
  4. お返事遅くなってしまい、申し訳ございません。。。(常に遅くてほんとすみません!)

    > 今は、フォーカスの問題をイレギュラーなマクロコマンドで対症療法的しているという状況ですが、
    > これで問題は回避できています。非タブ表示派の情報共有と思ってバグ報告させていただきました。
    > 次バージョン(出て欲しいな)、気長に待ってます。

    ありがとうございます。
    私も実は非タブ表示派の一味なので、とことんバグ修正していきたい所存です。
    一応、プログラムの修正は完了しました。(たぶん・・・)

    いまさらながら光回線化することになりまして、開通までしばらくの間、インターネットに接続するすべがなくなってしまいますので少々時間がかかりそうです。。。

     |  Kuro  |  返信