openfile 後の処理がおかしいNo.00813
MoW さん 99/10/30 04:00
 

1|  // $data_file は閉じている状態で,(無題)ではない秀丸から起動.
2|  openfile "/r " + $data_file;
3|  gofiletop;
4|  //message "file top";

上の様なマクロで,openfile の後の gofiletop文がされないことがあります。
4行目のコメントを外すと,正常に動くのですが・・・
環境は,Win98 & 秀丸Version 3.01 です。

何か,対処する術はないのでしょうか。

[ ]
RE:00813 openfile 後の処理がおかしいNo.00814
MoW さん 99/10/30 04:59
 
よくよく考えたら,前に書いたマクロではエラーが起こりそうも
なかったので,もっと具体的に書いておきます。
(省略しすぎました・・・m(_ _)m)

$data_file はiniファイルと同じ形式で書かれてます。
そのセクション($Path_Code)は,
    [Menu / AAA--BBB--CCC--DDD]
というようになっており,その中の"--"の個数(#i)を調べ,
最大値(#max)を知りたいのですが。

// ------- start ------------------------------------
// $data_file は閉じている状態
// (無題)ではなく,かつ$data_fileでもない秀丸から起動.

#hwnd = hidemaruhandle (0);

openfile "/h /r " + $data_file;
#res = result;
#hwnd_stealth = hidemaruhandle (0);

if (#res == false) {
    message "Error! Can NOT open datafile.";
    endmacro;
}

gofiletop;
down;

#max = 0;
setsearch "\\[Menu / [^\\]]*\\]", 16;

findup;
#res = result;
if (#res == yes) goto getline:

while (true) {
    finddown;
    #res = result;
   
    if (#res == yes) {

getline:
        #xt = x;
        #yt = y;
        gokakko;
        #xe = x;
        #ye = y;
       
        $Path_Code = gettext (#xt + 1, #yt, #xe - 1, #ye);
       
        #i = 0;
       
        while (true) {
            #hit = strstr ($Path_Code, "--");
           
            if (#hit == -1)     break;
            else                #i = #i + 1;
           
            $Path_Code = rightstr ($Path_Code, strlen ($Path_Code) - #hit - 2);
           
        }
       
        if (#i > #max)  #max = #i;
       
    } else {
        break;
    }
}

setactivehidemaru #hwnd;
closehidemaruforced #hwnd_stealth;

message "max = " + str (#max);

// ---------- end -----------------------------

ステルスモードにしたら,更にうまくいかなくなりました。
エラーの内容は,文字列が長すぎるという内容ですが,
$Path_Code (iniファイルのセクション)は,100文字以内です。
8KBを超えるはずはないのですが。


[ ]
RE:00814 openfile 後の処理がおかしいNo.00815
安久津 さん 99/10/30 08:57
 
こんにちは Mow さん、安久津といいます。

>   while (true) {
>       finddown;
>       #res = result;
>
>       if (#res == yes) {
>
>   getline:
>           #xt = x;

とりあえず、escape; を入れて下さい。
次のような具合です。

while (true) {
    escape; // <-ここと
    finddown;
    #res = result;

    if (#res == yes) {

getline:
        escape; // <-ここです。
        #xt = x;

違っていたらごめんなさい。m(__)m
ではでは。
おまけ。
$Path_Code = gettext (#xt + 1, #yt, #xe - 1, #ye);
検索した直後なら、
$Path_Code = gettext(seltopx + 1, seltopy, selendx - 1, selendy);
が使えるとラクチンです。

[ ]
RE:00815 openfile 後の処理がおかしいNo.00816
MoW さん 99/10/30 17:37
 
安久津さん,ありがとうございます。

>とりあえず、escape; を入れて下さい。
>次のような具合です。
>
>while (true) {
>    escape; // <-ここと
>    finddown;
>    #res = result;
>
>    if (#res == yes) {
>
>getline:
>        escape; // <-ここです。
>        #xt = x;
>

確かにescape文は入れた方が良いですよね。
しかし,これだけでは解決しませんでした。
もう少し詳しく調べてみると,gofiletop文は正常に実行されていましたが,
1回目のgokakko文の実行で,ファイルが開かれた時の行まで飛んでしまう
ことがあるため,文字列が長すぎるエラーが起こるようでした。
golineend文にしたら,とりあえず大丈夫みたいでした。

あと、grepで処理する方法も考えられるなぁなどと考えてもいます。


[ ]