OpenFile() の動作について

  1. a.txt を開いて以下を実行すると
    var b= "d:\\program\\Mery\\My Macros\\b.txt";
    editor.OpenFile( b );

    a.txt を閉じて、b.txt を開きます。
    var MEID_FILE_CLOSE_AND_OPEN=4098;
    editor.ExecuteCommandByID( MEID_FILE_CLOSE_AND_OPEN );
    のダイアログ無しのような動きです。

    a.txt を開いたまま、b.txt も開くのが正しいような気がします。

     |  kinzoku  |  返信
  2. 一応、現在編集中のテキストが変更されている場合は
    ダイアログでるようになってるつもりなのですが、、、

    > a.txt を開いたまま、b.txt も開くのが正しいような気がします。

    OpenFile()で開いた場合、その対象のテキストに対して処理を行うことを前提にしていますので、
    別ウィンドウになっちゃうとわざわざそのウィンドウをActiveDocumentなどで取得して処理するような
    めんどいことになっちゃいますね。

     |  Kuro  |  返信
  3. >めんどいことになっちゃいますね。
    それが普通だと思っていました。

    OpenFile() を使って閉じられてしまうファイルは、
    editor.ActiveDocument のファイルではなくて、
    window.document のファイルですか?
    いまのところ、widnow.document を管理できなくて、使いにくいです。
    --------
    document と editor.ActiveDocument を比べてみる。

     // a.txt を開いて実行
     alert(document.FullName + "\n" + editor.ActiveDocument.FullName);
     if( document == editor.ActiveDocument ){
         alert( " == " );
     }else{
         alert( " != " );
     }

    同じファイル名 a.txt を示しているけど、" != " になる。
    同じオブジェクトではないけど、実質が同じ?
    Enumerator(editor.documents) から得たオブジェクトに、
    Activate() を使うと、editor.ActiveDocument は切り替わるが、
    window.document は放置される。

    長くなってしまったので、こっちに書きました。
    http://homepage3.nifty.com/kinzoku/editor/suggestion.html
    面倒だなと思ったらスルーしてください。

     |  kinzoku  |  返信
  4. こんばんは、サイト拝見しました。
    ありがとうございます、まさかここまで作って頂けるとは・・・w

    > 1.
    > OpenFile() を使って閉じられてしまうファイルは、
    > editor.ActiveDocument のファイルではなくて、
    > window.document のファイルに固定されていますか?

    固定されています。いきなり横道にそれますが、お察しの通り、そもそも内部では
    Documentsコレクション用に作った全ウィンドウ分のdocumentオブジェクトと、
    window.documentオブジェクトが別管理されてます。

    editor.ActiveDocumentはDocumentsコレクションの中から探し出して返すようになっています。
    この時点でオブジェクトとしては必ず window.document != editor.ActiveDocumentになっちゃいます。

    > 2.
    > Document.Activate() が使われたら、 window.documentも更新してほしい。

    1の回答を踏まえて、本来ならばwindow.documentはマクロを実行中のdocumentであり、
    なおかつそれはDocumentsコレクションの一員である、という仕様にしなきゃいけませんね。。。

    window.documentとeditor.ActiveDocumentを必ず一致させるのではなく、マクロを実行中の
    ウィンドウがアクティブな場合は、一致する。さらに、NewFile()などで新たにウィンドウが開かれた
    場合のeditor.ActiveWindowはその新しいウィンドウになり、window.documentはマクロを実行中の
    ウィンドウのまま、というのが筋が通ってますね。

    んで、OpenFile()を使った場合ですが、マクロ実行中のウィンドウに対してファイルを開き直すので
    OpenFile()の後でも引き続きwindow.documentでアクセスできるはずです。

    > a.txt を閉じずに、b.txt を開く方法

    確かに、現状、できないですね(汗
    某テキストエディタのマクロを見てみるとOpenFile() の引数で新たなウィンドウで開くかどうかを
    指定できるようなので、とても理にかなっている方法だと思いました。

    > 3.
    > または、window.document プロパティが書き込み可能で、
    > window.document = editor.ActiveDocument;
    > ができるようにしてほしい。

    2で回答させて頂いた仕様にすればうまく行きそうな気がするのですが、できるかどうかちょっと
    検証させてください。

     |  Kuro  |  返信
  5. > window.documentとeditor.ActiveDocumentを必ず一致させるのではなく、マクロを実行中の
    > ウィンドウがアクティブな場合は、一致する。さらに、NewFile()などで新たにウィンドウが開かれた
    > 場合のeditor.ActiveWindowはその新しいウィンドウになり、window.documentはマクロを実行中の
    > ウィンドウのまま、というのが筋が通ってますね。

    と思ったけど、window.document は常に editor.ActiveWindow と一致するほうが
    理にかなっているのかも・・・。すみません、脳が沸いてきました。。。

     |  Kuro  |  返信
  6. 連投すみませぬ、、、
    IEでwindow.open使った時に、window.document自体が新しいウィンドウのdocumentに
    更新されることはないので、やっぱ、最初の考え方で正解なのかなぁ・・・。

     |  Kuro  |  返信
  7. >IEでwindow.open使った時に、window.document自体が新しいウィンドウのdocumentに
    >更新されることはないので、やっぱ、最初の考え方で正解なのかなぁ・・・。
    IE がそうならば、それが正解なのかな。
    もともと、IE も SDI で、その後タブ化した経緯は似ているし。

    すみません。ややこしいことになりそうなので、これは、放置してください。
    いまのところ「a.txt を閉じずに、b.txt を開く方法」ができれば、問題ないんです。
    Scripting.FileSystemObject を使う手もあるし。

     |  kinzoku  |  返信
  8. > すみません。ややこしいことになりそうなので、これは、放置してください。

    最初の回答の仕様で修正してみました。
    たぶん、これでイケるはず・・・。

    > いまのところ「a.txt を閉じずに、b.txt を開く方法」ができれば、問題ないんです。
    > Scripting.FileSystemObject を使う手もあるし。

    OpenFile() の引数で対応しました。必ず新しいウィンドウを開くのではなく、無題で未変更のウィンドウから実行した場合は
    そのウィンドウ、変更済もしくは別のファイルがすでに開かれている場合は別ウィンドウ、って感じです。

    ただ、他の部分に手をつけすぎてリリースもうちょいかかりそうですw

     |  Kuro  |  返信
  9. その後、NewFile() で開いた後、Scripting.FileSystemObject で得たデータを流し込んでも、
    ファイル名を b.txt に変えることができなくて、目が点になっていたところでした。

    >OpenFile() の引数で対応しました。必ず新しいウィンドウを開くのではなく、
    ありがとうございます。

    >ただ、他の部分に手をつけすぎてリリースもうちょいかかりそうですw
    気長に待ってます。w

     |  kinzoku  |  返信