「
マクロ覚え書き(開発者向け)
」を編集中
2016年8月18日 (木) 23:22時点における
106.154.66.153
(
トーク
)
による版
(#iconの=抜けを修正)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
= 概要 = マクロ開発者向けの覚え書きです.<br> リファレンスなどに載っていない,豆知識的なことを集めています. = 覚え書き = == 開発言語について == WSH(Windows Script Host) が対応している言語であれば利用が可能です.<br> 標準では JScript(≒javascript)と VBScript が入っています.<br> 他の言語(Perl や Python)もインストールすれば使えますが,一般配布する場合利用者もインストールが必要になります.<br> どの言語でも良いですが,JScript での開発者が多いため,JScript の方が情報が集まりやすくお勧めです. == マクロを保存する際の文字コード == 基本的に単体で利用する場合はどの文字コードでも構いません.<br> ただし「他のマクロから読まれる」場合は文字コードの選択が重要になります.<br> 今のマクロでは #title のようなプリプロセス処理が必要で,それに対応したロードができる include ライブラリの IO.Include はデフォルトで UTF-8 対応なので,UTF-8 をお勧めします(個別の指定は可能).<br> ただし読み込む側が FileSystemObject を利用している場合,SJIS/Unicode しか対応できないのでその場合は SJIS をお勧めします(Mery 1 時代のマクロなどはコレです). == window.Document と Editor.ActiveDocument の違い == window.Document は,マクロ開始時にアクティブなドキュメントを指し続けます.マクロで別のドキュメントを Activate しても変わりません.<br> Editor.ActiveDocument は,その時点でアクティブなドキュメントを指します.マクロで別のドキュメントを Activate すると当然変わります. <source lang="javascript"> Editor.Documents.Item(0).Activate(); Alert(Document.Name); Alert(Editor.ActiveDocument.Name); </source> また,window.Document は Documents.Item() と一致しませんが,Editor.ActiveDocument は一致します. <source lang="javascript"> for (var i=0; i<Editor.Documents.Count; i++) { if (Editor.ActiveDocument == Editor.Documents.Item(i)) { Alert("Editor.ActiveDocument が一致"); } if (Document == Editor.Documents.Item(i)) { Alert("window.Document が一致"); } } </source> == window.Redraw = true は必要か == マクロで <source lang="javascript"> Redraw = false; </source> にしたとき,最後 <source lang="javascript"> Redraw = true; </source> が必要かという点については,現状確認する限りでは不要です. == 矩形選択の扱い == マクロで矩形選択は扱えません(プラグインですら無理).<br> ただし,矩形選択中かの判定だけは以下の方法で可能です. <source lang="javascript"> var s = Document.Selection; var isBoxed = (s.GetBottomPointY(mePosView) - s.GetTopPointY(mePosView)) != (s.Text.match(/\n/g) || []).length; </source> == Document.GetLines の引数 == リファレンスには '''meGetLineView''' しか書かれていませんが,論理行単位での行数取得には引数に 0 を渡します.<br> '''meGetLineLogical''' という定数はありません. == プリプロセス(#title など) == 対応しているプリプロセスコードは以下の通りです. * #icon = "****" [, アイコン番号] * #title = "****" * #tooltip = "****" * #include "****.js" これらは必ずファイル先頭に書かなければなりません(コメントや VBS の Option Explicit などよりも先). == 他のファイルのロード方法 == マクロから他のファイルを直接ロードするには以下の方法があります. * FileSystemObject を利用する * ADODB.Stream を利用する * include ライブラリの IO クラスを利用する === FileSystemObject を利用する === コードが短く簡単に扱えます.<br> また FileSystemObject 自体に,ファイルの有無やフォルダ作成の機能があります.<br> ただし扱える文字コードは SJIS または Unicode 限定. <source lang="javascript"> // Scripting.FileSystemObject の定数 var ForReading = 1; // ファイルを読み取り専用として開きます。このファイルには書き込むことができません。 var ForWriting = 2; // ファイルを書き込み専用として開きます。 var ForAppending = 8; // ファイルを開き、ファイルの最後に追加して書き込みます。 var TristateUseDefault = -2; // システム デフォルトを使ってファイルを開きます。 var TriStateTrue = -1; // ファイルを Unicode ファイルとして開きます。 var TristateFalse = 0; // ファイルを ASCII ファイルとして開きます。 var fso = new ActiveXObject("Scripting.FileSystemObject"); // ファイルの読み込み var fsIn = fso.OpenTextFile(Document.FullName, ForReading, false, TristateUseDefault); var text = fsIn.ReadAll(); fsIn.Close(); Alert(text); // ファイルの書き込み var fsOut = fso.OpenTextFile("hoge.txt", ForWriting, true, TristateUseDefault); fsOut.Write(text); fsOut.Close(); </source> === ADODB.Stream を利用する === 書き方は若干複雑ですが,システムが対応している文字コードであれば全て扱えます.<br> また(信頼性は低いが)文字コードの自動判定も可能です. <source lang="javascript"> var adTypeBinary = 1; // バイナリ データを表します。 var adTypeText = 2; // 既定値です。Charset で指定された文字セットにあるテキスト データを表します。 var adReadAll = -1; // 既定値です。現在の位置から EOS マーカー方向に、すべてのバイトをストリームから読み取ります。これは、バイナリ ストリームに唯一有効な StreamReadEnum 値です。 var adReadLine = -2; // ストリームから次の行を読み取ります (LineSeparator プロパティで指定)。 var adSaveCreateNotExist = 1; // 既定値です。FileName パラメータで指定したファイルがない場合は新しいファイルが作成されます。 var adSaveCreateOverWrite = 2; // FileName パラメータで指定したファイルがある場合は、現在開かれている Stream オブジェクトのデータでファイルが上書きされます。 // ファイルの読み込み var adodb = new ActiveXObject('ADODB.Stream'); adodb.Type = adTypeText; adodb.Charset = 'utf-8'; adodb.Open(); adodb.LoadFromFile(Document.FullName); var text = adodb.ReadText(adReadAll); adodb.Close(); Alert(text); // ファイルの書き込み var adodb = new ActiveXObject('ADODB.Stream'); adodb.Type = adTypeText; adodb.Charset = 'utf-8'; adodb.Open(); adodb.WriteText(text); adodb.SaveToFile("hoge.txt", adSaveCreateOverWrite); adodb.Close(); </source> === include ライブラリの IO クラスを利用する === ファイルの読み書きを簡単にするクラスです.<br> 簡単に扱えることと,BOM なしの UTF-8 を書き込めることがメリットです.<br> 逆にソースを読むしか資料がないこと,ユーザに導入してもらう必要があるのが欠点です. <source lang="javascript"> #include "include/IO.js" // ファイルの読み込み var text = IO.LoadFromFile(Document.FullName, "utf-8"); Alert(text); // ファイルの書き込み IO.SaveToFile("hoge.txt", text, "utf-8"); </source> == 他のマクロの実行方法 == 他のマクロを実行するには,以下の方法があります. * #include で取り込む * ファイルをロードして eval する 前者は先頭でしかかけない上,動的にロードの切り替えができません.<br> 後者は文字コードの問題とプリプロセス処理に関する問題があります.<br> include ライブラリの IO.Include を使うことで,プリプロセス処理に関しては解決できます. <source lang="javascript"> #include "include/IO.js" eval(IO.Include("test.js", "utf-8")); // #include なども処理される </source> == マクロからファイル選択ダイアログ == できません. == Prompt で空入力とキャンセルの区別 == できません. == PopupMenu.Add の ID == PopupMenu.Add() の ID は必ず 0 以外にしましょう.<br> PopupMenu.Track() はキャンセルされた(メニューが押されなかった)場合,0 を返します.
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク