update : 2012/05/06 (Sun)
マクロを使用するに場合には、32bit、64bitの違いを気にする必要はありませんが、 外部DLLを使用する場合は、注意が必要です。
通常、64bit秀丸エディタでは、32bit 外部DLLを使用する事はできませんが、 64bit秀丸エディタには、32bit 外部DLL使用するためのオプションが存在します。
このオプションをONにすることで、64bit秀丸エディタ上で、32bit 外部DLLを使うことができますが、 32bit 外部DLLで、hmjre.dllを使用する場合は、問題があります。
64bit 秀丸エディタに付属するのは、64bit hmjre.dllです。 32bit DLLから、64bit DLLのロードはできない為、32bit 外部DLLで、64bit 秀丸エディタ本体と同じ場所にある、 64bit hmjre.dllをロードしようとしても、必ず失敗します。
hmjre.dllを使用可能な外部DLLには、以下のDLL等があります。
64bit秀丸エディタから、上記 32bit DLLを使用し、かつhmjre.dllを使用する場合は、必ず失敗することになります。 (CompleteX、祝鳥では、hmjre.dllを読込に失敗した等のメッセージが表示される。)
解決方法としては、
等があります。
C/C++など、プログラミング言語から、64bit hmjre.dllを使う場合の注意点。
祝鳥に含まれている、「macrodll.dll」のx64版です。作者 あべのりゆき氏 の許可を得て公開しています。
上記URLで、公開されているソースを元に、VCEE2010+Windows SDKでコンパイルしています。
macrodll.dll(x64)Ver.0.86 2011/11/28版(祝鳥0.86)
macrodll.dll(x64)開発版(2012.05.01) 2012/05/06版
「田楽DLL」のx64版です。作者 杉浦まさき氏 の許可を得て公開しています。
上記URLで、公開されているソースを元に、VCEE2010SP1+Windows SDKでコンパイルしています。
田楽DLL(x64)Ver.3.21.4 2012/03/07
BREGEXP関数に関しては、K.Takata氏作成の、bregonig.dll Ver.3.00βのx64版が使用できます。 bregonig.dll自体はUnicode(UTF-16LE)対応ですが、本DLLではANSI対応のみで、Unicodeには対応していません。
x64版をコンパイルする場合には、bregonig.dllのソースに含まれる"BREGEXP.H"が必要です。
Susie Plug-inに関しては、一応、"*.sph"に対応しています。 "*.sph"に関しては、以下のURLを参照して下さい。
UNBYPASS.DLL Version 1.5に含まれる、 "ZBYPASSI.SPH"を使用すると、64bit田楽DLLから、32bit Susie Plug-in を使用することが出来ます。
秀丸エディタ/秀丸メールで使用するマクロ拡張用DLLです。 マクロで(簡単には)実現できない(事もない?)各種機能(?)を提供します。
動作環境
詳細な説明はDLLの解説(Version 1.20.00β2)をみて下さい。
hmonig.dll(命名IKKI氏)は秀丸エディタ/秀丸メールで使用する、hmjre.dll 互換の正規表現検索DLLです。 正規表現エンジンとして鬼車(Ver.5.9.2ベース)を使用しています。 Ver.0.5.9 より、 正規表現エンジンに鬼雲(Ver.5.10.0以降)を使用しています。
鬼車の基本的な正規表現については、鬼車のドキュメント を参照してください。 hmjre.dll の互換性から、"\<"、"\>"は使用可能です。
後方参照(タグ参照)は、\nの形式は、1〜9までが指定可能です。 \k<n>、\k'n'も使用可能で、10以上も指定可能ですが、秀丸エディタの置換では、10以上は使用できません。
現在、hmonig.dllは、
の、2種類がありますが、Shift_JIS版は開発終了とし更新しません。今後はUnicode対応版のみになります。
Unicode(秀丸独自コード)対応版です。 DLLの内部で、Unicode(UTF16-LE)に変換し、処理を行っています。 その為、hmjre.dllと比較し、メモリ消費量は多くなり、遅くなると思います。
"\w"の扱いが変更になっていて、ASCIIコード範囲内のみマッチします。 (全角文字にはマッチしません。) その影響で、単語境界の認識も変更になっています。
Ver.0.5.9.0より、正規表現エンジンを鬼車(Ver.5.9.2ベース)から、鬼雲(Ver.5.12.0ベース)へ変更。
正式版
鬼雲で拡張された正規表現については、鬼雲のドキュメントを参照してください。
GetLast〜の関数は、直前に実行した関数により、戻り値の単位が異なるので注意してください。
ワイド文字を扱う場合は、wcs系の関数を使用してください。
マクロ用関数
FindRegular〜で、-2を返さないといけないのに、0を返していたので修正。 メモリ確保に失敗した場合、戻り値が間違っていた。
Unicode版の関数を追加
char を WCHAR に変更しただけ。 hmjre.dllが対応していないので、Unicodeでの、あいまい検索は出来ません。 ほとんどテストしていない状態です。
通常版API
UTF-8 対応のコードを整理。
ついでに、現状は UTF-8 以外は、全て UTF-16LE へ変換しているが、変換対象を Shift-JIS のみに、
切替可能にした。
Shift-JIS 以外で、異常動作した場合の対処 #define で切り替えるので、コンパイルが必要
正規表現エンジンを更新。
2011/12/01: [bug] /a{2}/i doesn't match 'AA'.
hmonig.dllの場合、通常検索では、ほぼ影響なし。マクロ関数に影響あり。 (通常の検索は、大文字小文字を無視する処理は、秀丸エディタ本体側で行っている為、 関係ないが、正規表現にオプションを埋め込んでいる場合は関係あり)
BRegIf.dll+bregonig.dll(Shift_JIS専用)相当です。
公開されているdllの使い方などの紹介です。
あべのりゆき氏が公開されているDLLです。秀丸エディタのTex用マクロである「祝鳥」に含まれています。 リストボックスの表示や各種ファイル操作が可能です。
DLL単体でも公開もされています。単体で入手する場合は、「macrodll.dll関数一覧」もダウンロードしましょう。
ここのサンプルを動かす場合は、DLLを秀丸エディタ本体と同じ場所に置いてください。
macrodll.dllのVersion.0.81より、COM/OLEを操作する関数が追加されました。 これまでは、DDE通信や起動オプションでしか、他のアプリケーションと連携する方法が ありませんでしたが、(アプリケーションが対応していれば) COM/OLEを使った連携 が可能になります。
例えば、
等が可能です。DDE通信などより細かい制御が、可能になります。
COM/OLEの操作は、"Windows Script Host(WSH)"関連を調べるといいです。 以下のページが参考になります。
個別のアプリケーションを操作する場合は、アプリケーションの解説書や取説を参考にしてください。
COM/OLEの命令を調べるには、「オブジェクトビュアー」等があると便利です。
Word、Excel等を所有している場合、似たような機能を持つ「オブジェクトブラウザ」が使えます。 「Visual Basic Editor」を起動し、「ツール」->「参照」で、使いたいCOMオブジェクトを選択し、 "F2"キーを押すと、「オブジェクトブラウザ」が表示され、プロパティ等を確認できます。
Windows Script HostはWindows98以降に標準で搭載されています。 ヘルプがない場合は、ダウンロードしましょう。また、最新版でなければ、最新版にしましょう。
詳細はヘルプを参照。
InternetExplorerを使った例です。同じ機能を、WSHと秀丸マクロで作成しました。 実際には、エラー処理が必要になります。
注意InternetExplorerの例は、主にIE6を対象にしています。IE7以降だと、正常に動作しない場合があります。
WSHの記述例
'URLを取り込み
url = InputBox("URLを入力してください。","IEのテスト","http://hide.maruo.co.jp/")
Set WshIE = CreateObject("InternetExplorer.Application")
'非表示状態なので、表示状態へ
WshIE.Visible = true
'指定されたURLを表示
WshIE.Navigate(url)
'表示されるまでまつ
busy = WshIE.busy
state = WshIE.ReadyState
do while(busy = true and state <> 4)
'1秒タイマー
Wscript.Sleep(1000)
busy = WshIE.busy
state = WshIE.ReadyState
loop
msgbox "表示完了"
Set WshIE = Nothing
wscript.quit
秀丸マクロ+macrodll.dllの記述例
loaddll hidemarudir + "\\macrodll.dll";
//URLを取り込み
$url = input("URLを入力して下さい。","http://hide.maruo.co.jp/");
#ie = dllfunc("OLE_INITIALIZE","InternetExplorer.Application");
//非表示状態なので、表示状態へ
#ret = dllfunc("OLE_SETPROPERTYINT",#ie, "Visible",1);
//指定されたURLを表示
#ret = dllfunc("OLE_INVOKE",#ie, "Navigate","s", $url );
//表示されるまでまつ
#busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy");
#state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState");
while(#busy != 0 && #state != 4){
//1秒タイマー
#en = tickcount + 1000;
while(tickcount < #en){};
#busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy");
#state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState");
}
message "表示完了";
#ret = dllfunc("OLE_CLEAR");
freedll;
endmacro;
COM/OLE操作のサンプルです。マクロを実行すると、新規ファイルを開き、経過を出力します。
標準入出力へのアクセスを行います。 実行時すると、コマンドプロンプトが表示されます。 秀丸エディタをアクティブにすると、InputBoxが表示されているので、 適当に入力してください。ソートして出力します。ソートはsort.exeを使用しています。
注意環境により、このマクロは正常に実行されない場合があります。 マクロを実行時、入力を終了しても、コマンドプロンプトが表示されたままになる場合は、 タスクマネージャー等で"sort.exe"を強制終了させてください。
2008/09/15追記 正常に動作しない原因は、Windows標準じゃないsort.exeを使用していたためでした。
ファイル操作のサンプル。 実行時すると、InputBoxが表示されので、適当に入力してください。 入力された内容をファイルに出力し、コピー、移動を行います。 マクロ実行後、マクロと同じ場所に"COM_TEST3_TEST.TXT"が作成されるので、 削除してください。
タブブラウザの"Sleipnir"を制御。(動作確認は Ver.2.49) 指定したURLを開きます。既にタブで開いている場合はリロード、 そうでない場合は、新規タブで開きます。
"Sleipnir"を制御するには、"Sleipnirオプション"を変更する必要があります。 クライアント->全般->「スクリプトによるクライアントの操作を許可する」に チェックを入れること。
17行目を書き換えると、Lunascapeでも動きます。 動作確認は、Lunascape Ver.4.06
変更前
00017|#Browser = dllfunc("OLE_INITIALIZE", "Sleipnir.API");
00018|if(#Browser == 0){
00019| $ERR = "Sleipnirオブジェクト作成に失敗";
00020| goto ERRMSG;
00021|}
変更後 "Sleipnir.API" -> "Lunascape2.LunascapeAPI"
00017|#Browser = dllfunc("OLE_INITIALIZE", "Lunascape2.LunascapeAPI")
00018|if(#Browser == 0){
00019| $ERR = "Lunascapeオブジェクト作成に失敗";
00020| goto ERRMSG;
00021|}
2010/03/18 6項を追加。
macrodll.dllにある"文字列回収"機能の説明です。("COLLECTSTR〜"関数の使い方になります。) 文字列回収とは、ほぼGREPと同じ機能です。特徴的なのは、正規表現のグルーピングを使い、 マッチした行全体ではなく、必要な部分を切り出せることです。
使い方
正規表現を使用するので、SETHMJREDLL関数を呼びだす。 SETHMJREDLL関数を呼びさないと、正規表現を使った検索がうまくいかないので注意。
#ret = dllfunc("SETHMJREDLL", hidemarudir + "\\hmjre.dll");
COLLECTSTR_SETOPT関数で、検索オプションを設定。
以上のオプションが設定できるので、必要なら、"true"をセットします。
COLLECTSTR_COLLECT関数で検索実行(出力先がファイルなら結果はファイルへ出力)
切り出す文字列は、正規表現でグルーピングを行い、タグ番号で指定します。
Version.0.81以下
COLLECTSTR_ISMORESTR関数を使い、取り出せる文字の有無をみて、COLLECTSTR_GETSTR関数で 取り出します。
while(dllfunc("COLLECTSTR_ISMORESTR")){
$$s = dllfuncstr("COLLECTSTR_GETSTR");
}
Version.0.82以上
COLLECTSTR_GETDATASIZE関数で、取得した文字列の数を取得し、COLLECTSTR_GETSTR関数で、 何番目の文字を読み出すか指定し取り出します。
##n = dllfunc("COLLECTSTR_GETDATASIZE");
##i = 0;
while(##i < ##n){
$$s = dllfuncstr("COLLECTSTR_GETSTR",##i);
##i = ##i + 1;
}
秀丸パイプは、m.fujimoto氏作成の変換モジュールです。 秀まるおのホームページより、 変換モジュールライブラリ からダウンロード出来ます。
本来、秀丸パイプは変換モジュールなんですが、マクロからも呼び出せるように、関数が用意されています。
使い方は通常のdllを使う方法と同じです。("HmPipe.hmf"をloaddllする。)
filter文、filter関数からも使用可能です。
使い方は、以下のようになります。
dllfuncstrで呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)
■使い方(マクロ編)
1.関数仕様
HmPipeRun(instr, progname, param);
instr 入力文字列
progname プログラム名
param プログラムの引数(省略可)
2.使用例
--------------------------------------------
loaddll "HmPipe.hmf";
$outstr = dllfuncstr("HmPipeRun", $instr, "sort");
freedll;
--------------------------------------------
filter文で呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)
○Ver1.02 ・秀丸マクロのfilter関数から呼ばれたときに引数を取れるようにしました。 引数では、秀丸パイプから起動するプログラム名と、その引数を指定するこ とができます。プログラム名と引数は"|"で区切って指定してください。 filter $HmPipe, "HmPipe", "foo.exe|arg1 arg2"; ・ワイドキャラクターを扱えるようになりました。 ワイドキャラクターのプログラムを作成する場合、標準入力、標準出力はす べてUTF-16LE(BOMなしリトルエンディアンUTF16)として扱ってください。標 準出力については、実行プログラムがASCIIやShift_JISでエラーを返すと思 うので、Unicodeかどうかの判定をしています(厳密には判定できませんが)。 秀丸マクロからfilterを使って呼び出すときは、関数名を"HmPipeW"とします。 filter $HmPipe, "HmPipeW", "xxx.exe|arg1 arg2 arg3";
この、"秀丸パイプ"を使うことで何が出来るかというと、秀丸のマクロでは出来ないことを、 他のプログラムを使用して行う事が可能になります。
他のプログラムと連携するには、run文等を使えば出来ますが、 標準出力をマクロで直接受け取れることが最大の利点です。
ただし、1つの文字列型変数は、8000文字(バイト?)程度が限界なので、注意が必要です。 出力が多い場合は、"run 〜 >con" を使い、秀丸エディタ上に出力させ、取り込むしかありません。 (tipsページのファイル一覧の取得を 参照してください。)
Ver.8 秀丸エディタ Ver.8より、文字列型変数のサイズが拡大されています。(管理領域まで含め1Mバイト)
例として、OSに標準搭載されている、WSH(cscript.exe)を使用した時間の計算です。 現在時刻から2時間後の時間を返します。
Option Explicit Dim n '標準入力を取り込み、スペースで分割 n = split(trim(WScript.StdIn.ReadLine & " 0 0 0 0"), " ",4) '時間の演算 Wscript.echo TimeSerial(Hour(now) + n(0), Minute(Now) + n(1), Second(Now) + n(2))
loaddll "HmPipe.hmf";
$t = time;
$outstr = dllfuncstr("HmPipeRun", "2 0 0", "cscript.exe", "//nologo timeadd.vbs");
message "現在時:" + $t + "\n2時間後:" + $outstr;
freedll;
endmacro;
現在時:00:50:07 2時間後:2:50:08
2010/03/22 マクロ関数を追加
hmjre.dllは、秀丸エディタVer.4.00から使用されている正規表現検索用のDLLです。 秀丸エディタの検索・置換で使用されています。 このDLLには、マクロから呼び出せる関数があります。
HmJre.dll側での文字コードインデックス自動変換をON/OFFする関数。
関数にユニコード文字を含む文字変数を渡す場合、ユニコード文字1文字が4バイトのデータとして渡される形となります。
その為、通常の文字操作関数で、Hmjre.dllの戻り値を、そのまま使用すると、通常の文字インデックスの値とずれることになります。
この関数を使用することにより、通常の文字操作関数で使用するのに問題のない値に、自動的に変換することが可能です。
(秀丸エディタ V8.00β45以上、および秀丸メール V5.34β9以上で対応)
実際の使い方は、turukame.3:05320を参照してください。
関数の詳細は、hmjre.dllのヘルプを参照してください。
マクロ作成時に、文字列変数に対して、正規表現を使った検索を行うには、
を使用します。
置換を行うには、
を使用します。
"FindRegular"は見つけた位置(先頭は0)を、"GetLastMatchLength"はマッチした文字列の長さを返す為、 midstr関数を使えば、マッチした文字列を取得できます。
基本的に、行単位で処理を行うことを、前提としている為、 "$"が、\nの前にマッチする事が、特殊と考えた方がいいかもしれません。 (検索等で、複数行の処理が苦手となっている原因)
実験用マクロ
debuginfo 1;
// 012345 678901
$target = "a1111\nb2222";
loaddll "hmjre.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
call hmjre_check "^";
call hmjre_check "$";
freedll;
endmacro;
hmjre_check:
#st = 0;
while(1){
#ret = dllfunc("FindRegular",$$1, $target, #st);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
//マッチした部分の長さを取得
#len = dllfunc("GetLastMatchLength");
debuginfo $$1 + ": #ret=" + str(#ret) + " #len=" + str(#len) + " #st=" + str(#st);
}else{
break;
}
#st = #ret + 1;
}
return;
実行結果
// 012345 678901 $target = "a1111\nb2222"; ^: #ret=0 #len=0 #st=0 --> 先頭にしかマッチしない。 $: #ret=5 #len=0 #st=0 --> 改行の前にマッチ $: #ret=11 #len=0 #st=6 --> 検索対象の末尾にマッチ
ファイル名をドライブ、各フォルダ、ファイル名に分割します。
$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe";
loaddll "hmjre.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
//ファイルの各要素を分割
// C:\Program Files\Hidemaru\hidemaru.exe
// 01234567890123456789012345678901234567
// 12 1234567890123 12345678 123456789012
// 0 0 1 2
// 0 3 7 6
#st = 0;
while(1){
#ret = dllfunc("FindRegular","[^\\\\]+", $name, #st);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
//マッチした部分の長さを取得
#len = dllfunc("GetLastMatchLength");
$match = midstr($name, #ret, #len);
message "match -> " + $match + "\n#ret=" + str(#ret) + " #len=" + str(#len);
}else{
break;
}
#st = #st + #len + 1;
}
freedll;
endmacro;
実行結果
1回目 match -> C: #ret=0 #len=2 2回目 match -> Program Files #ret=3 #len=13 3回目 match -> Hidemaru #ret=17 #len=8 4回目 match -> hidemaru.exe #ret=26 #len=12
今回はファイルのパスを分解しましたが、正規表現を変えれば、splitの替わりになるかな?
変数に格納されたファイルパスから、フォルダ名、ファイル名、拡張子を取得します。
$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe";
loaddll "hmjre.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
//ファイル名部分を検索
#ret = dllfunc("FindRegular","[^\\\\]+$", $name, 0);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
//マッチした部分の長さを取得
#len = dllfunc("GetLastMatchLength");
$basename = midstr($name, #ret, #len);
$directory = leftstr($name, #ret - 1);
}
//拡張子を検索
#ret = dllfunc("FindRegular","\\..+$", $name, 0);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
//マッチした部分の長さを取得
#len = dllfunc("GetLastMatchLength");
$extention = midstr($name, #ret, #len);
}
message "ファイルパス:" + $name + "\n" +
"フォルダ名 :" + $directory + "\n" +
"ファイル名 :" + $basename + "\n" +
"拡張子 :" + $extention;
freedll;
endmacro;
実行結果
ファイルパス:C:\Program Files\Hidemaru\hidemaru.exe フォルダ名 :C:\Program Files\Hidemaru ファイル名 :hidemaru.exe 拡張子 :.exe
入力されたファイル名に、使用できない文字があるかどうかをチェックします。
loaddll "hmjre.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
$input = input("ファイル名を入力してください。");
$regexp = "[\\/:,;*?\"<>|]";
//フルパスの場合は:\をチェックから外す
if((midstr($input,1,2) == ":\\") || (midstr($input,0,2) == "\\\\")){
$regexp = "[/,;*?\"<>|]";
}
#ret = dllfunc("FindRegular",$regexp ,$input ,0);
if(#ret > -1){
#len = dllfunc("GetLastMatchLength");
$check = midstr($input, #ret, #len);
message "ファイル名に使えない文字があります。\n「" + $check + "」";
}else{
message "ファイル名に問題はありません。";
}
freedll;
endmacro;
Visual Basicのtrim関数と同等の機能。空白(0x20)、全角空白(0x8140)、タブ(0x9)を削除します。 hmjre.dllの独自仕様である"ヒットした扱いにするタグ指定"を使っています。
$name = " \t C:\\Program Files\\Hidemaru\\hidemaru.exe \t ";
loaddll "hmjre.dll";
if(!result){
message "DLLのロードに失敗しました。";
endmacro;
}
$regexp = "^([ \\t]+)(.+?)([ \\t]+$)(?\\2)";
#ret = dllfunc("FindRegular",$regexp ,$name ,0);
if(#ret > -1){
#len = dllfunc("GetLastMatchLength");
$check = midstr($name, #ret, #len);
message "「" + $check + "」";
}else{
message "検索に失敗しました。";
}
freedll;
endmacro;
田楽DLLは、杉浦方紀氏が作成した、秀丸エディタ/秀丸メールのマクロから呼び出せる機能拡張DLLで、以下の機能があります。
ダウンロード先:M. Sugiura Personal Web Page [Root]
関連項目
どんな、ダイアログが作成可能か知りたい場合は、配布ファイル内にある"dgdll.mac"を実行して下さい。 使用できるコントロールが全て使用されているので、サンプルとしても役に立ちます。
作成例として、「検索ボックス向け検索オプション変更マクロ」を使います。 チェックボックスと、ボタンを並べただけの、簡単なダイアログです。
マクロの構成としては、以下の3つから構成されています。
00016|//田楽DLLを読込
00017|loaddll "DengakuDLL.dll";
00018|if (!result) loaddll hidemarudir + "\\DengakuDLL.dll";
00019|if (!result) loaddll macrodir + "\\DengakuDLL.dll";
00020|if (!result) loaddll currentmacrodirectory + "\\DengakuDLL.dll";
00021|if (!result){
00022| message "DengakuDLL.dll がロードできません。\n 実行ファイルと同じフォルダかマクロファイル用のフォルダに置いてください";
00023| endmacro;
00024|}
単純に、「loaddll "DengakuDLL.dll";」だけでもいいですが、ロードに失敗した場合は、 DLLのロードする場所を、
に順次切り換えて、ロードを試みます。 それでも失敗した場合は、エラーで終了します。
使用する部品の配置や、表示内容などの設定を行います。
00025| //ダイアログ作成
00026| #w1 = 26;
00027| if (dllfunc("NEWDIALOG", $title + str(#TIMEOUTSET), #w1) == 0 ||
00028| //大文字/小文字の区別
00029| dllfunc("NEWCONTROL","check", "casesense","大文字/小文字の区別(&C)") == 0 ||
00030| dllfunc("SETCTRLSTATE","casesense", str(searchoption & 0x00000002 == 0x00000002)) == 0 ||
00031| dllfunc("SETCTRLNOTIFY","casesense", "101") == 0 ||
00032| //単語の検索
(省 略)
00063| message "ダイアログ作成エラー!";freedll;endmacro;
00064| }
簡単な各命令の説明です。
次に、部品を"NEWCONTROL"で配置して、各種設定(通知コードの設定と、検索フラグの状態をセット)を行います。
部品の配置を行います。部品の種類と、部品名を設定します。 ここでは、
を、行ってます。
田楽DLLで部品配置は、部品配置列の各行に対し、部品を置いておく事になります。
部品配置列 行┌─────────────────┐ 1│□大文字/小文字の区別(&C) │ ├─────────────────┤ 2│□単語の検索(&W) │ ├─────────────────┤ 3│□正規表現(&R) │ ├─────────────────┤ 4│□あいまい検索(&F) │ ├─────────────────┤ 5│□次の秀丸エディタも続けて検索(&H)│ ├─────────────────┤ 6│□一周する(&O) │ ├─────────────────┤ 7│□検索文字の強調/検索(&I) │ ├─────────────────┤ 8│閉じる │ └─────────────────┘
例では、行に1つの部品しか配置していませんが、複数の部品の配置も可能です。 複数の部品を配置する場合は、"SETCTRLWIDTH"を使用します。 "SETCTRLWIDTH"で幅を指定すると、次のコントロールは、幅を指定したコントロールの右側に、 幅を指定しない場合は、次行に配置する事になります。 また、幅を指定しない場合、"NEWDIALOG"で指定した幅を元に、コントロールの幅が、 自動的に設定されます。(「閉じる」ボタンを参照)
部品を配置し、設定したら、ダイアログを実際に表示します。
00066| if (!dllfunc("SHOWDIALOG",hidemaruhandle(0),1)){
00067| freedll;
00068| message "ダイアログの表示に失敗しました。";
00069| endmacro;
00070| }
通知コードの待ち受け処理です。
00071| //メインループ
00072| #st = tickcount;
00073| #timeout = #st + (1000 * #TIMEOUTSET);
00074| #n = 1;
00075| while (1) {
00076| $retcode = "";
00077| while (strlen($retcode) == 0){
00078| $retcode = dllfuncstr("WAITCTRLNOTIFY",10);
00079| //タイムアウト処理
00080| if(tickcount > #timeout){
00081| $retcode = "BREAK";
00082| break
00083| }
00084| if((#st + (#n * 1000)) < tickcount){
00085| #ret = dllfunc("SETDLGTITLE", $title + str(#TIMEOUTSET - #n));
00086| #n = #n + 1;
00087| }
00088| }
77〜88行目が、通知コードの待ち受け部分です。 dllfuncstr("WAITCTRLNOTIFY",10)が、実際に通知コードを受け取る命令になります。 本来なら、1行で済みますが、今回はタイムアウト処理などがあるので、多くなってます。
タイムアウト処理がなければ、こんな感じです。
while (strlen($retcode) == 0) $retcode = dllfuncstr("WAITCTRLNOTIFY",10);
ここでは、何かしら、通知コードが入力されるまで(ダイアログが操作されるまで)、 ひたすら待ち続けます。
実際の処理部。 受け取った通知コードをみて、各種処理をおこないます。
00089| if($retcode == "0" || $retcode == "BREAK"){
00090| break;
00091| }else if($retcode == "101"){
00092| setsearch searchbuffer, (searchoption ^ 0x00000002);
00093| }else if($retcode == "102"){
00094| setsearch searchbuffer, (searchoption ^ 0x00000001);
00095| }else if($retcode == "103"){
00096| setsearch searchbuffer, (searchoption ^ 0x00000010);
00097| }else if($retcode == "104"){
00098| setsearch searchbuffer, (searchoption ^ 0x00000020);
00099| }else if($retcode == "105"){
00100| setsearch searchbuffer, (searchoption ^ 0x00000080);
00101| }else if($retcode == "106"){
00102| setsearch searchbuffer, (searchoption ^ 0x01000000);
00103| }else if($retcode == "107"){
00104| setsearch searchbuffer, (searchoption ^ 0x00000800);
00105| }else if($retcode == "108"){
00106| setsearch searchbuffer, (searchoption ^ 0x00001000);
00107| }
例では、検索オプションの書き換えを行っています。
通知コードが"0"(閉じるボタン)または、"BREAK"(タイムアウト)の場合は、 待ち受けループを抜け、ダイアログを閉じ、終了します。
00111| ##ret = dllfunc("ENDDIALOG");
BregIf.DLLは、v0,1,3,0 以降、マクロから呼び出せる各種関数が実装されています。 その関数の使い方の例です。 というか、開発時に使っている動作確認用マクロです。新規秀丸を開き、結果を出力します。
出力結果
c:\program files\hidemaru\bregif.dll
BRegIf.dll Ver.1.32(bregonig.dll Ver.1.44 with Oniguruma 5.9.1)
1 2 3 4 5 6 7
01234567890123456789012345678901234567890123456789012345678901234567890
Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
FindRegularのテスト
FindRegular("(03|045)-(\d{3,4})-(\d{4})", $target, 0)
見つかった場所:10
マッチした長さ:12
マッチした文字:045-222-1111
見つかった場所1:10
マッチした長さ1:3
マッチした文字1:045
見つかった場所2:14
マッチした長さ2:3
マッチした文字2:222
見つかった場所3:18
マッチした長さ3:3
マッチした文字3:111
GetFunctionResultを使用した場合
見つかった場所0:045-222-1111
見つかった場所1:045
見つかった場所2:222
見つかった場所3:1111
Matchのテスト
Match("(03|045)-(\d{3,4})-(\d{4})","",$target, 0)
見つかった場所:10
マッチした長さ:12
マッチした文字:045-222-1111
見つかった場所1:10
マッチした長さ1:3
マッチした文字1:045
見つかった場所2:14
マッチした長さ2:3
マッチした文字2:222
見つかった場所3:18
マッチした長さ3:3
マッチした文字3:111
GetFunctionResultを使用した場合
見つかった場所0:045-222-1111
見つかった場所1:045
見つかった場所2:222
見つかった場所3:1111
FindRegularNoCaseSenseのテスト1
FindRegularNoCaseSense("(YOKOHAMA).+(OSAKA).+(TOKYO)", $target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo
FindRegularNoCaseSenseのテスト2
FindRegularNoCaseSense("(yoKoHaMa).+(oSAka).+(tOkYo)", $target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo
Matchのテスト2
Match("(yoKoHaMa).+(oSAka).+(tOkYo)", "i",$target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111 Osaka 06-5555-6666 Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo
Transのテスト
base :abcdefghijkl
tr/bdfj/BDFJ/ :aBcDeFghiJkl
tr/bdfj/_/ :a_c_e_ghi_kl
tr/bdfj/BD/d :aBcDeghikl
tr/abcd/_/s :_efghijkl
tr/abcd/_/c :abcd________
tr/abcd/_/cs :abcd_
データ変更
tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一 Osaka 零6-5555-6666 Tokyo 零3-一一一一-9999
Translateのテスト
tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一 Osaka 零6-5555-6666 Tokyo 零3-一一一一-9999
Splitのテスト
分割文字: *\d{2,3}-\d{3,4}-\d{4} *
split戻り値:3
エラー:
分割文字(0):[ Yokohama]
分割文字(1):[Osaka]
分割文字(2):[Tokyo]
Substのテスト
s/[0-9]/x/ :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/g :30--> Yokohama xxx-xxx-xxxx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
SubstExのテスト
s/[0-9]/x/ st = 0 :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/ st = 20 :01-->x1 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/g st = 30 :20-->xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
SubstEx2のテスト
s/[0-9]/x/ st = 0 :01--> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/ st = 20 :01--> Yokohama 045-222-11x1 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/g st = 30 :20--> Yokohama 045-222-1111 Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
Replaceのテスト
s/[0-9]/x/ --> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/g --> Yokohama xxx-xxx-xxxx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
Replace2のテスト
s/[0-9]/x/ st = 10 --> Yokohama x45-222-1111 Osaka 06-5555-6666 Tokyo 03-1111-9999
s/[0-9]/x/g st = 20 --> Yokohama 045-222-11xx Osaka xx-xxxx-xxxx Tokyo xx-xxxx-xxxx
基本的に、従来のdllfunc/dllfuncstrで、外部DLLに対し、unicode文字列を渡すことはできません。 例外的に、hmjre.dll/Tkinfo.dllのみ、秀丸独自コードを使用し、unicode文字列を渡すことが可能です。
hmjre.dll/Tkinfo.dll以外のDLLでは、"Unicodeを取り除いた形式に変換"しているとのこと。 (秀丸エディタ本体側で処理。turukame.3:05331を参照)
Ver.8より、ワイド文字に対応した、dllfuncw/dllfuncstrwが追加されています。 外部DLLで、unicode文字列を扱う場合は、dllfuncw/dllfuncstrwを使用することになりますが、 DLL側の対応が必要です。
文字変数内に、Unicode文字が含まれるかどうかの、チェック方法はマクロヘルプに 記載されています。 (秀丸エディタ ver.8 charindex_to_byteindex のページ)