マクロ用の変数の要望

  1. あけましておめでとうございます
    ちょっと大きめの要望をさせてください。

    マクロを作成していると、時々状態を保存しておきたい機会が出てきます。
    マクロの仕様上、実行ごとに終了するので、マクロ上の変数には状態を保存しておくことができません。
    独自にファイルに保存したり、Mery.iniに書き加えたりする手法もありますが、タブごとに変数保存したい場合などには何らかの工夫が必要ですし、破棄の問題も出てきます。
    Document、Editorインターフェイス(もしかしたらWindowも?)に、ユーザーが保存できる変数があると、マクロのできることがもっと広がるのではないかと思います。

    オブジェクトを保存するのは、なかなか難しいと思いますので、文字列型でも充分と思いますが、複数のマクロから使用されるとなると、文字列変数のディクショナリ型にしてバッティングを回避するのがいいかと思います。

    Editor.ActiveDocument.Tag["MyMacroData"] = "tempdata";
    のように変数保存して、次回実行時に取り出せると便利かな..と
    (Tagプロパティは.Netのコントロールにあるユーザー変数の名前です)
    もちろん、タブが閉じられたときには破棄される前提で構いません。

    私としては、ksさんの「Eclipse風コメントアウト」を改造して使用しているのですが、独自のコメントアウト文字を指定して使いたいのですが、それを記憶させる用途に使用したいと思っています。

    ご検討をお願いします。

     |  pizz  |  返信
  2. 明けましておめでとうございます。

    ご意見ありがとうございます。ユーザが自由に使える変数置き場ですか。Delphi でも Tag プロパティは存在しますし、あれば便利でしょうね。

    Editor や Document ごととなると、仕様上、マクロを実行するたびにこれらは生成・破棄されますので、厳密にそういう実装はできませんが、それっぽく見えるように、であれば出来なくはないかと思います。

    > 文字列変数のディクショナリ型にしてバッティングを回避するのがいいかと思います。

    数値型か文字列型の Tag プロパティを設けるぐらいなら何とかなりそうですが、ディクショナリ型で JavaScript とやり取りするのは情報がまったく見つからず…。私の技術では厳しいかもしれません ^^;

    ご意見は今後の開発の参考にさせていただきたいと思います。

     |  Kuro  |  返信
  3. 追伸:ディクショナリ型より、オブジェクトを保存するほうが簡単でした ^^;

    document.tag = {};
    document.tag["foo"] = "bar";

    みたいな書き方で良ければ実装できる気がします。

     |  Kuro  |  返信
  4. ご検討ありがとうございます。

    > 追伸:ディクショナリ型より、オブジェクトを保存するほうが簡単でした ^^;
    > document.tag = {};
    > document.tag["foo"] = "bar";
    > みたいな書き方で良ければ実装できる気がします。

    初期化を誰がするのか、というところですかねー
    マクロにやらせると、他のマクロのデータを消してしまうので、Mery側で初期化できると嬉しいのですが...
    まぁ、すぐに無ければ困るというものではないので、ゆっくりご検討いただければと思います。

     |  pizz  |  返信
  5. ご返信ありがとうございます。
    そうですね。型なしの tag 変数で初期値は NULL。文字列としてでも数値型としてでも連想配列としてでも自由に使っていただける感じです。(JavaScript の変数と同じ)

    > マクロにやらせると、他のマクロのデータを消してしまうので、Mery側で初期化できると嬉しいのですが...

    それはありますね。マクロ側で if 文で変数が使用中かどうかをチェックしていただく必要が出てきますが、それはディクショナリ型の場合でも同様かと。

    > まぁ、すぐに無ければ困るというものではないので、ゆっくりご検討いただければと思います。

    了解いたしました、現状のところは保留とさせていただきますね。

     |  Kuro  |  返信
  6. すみません、完全に蛇足ですので、そのつもりで読んで下さい。
    仕様については、Kuroさんにおまかせするつもりですが、参考になればと思い。

    わたしとしては、Tagプロパティはreadonlyの(setできない)プロパティにするといいかなと思っていました。(そういう意味ではTagListプロパティのほうが合ってますね)
    目の前にタイプフリーな変数があると、普通の人は自分のことだけ考えてsetしてしまうので、ディクショナリの使用を強制したいのです。
    たとえ、ディクショナリの使用を推奨していても、誰かが上書きしてしまうと、影響を受けた方では解決できない問題になってしまうもので。

    ただし、そうするためにはMery側で初期化するしかないのですが...
    ちなみに、ディクショナリオブジェクトは、COMオブジェクト("Scripting.Dictionary")なので、C系だとCLSIDFromProgID()と、CoCreateInstance()でインスタンス化できると思うのですが、Delphiはわかりません(;_;)

    以上すみません、蛇足でした。

     |  pizz  |  返信
  7. ご返信ありがとうございます。

    > たとえ、ディクショナリの使用を推奨していても、誰かが上書きしてしまうと、影響を受けた方では解決できない問題になってしまうもので。

    なるほど、おっしゃる通りです。tag プロパティが用意されていれば普通は自由に使っちゃいそうなものですね ^^;

    マクロ (のファイル名) ごとにグローバルにする、とか……でも複数のマクロで共通で使いたい場合がダメですか。

    > ちなみに、ディクショナリオブジェクトは、COMオブジェクト("Scripting.Dictionary")なので、C系だとCLSIDFromProgID()と、CoCreateInstance()でインスタンス化できると思うのですが、Delphiはわかりません(;_;)

    アドバイスありがとうございます。
    ヒントをもとに調べてみましたが全然見つかりませんでした… (ノД`)・゜・。
    Delphi は情報が少ないのが欠点ですね。

    サク〇エディタさんのグローバル変数みたいに、SetCookie("スコープ", "名前", "変数") みたいにメソッドとして呼び出す方式であればできるかも……

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