「.NETプラグイン開発 イベント編」の版間の差分

MSY-07 (トーク | 投稿記録)
句読点と機種依存記号の修正
MSY-07 (トーク | 投稿記録)
改行の修正
 
3行目: 3行目:


== テキスト変更イベント ==
== テキスト変更イベント ==
プラグインの基本は、発生するイベントに応じて処理していくことです。<br>
プラグインの基本は、発生するイベントに応じて処理していくことです。まずは使うことの多いであろう、テキスト変更イベントを処理してみます。
まずは使うことの多いであろう、テキスト変更イベントを処理してみます。<br>
 
<br>
ソースの中で「#region OnEvents のディスパッチ」が閉じられていると思いますので、これを開きます。基本的に対応しているイベントは全て書かれていますので、コメントを外すことで各イベント発生時に呼ばれるようになります。なおコメントアウトしておけば無駄に呼ばれることがないため、遅くしないためにも無駄にコメントアウトは外さないようにしましょう。
ソースの中で「#region OnEvents のディスパッチ」が閉じられていると思いますので、これを開きます。<br>
 
基本的に対応しているイベントは全て書かれていますので、コメントを外すことで各イベント発生時に呼ばれるようになります。<br>
イベントの OnChanged のコメントアウトを外しましょう。これがテキストが変更されたときに呼ばれるイベントです。ここに、時折要望として挙がる「テキスト全体の文字数をステータスバーに表示する」処理を書いてみましょう。
なおコメントアウトしておけば無駄に呼ばれることがないため、遅くしないためにも無駄にコメントアウトは外さないようにしましょう。<br>
<br>
イベントの OnChanged のコメントアウトを外しましょう。<br>
これがテキストが変更されたときに呼ばれるイベントです。<br>
ここに、時折要望として挙がる「テキスト全体の文字数をステータスバーに表示する」処理を書いてみましょう。<br>


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
30行目: 25行目:
}
}
</syntaxhighlight>
</syntaxhighlight>
<br>
 
どうですか、簡単でしょう!<br>
どうですか、簡単でしょう! 続いて、文字数ではなく Shift-JIS の byte 数にしてみましょう。
続いて、文字数ではなく Shift-JIS の byte 数にしてみましょう。


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
58行目: 52行目:
}
}
</syntaxhighlight>
</syntaxhighlight>
<br>
 
GetLength() は Unicode 文字数を返すので、Shift-JIS のバイト数を取得するためにはまずテキスト全体を取得します((2))。<br>
GetLength() は Unicode 文字数を返すので、Shift-JIS のバイト数を取得するためにはまずテキスト全体を取得します((2))。次に(3)でテキストを Shift-JIS でのバイト数に換算します。正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。CR+LF だと改行分だけバイト数がずれてしまいますので、(4)の改行コード判定およびその分の調整をしています。ちょっと面倒ですが、ここまで来ればマクロより楽なはずです。
次に(3)でテキストを Shift-JIS でのバイト数に換算します。<br>
正確には Shift-JIS では表現できない文字などの対応が必要になりますが、ここでは省略しています。<br>
これで取得できた、としたいのですが、プラグインから取得する文字列の改行コードは全て LF という仕様があります。<br>
CR+LF だと改行分だけバイト数がずれてしまいますので、(4)の改行コード判定およびその分の調整をしています。<br>
ちょっと面倒ですが、ここまで来ればマクロより楽なはずです。<br>


=== 遅延処理 ===
=== 遅延処理 ===
先ほどのコードで GetText() を使っていますが、覚えているでしょうか……この処理が重いということを。<br>
先ほどのコードで GetText() を使っていますが、覚えているでしょうか……この処理が重いということを。単純に OnChanged の中で使用してしまうと、文字列が変更される度にこの処理が呼ばれます。実際に実行し、a を押しっぱなしにすると、入力される度にステータスバーが更新されます。文字数が少ないうちは良いですが、多くなったときはとてもではないですが実用的な速度で動くことはないでしょう。
単純に OnChanged の中で使用してしまうと、文字列が変更される度にこの処理が呼ばれます。<br>
 
実際に実行し、a を押しっぱなしにすると、入力される度にステータスバーが更新されます。<br>
これを解決するのに、「入力後一定時間変更がなければ更新する」という遅延処理をします。.NET プラグインには独自のタイマー処理が実装されていますので、対応は極めて簡単です。
文字数が少ないうちは良いですが、多くなったときはとてもではないですが実用的な速度で動くことはないでしょう。<br>
<br>
これを解決するのに、「入力後一定時間変更がなければ更新する」という遅延処理をします。<br>
.NET プラグインには独自のタイマー処理が実装されていますので、対応は極めて簡単です。


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
97行目: 82行目:
}
}
</syntaxhighlight>
</syntaxhighlight>
<br>
 
基本的には、SetTimer() で遅延させているだけです。<br>
基本的には、SetTimer() で遅延させているだけです。これだけで、最後の編集から 1 秒後に反映されるようになり、頻繁な更新を抑制できます。ここでは簡単にするためラムダ式で記述していますが、別のメソッドに仕立てて登録しても良いですし、OnTimer() イベントも用意しているのでそちらで処理しても良いです。
これだけで、最後の編集から 1 秒後に反映されるようになり、頻繁な更新を抑制できます。<br>
 
ここでは簡単にするためラムダ式で記述していますが、別のメソッドに仕立てて登録しても良いですし、OnTimer() イベントも用意しているのでそちらで処理しても良いです。<br>
<br>
このように、いくつかのイベントは呼ばれる度に実行するより遅延させた方が良い場合があります。
このように、いくつかのイベントは呼ばれる度に実行するより遅延させた方が良い場合があります。


== キー操作イベント ==
== キー操作イベント ==
矩形選択は先に Alt を押した状態で選択を開始する必要があります。<br>
矩形選択は先に Alt を押した状態で選択を開始する必要があります。が、プラグインを使うとこの順番を逆にしても使えるようになります。
が、プラグインを使うとこの順番を逆にしても使えるようになります。<br>
 
<br>
今度は「#region PreTranslateMessage のディスパッチ」を開きます。その中の OnSysKeyDown() のコメントアウトを外して、以下のコードを入力します。
今度は「#region PreTranslateMessage のディスパッチ」を開きます。<br>
その中の OnSysKeyDown() のコメントアウトを外して、以下のコードを入力します。


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
143行目: 124行目:
}
}
</syntaxhighlight>
</syntaxhighlight>
<br>
 
OnSysKeyDown() は Alt や Ctrl などの特別なキーを処理するためのイベントです。<br>
OnSysKeyDown() は Alt や Ctrl などの特別なキーを処理するためのイベントです。通常の a などのキーは OnKeyDown() になるので、使い分けに注意してください。コードとしては、矩形選択にし直す、という便利なメソッドは用意されていないので、(3)選択範囲の取得→(4)矩形選択し直し、という流れになります。(5)で true を返さないと、本体のキー処理が走るためメニューが表示されてしまいます。無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。
通常の a などのキーは OnKeyDown() になるので、使い分けに注意してください。<br>
コードとしては、矩形選択にし直す、という便利なメソッドは用意されていないので、(3)選択範囲の取得→(4)矩形選択し直し、という流れになります。<br>
(5)で true を返さないと、本体のキー処理が走るためメニューが表示されてしまいます。<br>
無闇にキャンセルしても本体や他のプラグインの邪魔をしてしまうのでよくありませんが、今回ぐらいであれば true で以降の処理をキャンセルした方が良いでしょう。<br>
<br>
スポンサーリンク