【不具合】Editor.Documents.Countの値
-
こんにちは。
いつもお世話になっております。さて、Mery2でEditor.Documentsの動作に不具合らしきものがありました。
タブの有効/無効によって、Editor.Documents.Countの値が異なるというものです。
というか、タブ無効だと常に1……。よろしくご高配のほどお願い申し上げます。
それでは。確認したマクロは以下の通りです。
-----
for (var i=Editor.Documents.Count-1; i>=0; i--) {
Alert("index: " + i + "\nfilename: " + Editor.Documents.Item(i).Name);
-----Mery 2.0.10.3980
Windows7 X64| 手石 | 返信 -
> こんにちは。
> いつもお世話になっております。
>
> さて、Mery2でEditor.Documentsの動作に不具合らしきものがありました。
> タブの有効/無効によって、Editor.Documents.Countの値が異なるというものです。
> というか、タブ無効だと常に1……。
>
> よろしくご高配のほどお願い申し上げます。
> それでは。
>
>
> 確認したマクロは以下の通りです。
> -----
> for (var i=Editor.Documents.Count-1; i>=0; i--) {
> Alert("index: " + i + "\nfilename: " + Editor.Documents.Item(i).Name);
> -----
>
> Mery 2.0.10.3980
> Windows7 X64| papagoat | 返信 -
申し訳ありません。キーボード操作間違えて無駄な投稿をしてしまいました。前の投稿は無視してください。
手石さま
>というか、タブ無効だと常に1……。「残念だったな!それは既に俺様の通った道だ!!」
というのは冗談ですが、SDIモードのときに別ドキュメントにアクセスできない → ゆえに documents.Count が常に 1 というのは Mery Ver.2 の仕様です。
SDI モードで他の document をマクロ操作するには一時的にタブモードに変更する必要があります。操作終了後に SDI モードに復帰させるのですが、SDI ウインドウのサイズ・位置はマクロ実行前とは違ってしまいます。この不満点を解消するための雛形マクロがライブラリに登録した「SDIウィンドウの記憶と復帰」です。
このマクロでは、仕様を逆手にとったバッドノウハウ(editor.NewFile して documents.Count が 1 のままなら SDI )で Mery がタブモードか SDI モードかを判断していました。Mery Ver. 2.0.10 で editor.EnableTab というプロパティが追加されてバッドノウハウの必要はなくなりました。| papagoat | 返信 -
こんにちは。
なるほど、そうでしたか。
そして、「SDIウィンドウの記憶と復帰」へと続くと。
や、ありがとうございます。さて、早速いくつか実験せねば……。
それでは。
| 手石 | 返信 -
こんばんは。
やっぱり Documents が SDI 時にアクセスできないのは不便なのかしら、結構な数のご要望をいただいておりますね。
某テキストエディタのマクロとある程度互換性を持たせようとシバリをかけていたのですけれど、もう独自路線を走ることにしまして、ちょっとあらたなプロパティを設けてみました。Mery 2.0.11.3997, Beta では以下のような感じで editors というコレクションアイテムにアクセスできるようになっています。
es = new Enumerator(editors);
for (; !es.atEnd(); es.moveNext()) {
e = es.item();
ds = new Enumerator(e.documents);
for (; !ds.atEnd(); ds.moveNext()) {
d = ds.item();
alert(d.Name);
}
}| Kuro | 返信 -
こんにちは。
> やっぱり Documents が SDI 時にアクセスできないのは不便なのかしら、
私は、NewDocument()をマクロの出力先に使いたいので非常に助かります。
もちろん、タブを有効にして使えばいいんですけどね。
他にデバッグ的な使い方のときに便利かも知れませんね。> 某テキストエディタのマクロとある程度互換性を持たせようと
タブを有効化させるメソッドがあればどうだろう、と思いました。それでは。
| 手石 | 返信 -
こんばんは。
> もちろん、タブを有効にして使えばいいんですけどね。
> 他にデバッグ的な使い方のときに便利かも知れませんね。そうですね、SDI はもうサポートしなくてもよいかなって思ってたりしましたが、
とりあえず Editors プロパティで対応できるかと思います。> > 某テキストエディタのマクロとある程度互換性を持たせようと
> タブを有効化させるメソッドがあればどうだろう、と思いました。一応あります、editor.EnableTab プロパティを false, true にすればできまっす。
| Kuro | 返信 -
> 一応あります、editor.EnableTab プロパティを false, true にすればできまっす。
えっ?editor.EnableTab プロパティって ReadOnly じゃないんですか?バージョン依存で推奨されない方法と認識しながら
var MEID_WINDOW_ENABLE_TABS = 4236;
ExecuteCommandByIDMEID_WINDOW_ENABLE_TABS)
と書いていました。サプライズが続きますなあ。| papagoat | 返信 -
こんばんは。
> > 一応あります、editor.EnableTab プロパティを false, true にすればできまっす。
> えっ?editor.EnableTab プロパティって ReadOnly じゃないんですか?お~、EnableTabがReadOnlyでないのは盲点でした!
早速、実験していたところ、低頻度で「すべてのダイアログを閉じてください。」というダイアログボックスが表示されました。最小構成はマクロ1の通りで、マクロ実行時に開いていたのは、編集中のマクロだけです。メニューでタブの有効/無効を切り替えてから、タブを有効にして実行すると頻度が上がるようでした。なお、(1)(2)の順序を入れ替えると発生しませんでした。
それから、極々低頻度で「モジュール 'jscript.dll' のアドレス 6DE54B9D でアドレス 00000000 に対する読み取り違反がおきました。.」というダイアログボックスが表示されました。そういえば、「右のタブを全て閉じる」を選ぶとフォーカス(カーソル?)が失われてマクロの実行ができなくなります。エディタ内をクリックしてカーソルを表示させることで回避できます。
個人的には、NewFile()がDocumentオブジェクトを返してくれると便利なのかなと思いました。
SDIではEditorとDocumentが1対1で、ActiveDocument.close()したらEditorはNillになるのではないかと考えたですが、マクロ2はエラーになりませんでした。
-----マクロ1-----
Editor.NewFile(); // ----(1)
Editor.EnableTab = false; // ----(2)
es = new Enumerator(editors);
for (; !es.atEnd(); es.moveNext()) {
}
----------
-----マクロ2-----
edt.ActiveDocument.close();
edt.EnableTab = true;
----------Meryの益々の発展を祈って。
それでは。Mery 2.0.11.3997
Windows7 X64| 手石 | 返信 -
こんにちは。
やはり EnableTab に書き込みできてしまうといろいろと問題が発生しまくりなので、ReadOnly にしようと思います。マクロの実行中に SDI → タブの切り替えをされてしまうとマクロ実行中のウィンドウが消滅してしまって動作不良を起こしてしまいますね。
右のタブをすべて閉じるの後のフォーカスが外れる件、ご報告ありがとうございます。修正しておきます。
NewFile() が Document オブジェクトを返してくれると確かに便利ですね。可能かどうか調べておきます。
ActiveDocument の Close() は Close した時点でマクロの動作を強制終了してしまいますので、エラーが出なかったんじゃないかと思います。
> Meryの益々の発展を祈って。
うぐ、、、最近 Mery 飽きてて全然触ってませんでした(ぉぃ
| Kuro | 返信