マクロで文書を閉じた時なども、イベント発生させるには? (排他制御で困った)

  1. はじめまして。
    今年になってから、プロ生ちゃん から Mery の存在を知りました。

    表示 (& 設定など♪) のキレイさがとても気に入り、サクラエディタから乗り換えようかと、現状、使い倒している所です♪
    で、自分好みに、他の方々が作成されたマクロ や 自作マクロ を設定していたのですが、、

    マクロのイベントで実行「文書を閉じた時」にて、マクロで文書を閉じた (Document.Close) 場合、このイベントが発生しないようなのですが、
    発生させる方法は無いのでしょうか?
    ( 他のイベントも、マクロからだと発生しない!? 未検証。。 )

    知りたい理由は、
    個人的に 排他制御 が欲しかったので、マクロで自作した (一応できた♪) のですが、
    文書を閉じた時 のタイミングで呼び出したいのに、マクロから閉じるとイベント発生せず、上手くいかないからです。。
    ( まぁ、マクロの 閉じる処理 の箇所に、新たに処理を追記すれば良いのでしょうが、全マクロに手を加えないといけないので.. )

    よろしくお願いいたします。

     |  PebblePot  |  返信
  2. はじめまして、Mery を開発している者です。
    このたびは Mery をお試しいただきありがとうございます。

    > 表示 (& 設定など♪) のキレイさがとても気に入り、サクラエディタから乗り換えようかと、現状、使い倒している所です♪
    ありがとうございます。サクラエディタさんは非常に完成度の高いテキストエディタですから、乗り換えずそのままメインとしてお手元に、そしてかたわらに Mery を置いていただけると幸いです ^^

    > マクロのイベントで実行「文書を閉じた時」にて、マクロで文書を閉じた (Document.Close) 場合、このイベントが発生しないようなのですが、
    > 発生させる方法は無いのでしょうか?
    > ( 他のイベントも、マクロからだと発生しない!? 未検証。。 )
    お察しの通り、マクロのエンジンが 1 つしか搭載されていませんので、マクロの実行中にイベントから別のマクロを発動させることはできません。

    > 文書を閉じた時 のタイミングで呼び出したいのに、マクロから閉じるとイベント発生せず、上手くいかないからです。。
    確かに、そういった使い方となると、マクロイベントでは対応できそうにありませんね。

    マクロではなくプラグインですと、文書を閉じたときのイベントを必ず受け取れるので対応は可能ですが、C++ や Delphi で書かないといけないのでちょっと面倒です。(ファイルの排他制御なら C++ などで記述したほうが作りやすいかもしれませんが)

    > ( まぁ、マクロの 閉じる処理 の箇所に、新たに処理を追記すれば良いのでしょうが、全マクロに手を加えないといけないので.. )
    そうですね、大変そうですが現状ですとその方法ぐらいしか思いつかないです…

    私はマクロ作りは苦手なのでお役に立てないことが多いですが、このフォーラムに来てくれるかたの中にはすごいマクロに詳しいかたもいらっしゃるので、妙案が出てくることもよくあります。

    私ももうちょっと考えてみますね。

     |  Kuro  |  返信
  3. ご回答、ありがとうございます。

    > 乗り換えずそのままメインとしてお手元に、そしてかたわらに Mery を置いていただけると幸いです ^^
    サクラエディタさんは完成度は高いのですが、設定やらUIやらが肥大(乱雑)化して.. ^^;

    > マクロではなくプラグインですと、文書を閉じたときのイベントを必ず受け取れるので対応は可能ですが、
    C++ や Delphi ですか..
    無理!^^; (環境が無い.. 無料である?なら試してみようかな♪!?)

    > マクロのエンジンが 1 つしか搭載されていませんので、マクロの実行中にイベントから別のマクロを発動させることはできません。
    むむ、ということは、一旦マクロが終了 すれば呼ばれる??

    例えば、マクロから、非同期で数秒後に 閉じるマクロ を (本マクロ終了後に) 実行させられれば、、
    って、それもマクロじゃないか! (ダメ)

    マクロじゃなければ良いのなら、外部から文書を閉じる指示を、、
    って、コマンドラインオプションに文書を閉じるオプション無いじゃん! (ダメ)

    Mery から文書を閉じた場合は、イベントが発生するのであれば、
    Mery に文書を閉じるキー操作をどうにかして送れば、、
    って、文書を閉じる にキーボードを設定できないじゃん! (ダメ)

    \(^o^)/

    あ、ちなみに、自作の排他制御そのものは、厳密には Mery マクロではなく、
    WSH (VBScript) で用意したものを、Mery マクロから呼ぶ方法です。
    - Mery マクロ 「このファイルをロックして!」
    - 自作 VBScript (WSH) 「がってんだ!」
    - Mery マクロ 「このファイル、ロック解除して!」
    - 自作 VBScript (WSH) 「喜んで!」

    ..もうちょっと考えてみます。。

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

    > C++ や Delphi ですか..
    > 無理!^^; (環境が無い.. 無料である?なら試してみようかな♪!?)
    はい、どちらも無料で使用できますよー。

    > Mery から文書を閉じた場合は、イベントが発生するのであれば、
    > Mery に文書を閉じるキー操作をどうにかして送れば、、
    > って、文書を閉じる にキーボードを設定できないじゃん! (ダメ)
    これは、デフォルトでは Ctrl + F4 または Ctrl + W にキー割り当てされていますが、キー割り当てを変更することもできます。機能としては [ファイル] の中の [閉じる] が該当します。

    でも、Mery に非同期でキーを送信して閉じることができたとしても、一番最初に懸念されていた「全マクロに手を加えないといけない」という問題の解消にはならない気が… ^^;

    > WSH (VBScript) で用意したものを、Mery マクロから呼ぶ方法です。
    なるほど、VBS から別のスクリプトを呼び出しているということは比較的自由度は高そうですね。

    素人考えで恐縮ですが、マクロイベントの [文書を閉じた時] ではなく [アクティブな文書が変更された時] であれば文書を閉じたときにもイベントが発生しますので、これを利用することはできないでしょうか。

    タブを切り替えたときに毎回イベントが発生してしまう点と、タブを閉じたときにイベントは発生するけどどのタブが閉じられたかは判別できないという点が問題ですが…。

    常に外部スクリプトのほうで「現在開いているファイルの一覧」みたいなデータを持っておいて、 [アクティブな文書が変更された時] イベントの発生ごとに差分を取って、閉じられてるファイルだったら、排他制御解除!みたいなことを考えてみました。

    でも、「現在開いているファイルの一覧」をどこに持たせるか?が問題で、Mery のマクロにはグローバル変数みたいなのがないので、アウトプットバーに一覧を書き出しておく (他のマクロから消される恐れもあります) とか、ファイルとしてどこかに書き出しておく (イベントごとにファイルにアクセスが発生するので精神衛生上良くない) とか、別の問題も出てきまして、\(^o^)/ってなりました。

    うーん…、なにか斜め上の解決策が降ってこないものでしょうか。

     |  Kuro  |  返信
  5. ご返信、ありがとうございます。

    > > C++ や Delphi ですか..
    > はい、どちらも無料で使用できますよー。
    前の返信の後、
    Visual Studio はまだ無料ということ気が付き、ダウンロードを開始しました♪
    ( これが C++ なのかな? .NET ? 別物?? )

    が、ダウンロードが一向に終わらない。 ..デカい。 ファイルサイズ、すんげーデカい。。
    と、ダウンロードの途中で気が付き、そのせいで (回線が貧弱ゆえ) ウェブページの表示に 失敗 or 十数秒ほど待たされる という事態になってしまい、「今日はまともにインターネットできないな..」状態に陥っております。。
    ( 今日中どころか、明日の朝になっても終わってないんじゃね.. な状況です。。 )

    Delphi も無料があるんですね♪
    こっち (Delphi) の方が気になります!
    Mery はポータブル版として持ち歩きたいのに、.NET とかだと、環境によっては動作しなかった気がするので。。

    Visual Studio のダウンロードが完了したら、
    Delphi の無料版を探してみます♪ (わくわく)

    > > って、文書を閉じる にキーボードを設定できないじゃん! (ダメ)
    > これは、デフォルトでは Ctrl + F4 または Ctrl + W にキー割り当てされていますが、
    あ、本当ですね。。
    申し訳ございません。 Alt + F4 と勘違いしていて、Mery が終了する! 使えない! と早合点しておりました。。
    が、それでもご指摘のとおり、「全マクロに手を加えないと..」問題が解決しませんね。。 (残念)

    > [アクティブな文書が変更された時] であれば文書を閉じたときにもイベントが発生します
    おぉ!
    > タブを閉じたときにイベントは発生するけどどのタブが閉じられたかは判別できないという点が問題ですが…。
    ってダメじゃん XD

    > [アクティブな文書が変更された時] イベントの発生ごとに差分を取って、閉じられてるファイルだったら、排他制御解除!みたいなことを考えてみました。
    そうなんです。 その方法しか残っていないような気がします。。
    でもね。“ 面 倒 く さ そ う ”なのです。。 (ぉぃ!!

    なので、マクロだけで行うのは、一旦 保留にして、
    プラグインの方を検討してみようと思います。
    ( と言っても、まずは 開発環境の 構築&使い方を覚える → 言語の勉強 と、ハードルが沢山ありますが。。 )

    なんか、面倒なことを回避するために、
    超~面倒なことをやろうとしている気がする。。 (本末転倒?)

    > アウトプットバーに一覧を書き出しておく (他のマクロから消される恐れもあります) とか、
    これは盲点でした。
    そんなこと出来るのなら、さらにマクロで色々と遊べそうです♪ (遊ぶんかい!)

    ..月曜日は来るけど、ダウンロードは終わらない。。

     |  PebblePot  |  返信
  6. 皆様、お世話になっております。

    ファイルロック (排他制御) について、

    「プラグインで作ってみよう♪」的なノリで、開発環境を検討した結果、
    個人的に、Delphi に決めました。 … RAD Studio (Community Edition) 10.3
    - C++ より言語が書きやすそう
    - .NET みたいに、環境によっては動作しない も無さそう

    が、
    とりあえず、プラグインソフトウェア開発キット を GitHub よりダウンロードし、
    ( ビルドの際、エラーが出たので、その行をコメントアウト。。 )
    Mery で Hello World! と表示されることを確認♪ ののち..
    力尽きました。。
    ( どちらかというと、環境構築の段階でヘロヘロになってしまったのですが。。 )
    ( RAD Studio - Community Edition - 10.3 って、
    C++Builder と Delphi を共存できないんですね。。 )

    で、
    間に合わせに(?)、ファイルロック的なマクロ を投稿しました。
    無理やり的なファイルロックなので、
    かなり微妙なものですが、ご興味のある方はお試しください。

    ..Delphi の仕様とか勉強しないと。。

     |  PebblePot  |  返信
  7. マクロの投稿、ありがとうございます。

    おおー、環境構築、お疲れ様です!

    > 「プラグインで作ってみよう♪」的なノリで、開発環境を検討した結果、
    > 個人的に、Delphi に決めました。 … RAD Studio (Community Edition) 10.3
    > - C++ より言語が書きやすそう
    > - .NET みたいに、環境によっては動作しない も無さそう

    上記の 2 点は Delphi の良いところですね。あと、GUI が作りやすいのと、1 つのソースで Windows、Mac、Android、iOS アプリまで作れちゃうというところも Delphi の素敵なところです。

    でも、悪い点もあります。
    ・出来上がったプログラムの実行ファイルのサイズがデカイ
    ・言語がマイナー。そのせいもあってネットなどでも技術的な情報が少ない

    > ( ビルドの際、エラーが出たので、その行をコメントアウト。。 )

    ご報告ありがとうございます。
    プラグインは Delphi 10.2 までしか検証してなくて、実はまだ RAD Studio 10.3 はインストールしたことすらないんです。テスト用に環境を作ったらプラグイン SDK のエラーを調査してみたいと思います。

    > ( RAD Studio - Community Edition - 10.3 って、
    > C++Builder と Delphi を共存できないんですね。。 )

    ええー!と思って調べてみたらそのようですね。ちょっと悲しい制限事項…。

    > ..Delphi の仕様とか勉強しないと。。

    Delphi に詳しくなっても活用の場が少ないという難点もありますが、趣味でいじるプログラミングツールとしては開発効率と面白さは魅力的です。

    今のところ Mery のプラグイン SDK は VCL 版だけですが、FireMonkey で作れたらカッコイイ画面とか面白い機能とかも実現できそうなので RAD Studio 10.3 に私も挑戦してみたいと思います。

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