Title: 田楽DLLメモ

top秀丸エディタマクロマクロ作成関連

update : 2016/06/05 (Sun)

田楽DLLはM. Sugiura Personal Web Pageから、ダウンロード出来ます。

関連項目

1 田楽DLL使用時の注意点など

マクロ作成時に遭遇した注意事項などです。 ちなみに、最新版では修正されている場合もあるかも知れません。

1.1 アクティブウィンドウの切り換え

田楽DLLでダイアログ表示中にアクティブな秀丸エディタを切り換えても、コマンド自体は成功するが 実際には切り替わりません。

アクティブウィンドウを切り換える時は一度ダイアログを非表示にしてから行わないと 駄目なようです。

message文もアクティブにならなくて、田楽側でかわりの命令追加しているくらいなので、 田楽DLL側での対処も難しいのでしょう。

Ver8.10β4 で、秀丸エディタ側で対策が行われています。

ダイアログを動かしていた場合、一度非表示にして再表示すると表示位置は"NEWDIALOG"で 指定した場所に表示されてしまいます。 "GETDLGPOS"で座標を保存し、"SETDLGPOS"で設定すれば同じ場所に表示できます。

1.2 関数について

helpを見ても関数の使い方がよくわからない場合、添付の"dgdll.mac"を調べてみましょう。 "dgdll.mac"が一番の参考書となります。

1.3 ファイル操作系関数

良く忘れるのが、空白を含むパスへの対応。 特にオプションを一緒に指定する関数は注意が必要です。 空白を含むパスを指定する場合は「"(ダブルコーテーション)」か「'(シングルコーテーション)」で 囲むこと。

1.4 コントロールの設定読み込み

ダイアログを閉じてしまうと、各コントールの設定が読み出せません。 (閉じているので当たり前といえば当たり前)

チェックボックスやエディットの値が必要な場合は、 閉じる前に取得する必要があります。

Ver.2.91ではダイアログを閉じても、コントロールから値を取得できます。 (テストに使ったファイルを確認したら2001年作成だった。)

1.5 ダイアログ表示中に、参照ボタン以外でコモンダイアログを表示する

何かしらの理由で、「参照ボタン」が使えない場合に、コモンダイアログを表示する方法です。

"SHOWDIALOG"で作成したダイアログを表示中に、"GETFILENAME"を使用し、コモンダイアログを 表示するにはオーナーウィンドウのハンドルが必要になります。 "0"やhidemaruhandle(0)を使う方法もありますが、表示しているダイアログが操作できたり、 ダイアログより前に表示されない状態になります。

参照ボタンと同じように表示するには、表示ししているダイアログのウィンドウハンドルを取得し、 "GETFILENAME"に渡す必要があります。 ダイアログ作成時に、タイトル文字列が指定されていれば、その文字列を"findwindow"で検索する ことにより、田楽DLLで作成したダイアログのハンドルを取得できます。 タイトル文字列を指定しない場合には、この方法は使えません。

注意タイトル文字列に、なるべく他のウィンドウと識別ができるようなユニークな文字列を 指定しないと、誤検出する可能性があります。

1.6 参照ボタンの設定方法

ファイル、フォルダ参照ボタンは、設定方法がわかりにくいので補足。ファイル参照ボタンを例にします。

設定は"SETCTRLITEM"を使って設定します。参照ボタンの"SETCTRLITEM"の解説には、

$s2:コモンダイアログ操作系の関数  の第2引数以降を指定
    (refdirbutton は GETDIRNAMEEX() 関数 に対応)
$s3:追加する場所(1以上)。 0以下または省略時は項目リストの一番最後に 追加されます。

とあるので、タイトルや、初期フォルダは"SETCTRLITEM"で設定することがわかります。 しかし、一回の"SETCTRLITEM"で、全ての引数を設定する訳ではないので、注意が必要です。

マクロの設定例

//参照ボタンの追加
dllfunc("NEWCONTROL","reffilebutton","macadd", "追加") == 0 ||
//GETFILENAMEの$2 ダイアログのタイトル文字列
dllfunc("SETCTRLITEM","macadd","マクロファイル","0") == 0 ||
//GETFILENAMEの$3 初期フォルダ名
dllfunc("SETCTRLITEM","macadd",macrodir,"0") == 0 ||
//GETFILENAMEの$4 「ファイルの種類」コンボボックスに追加するフィルタ文字列
dllfunc("SETCTRLITEM","macadd","マクロファイル(*.mac)") == 0 ||

このように、複数回の"SETCTRLITEM"の実行により、各オプションをセットします。

1.7 秀丸本体のメニューが白くなる

田楽DLL + WindowsXPの組み合わせで使用している場合、MENU関数を使用したメニュー表示中に、 秀丸本体側のメニューバーが真っ白になる場合があります。
メニューの表示が終了すれば元に戻るので、ビックリする以外の問題はありません。
田楽DLLの作者である杉浦氏には報告済み。「対処するのは難しいかもしれない。」との事です。
メニューが白くなっている画面

1.8 メニュー表示時のウィンドウ

田楽DLLでメニューを表示する場合に、生成される(?)ウィンドウ。

ウィンドウクラス名
DengakuDLLWndClass
ウィンドウタイトル
DengakuDLL DummyWindow

まぁ、何かに使えるかも?

1.9 ソートの切替

リストコントロールなどでソートを設定できますが、表示中は変更できないようです。

  1. 非表示へ
  2. 設定変更
  3. 再表示

という手順が必要です。

1.10 イベントの連鎖

エディットボックスで、内容が変更された場合に通知コード受け取り、マクロ内で 通知してきたエディットボックスの内容の変更を行うと、イベントの連鎖が起き、 無限ループに陥る場合があります。

  自分で内容を変更したため、通知コード発行
┌─→↓
│ 通知コードを受け取り
│  ↓
│ マクロ内で、通知してきたエディットボックスの内容を変更
│  ↓
│ マクロで内容が変更されたため、通知コードを発行
└──┘

以下のコードは、通知コードの受信部分です。 (A)の部分で、内容を変更するため、(B)部分で(A)時の通知コードを受信してしまい、 ループしてしまう。

while (1) {
    $name = "";
//(B)通知コードの受信
    while (strlen($name) == 0) { //    ダイアログからの通知を待つお約束な処理
        //2番目の引数を小さくすると応答性はよくなるが負荷は大きくなる。
        $name = dllfuncstr("WAITCTRLNOTIFY",10);
    }
    if($name ="xx"){
//(A)マクロで通知コードを発行したエディットボックスの内容を変更
        #n = dllfunc("SETCTRLSTRING", "testedit", "内容変更");
    }
    …
}

ループをしないようにするには、(A)で変更した直後に、通知コードを受け取って しまいます。(メインの受信部分では受け取らないようにする。)

1.11 コントロール追加時の注意

杉浦さんの所の掲示板より。

コントロールの追加で、以下のように if文 と"||"で記述する場合、 つなげる行数が多い(33個が最大)と、エラーになるとのこと。

if (dllfunc("NEWDIALOG", $title + str(#TIMEOUTSET), #w1) == 0 ||
    //大文字/小文字の区別
    dllfunc("NEWCONTROL","check", "casesense","大文字/小文字の区別(&C)") == 0 ||
    dllfunc("SETCTRLSTATE","casesense", str(searchoption & 0x00000002 == 0x00000002)) == 0 ||
    dllfunc("SETCTRLNOTIFY","casesense", "101") == 0 ||
    …

対処方法としては、エラーの判定を一つのif文でやる必要はないので、 たくさんの行をつなげないことです。


top秀丸エディタマクロマクロ作成関連