はじめましてNo.00020
AKT さん 97/09/27 00:16
 
はじめまして、AKTです。
こういう、発言は許されるんでしょうか? まあ、やってみないとわからんなーと
思ったんでやってしまいましょう。

実は、自分は秀ページの秀丸マクロライブラリの方でしょうもないマクロを載せて
もらってるんですが、そのマクロにマクロサーバーを使った機能を追加しようと、
今日、ちまちまやってたんですが、そこでどーしようもない状態に陥ってしまいま
した。ごちゃごちゃ説明する能力がないんでそのマクロの一部を載せさせていただ
きます。

-----
run "macserv.exe /h";
ddeinitiate "HideMacroServer", "DlgService";
ddeexecute "setcurdir " + directory;
#l=33;
$$harf="";
while(#l < 126){
$$harf=$$harf+char(#l);
#l=#l+1;}
#no=0;
#l=0;
ddepoke "newdialog", "8";
while(#l < 5){
#j=0;
while(#j < 20){
$mac="check,MC"+str(#no)+",["+midstr($$harf,#no,1)+"]";
ddepoke "newcontrol", $mac;
ddepoke "default", "1";
#j=#j+1;
#no=#no+1;}
ddepoke "newcolumn", "8";
#l=#l+1;}
#l=0;
while(#l < 13){
$mac="check,MC"+str(#no)+",["+midstr($$harf,#no,1)+"]";
ddepoke "newcontrol", $mac;
ddepoke "default", "1";
#j=#j+1;
#no=#no+1;}
call MakeDialog;
endmacro;
MakeDialog:
#hwnd = hidemaruhandle(0);
ddeexecute "dialog " + str(#hwnd);
$$a = "";
ddestartadvice "dlgresult", $$a;
while( strlen($$a) == 0 ) {
ddewaitadvice $$a, 100;
}
ddestopadvice "dlgresult";
ddeexecute "enddialog";
return $$a;
-----
と、いうようなやつなんですが(これはその問題のある部分だけのカット&ペースト
したものです)、これはどうも具合が悪いらしくマクロサーバーが落ちてしまいます。
確かに、今日ホントに初めてヘルプとサンプルマクロを見ながら作ったやつなんで、
「そら、あんた。あかんがな」
と、言われるようなことをしているのかも……。どうか、ご教授を。これがうまく
いかないと大したこともないところでやたら行数を稼いでいるマクロになってしま
うんです。なんとか、お願いします。あ、今見直したら、余計な動作が……
ま、いっか。

[ ]
RE:00020 はじめましてNo.00021
Etsu さん 97/09/27 06:24
 
はじめまして、AKTさん。私はEtsuといいます。

 ddeinitiate "HideMacroServer", "DlgService";
 ddeexecute "setcurdir " + directory;

パッとみてこれは...と思ったので書いておきます。
ダイアログサービスを使う、と宣言していていきなりファイルサービスのコマンドで
ある
setcurdir を使っていますね。
両方のサービスを使うのであれば、

 ddeinitiate "HideMacroServer", "AllService";

に変更した方がいいと思います。

あと、マクロを張り付けた時にインデントが消えてしまったのでしょうか...
ちょっと内容が分かりにくくなってますね。

とりあえずはこの辺で...また見つけたら書き込ませてもらいますね。

[ ]
RE:00021 はじめましてNo.00022
Etsu さん 97/09/27 07:02
 
どうも、Etsuです。
マクロを実行すると確かに秀丸が死んでしまいます(^^;

マクロ内に

  midstr($$harf,#no,1)

という所がありますが、この「$$harf」というものはマクロの先頭で
33−125のキャラクタコードが順にセットされていますね。
よって$$harfの長さは93ということになります。

この文字変数に対して midstr() を使っていますが、#no の値が
この93という長さを大きく超えてしまっています。

具体的には、始めのループが終わった時点で #no が 5 * 20= 100
と既に93を超えてしまっていて、さらに後のループで更に #no
が加算されています。

関数 midstr() で始めの文字の位置が文字列の終端を超えたときの
動作はマクロヘルプには書かれていませんが、ここまで大きく
通り越してしまうとさすがにまずいようです。

[ ]
RE:00022 はじめましてNo.00023
Etsu さん 97/09/27 07:27
 
またまたEtsuです。

よくみると重大なバグがありました。
後のループが #l をカウンタとして while ループしているのに、
その中では #l ではなくて #j を足していってしまっています。
つまり無限ループになってしまっています。

以上のことから、変更点は

 1. 最初の二重ループが開始している
     while (#l < 5) を while (#l < 4)
    に変更する
 2. 次のループ(13回回るループ)内のカウンタ変数
     #j を #i
    に変更する

で望みどおりの動作になると思います。

[ ]