|
サンプルみたいな実践力皆無なクロは別として
順次「行」を時間をかけて表示したい、といったことを
本当に「実践力があるもので」とするのは、
それなりに難易度が高いです。
理由としては、
```
マクロの実行時間がながければ長いほど、それを実行している間に、他のマクロの実行が可能なこと
```
暗黙の当然の要件として入ってくるからです。
そうでなければ、該当マクロが実行されている間、
「秀丸エディタは一切さわりません」
みたいな意味不明なことになってしまいます。
これは現段階で秀丸のスクリプトで実現可能ではありますが、
それなりに難易度が高くなります。
// ----------------------------------------------
jsmode "WebView2\\" + currentmacrofilename;
js {
const fontName = fontname();
renderpanecommand({
target: "MyMessagePanel",
place: "top",
size: 100,
show: 1
});
// javascriptでdocumentに div タグの作成
const textDiv = document.createElement('div');
// レンダリングペインへの送信。
function sendRenderPane(ix, lineFormat) {
// HTMLとして扱えるように、タグ内部テキストとして...
textDiv.innerText = lineFormat;
// HTMLタグごとレンダリングう枠へと送信。フォントも編集エリアのものを採用しておこう。
renderpanecommand({
target: "MyMessagePanel",
url: `data: text/html;charset=utf-8,<title>${ix} 行目</title><font face="${fontName}" size="4">${textDiv.outerHTML}</font>`
});
}
// レンダリングペインは見えてるの?
function isRenderPaneShow() {
const isShow = renderpanecommand({
target: "MyMessagePanel",
get: "show"
});
return +isShow == 1;
}
// マクロを再実行した時には、前のをキャンセルする。
var timeoutHandler;
hidemaru.clearTimeout(timeoutHandler); // 再実行した時に前のを停止
function main() {
function processLine(ix) {
// 最後まで行ったら終わり
if (ix > linecount()) {
hidemaru.clearTimeout(timeoutHandler);
outputAlert("全行終了しました。\r\n");
return;
}
// レンダリング枠閉じたら終わり
if (ix > 1 && !isRenderPaneShow()) {
hidemaru.clearTimeout(timeoutHandler);
outputAlert("ウィンドウ枠が閉じられました。");
return;
}
// 該当行のテキストを加工し、レンダリング枠へと転送
let lineText = getlinetext(ix);
let lineFormat = getFormattedLineText(ix, lineText);
sendRenderPane(ix, lineFormat);
// 次の行を2秒後に
timeoutHandler = hidemaru.setTimeout(processLine, 2000, ix+1);
}
timeoutHandler = hidemaru.setTimeout(processLine, 0, 1); // 最後の「1」は1行目からのスタート
}
// 該当の行を「行番|文面」に加工。
function getFormattedLineText(ix, lineText) {
const lineCount = linecount();
const lineDigits = String(lineCount).length;
let lineFormatNumber = ix.toString().padStart(lineDigits, "0");
let lineFormat = `${lineFormatNumber}|${lineText}`;
return lineFormat;
}
// 警告等、アウトプット枠
function outputAlert(msg) {
var dll = loaddll("HmOutputPane.dll");
dll.dllFuncW.OutputW(hidemaru.getCurrentWindowHandle(), msg + "\r\n");
}
main();
}
// ----------------------------------------------
|
|