マクロの連続実行No.03270
sou さん 02/08/08 18:24
 
はじめましてsouです。

このフォーラムで秀丸マクロのことをいろいろ勉強したいと思いますが、
これからよろしくお願いします。

さっそく今回の質問ですが、
あるファイルのリストがあって、そのリストに載っているすべてのファイル
に対して同じ処理をするマクロを作ってみました。
内容は以下です。

// --------<< リストファイルから実行するマクロ >>-----------
// --------<< リスト中のファイルを順番に開き、処理を施す >>-----------

#ERR_NUM = 0;//エラーカウンター

gofiletop;//ファイルの先頭に移動
#LIST_HANDLE = hidemaruhandle(0); //リストファイルのハンドルを取得する

//-------作業ループ開始--------
while(code != eof){

//------現在の行のファイル名の取得開始--------
copyline; //一行コピー
beginclipboardread; //クリップボードから取得開始
$FILE_NAME = getclipboard;//クリップボードから一行取得
$FILE_NAME = leftstr( $FILE_NAME, strlen($FILE_NAME) - 1 );//改行の除去

if( $FILE_NAME == ""){ //空白行を飛ばす
movetolineno 1, lineno + 1;
continue;
}

#FF = existfile($FILE_NAME);//ファイル存在チェック
if( #FF == 0 ){
message "ファイルは存在しない" + $FILE_NAME;//存在しないと警告

movetolineno 1, lineno + 1;
#ERR_NUM = #ERR_NUM + 1;
if(#ERR_NUM >= 5) break;// 5 回以上発生すると終了
continue; //存在しない行を飛ばす
}

//------現在の行のファイル名の取得終了--------

#H_ORDER = findhidemaru($FILE_NAME);
if (#H_ORDER != -1) { // ウィンドウが見つかった
    #WORK_HANDLE = hidemaruhandle(#H_ORDER); // ウィンドウハンドルを取得
    setactivehidemaru #WORK_HANDLE; // そのウィンドウを手前にする
} else { // まだ開かれていないか、自分で開いているか
    if ($FILE_NAME != filename) { // まだ開かれていなかった
        openfile "/h " + $FILE_NAME; // 新しく開く
       
        if (result == false) {
            message "ファイルオープンできません" + $FILE_NAME;
            endmacro;
        }
    }
   
    #WORK_HANDLE = hidemaruhandle(0);
}

//------作業ファイル中で処理開始-------
//------ここでここの作業ファイルに対して処理を施す----

execmacro "work1.MAC";

//------作業ファイル中で処理終了-------

setactivehidemaru #LIST_HANDLE;//リストファイルに戻る
closehidemaruforced #WORK_HANDLE;//作業ファイルを閉じる

movetolineno 1, lineno + 1;//次の行へ進む

}
//-------作業ループ終了--------

endmacro;

このマクロはリストファイルから実行し、作業ファイルを次々と開き、
work1.MACの処理をした後に上書保存して閉じることを繰り返すものです。

問題になるのは開くファイルが多くなると(30以上、数は不定)、
処理途中で作業ファイルが閉じられず、処理が
リストファイルに帰って来なくなります。
(closehidemaruforced がうまく動いてない?)
そこで変なファイル名を開こうとして、処理が途中で終了します。
このマクロのどこがおかしいでしょうか。

長くなりましたが、分かる方は教えてください。
よろしくお願いします。

[ ]
RE:03270 マクロの連続実行No.03271
杉浦 まさき さん 02/08/08 20:43
 
sou さん、はじめまして。
杉浦 まさき と申します。

>問題になるのは開くファイルが多くなると(30以上、数は不定)、
>処理途中で作業ファイルが閉じられず、処理が
>リストファイルに帰って来なくなります。
>(closehidemaruforced がうまく動いてない?)
>そこで変なファイル名を開こうとして、処理が途中で終了します。
>このマクロのどこがおかしいでしょうか。

パッと見ですが、マクロには特におかしいところはないと思います。

setactivehidemaru & closehidemaruforced を繰り返す処理で
今回のようにマクロがウィンドウを見失う(?)現象は
以前から報告しているのですが、秀丸担当さんのところでは
再現できないようで困っている、という状況です。
再現性もイマイチわからなくて報告するこちらとしても
困ったもんなんですが…。

[ ]
RE:03271 マクロの連続実行No.03273
ENCODINGSHIFTJIS さん 02/08/09 09:47
 
>setactivehidemaru & closehidemaruforced を繰り返す処理で
>今回のようにマクロがウィンドウを見失う(?)現象は

SDI のソフトで面をパタパタ開閉するのはそうなりやすいと
思います。メモリの少ない状態でウィルス監視ソフトの
リアルタイム・スキャンが動作すると一瞬止まったりします。

下のマクロで動作の安定度を見て下さい。

// TEMPrepeat.mac
$filename="j.TXT";// すでに存在すること
openfile "/h";
// #TEMPh=hidemaruhandle(0);// 作業面の確保

      #cnt=66;
while(#cnt>0){#cnt=#cnt-1;

// 作業ファイルの読み込み・保存
selectall;              // 初期化準備
insertfile $filename;   // 入力
gofiletop; escape; insert time; insertreturn; // 何かの処理
saveas $filename;       // 出力
changename "$$$.txt";   // いちおう、安全に
// 作業面は消さずに、使いまわすのが ポイント
  }

showwindow 1;
endmacro;

[ ]
RE:03270 マクロの連続実行No.03276
sou さん 02/08/09 15:15
 
杉浦 まさきさん、ENCODINGSHIFTJISさん、
こんにちは。質問を出したsouです。

コメントを下さってありがとうございます。

早速ENCODINGSHIFTJISさんが提示してくれた方法を
私のマクロに取り入れてみました。
それでウィンドウを見失うことなく、
何百ファイルでも順調に動いています。

思いどおりに動いてくれると、すごく気持ちいいですね。

どうもありがとうございました。

[ ]