マクロの nextfolder 関数についてNo.02465
ぱと さん 10/02/21 14:06
 

nextfolder 関数ですが、フォルダツリーでサブフォルダが閉じている時には、そこ
は無視されて、次の開いているフォルダーに移動するという動作でしたっけ?

loaddll "tkinfo.dll";
#n = dllfunc( "NextFolder" );
endmacro;

というだけのテストマクロを作って、手動で実行するとそうなってしまいます。

存在している次のサブフォルダに移動するようにするにはどうすればいいでしょう
か?

----
ぱと

[ ]
RE:02465 マクロの nextfolder 関数についNo.02469
秀まるお さん 10/02/21 15:36
 
 NextFolder/PrevFolder関数は、たしかに折りたたまれたフォルダは選択しま
せんでした。

 GetNextFolder/GetPrevFolder関数を使うとうまくいくようです。

 例:

    loaddll "tkinfo.dll";
    $account = dllfuncstr("CurrentAccount");
    $folder = dllfuncstr("CurrentFolder");
    $s = dllfuncstr("GetNextFolder", $account, $folder);
    #x = strstr( $s, "\\");
    if( #x >= 0 ) {
        $account = leftstr( $s, #x);
        $folder = midstr( $s, #x + 1, 256 );
    } else {
        $account = $s;
        $folder = "";
    }
    #n = dllfunc("SelectFolder", $account, $folder);

 それか、ExpandFolder関数で展開してからNextFolder関数を使うという方法も
あると思います。

[ ]
RE:02469 マクロの nextfolder 関数についNo.02470
ぱと さん 10/02/21 16:15
 
秀まるお さん

秀丸メールユーザーのぱとと申します。

> NextFolder/PrevFolder関数は、たしかに折りたたまれたフォルダは選択しま
>せんでした。

以前と仕様が変更されましたでしょうか?

ずっと昔に、存在する全部のフォルダの メール一覧の表示範囲を全て「最近の分」
に変更するというだけのマクロを作って、当時は問題なく動いていたような記憶が
あるのですが、今回これを久しぶりに使ってみて、うまく動作しないので、この件
に気がつきました。

回避方法をご教示いただきましたが、もしできることなら、フォルダツリーの開閉
状態に関わらず、次のフォルダに移動するという関数をサポートしていただけると
大変ありがたいです。

----
ぱと

[ ]
RE:02470 マクロの nextfolder 関数についNo.02471
秀まるお さん 10/02/21 20:15
 
> 以前と仕様が変更されましたでしょうか?

 一応、V3.03(2008年8月)とソースコード比較した限りはまったく変わってま
せんでした。

 改版履歴をgrep検索した限りでは、

・tkinfo.dllにClearAllUnread、NextFolder、PrevFolder関数を追加した。
・ヘルプのNextFolder/PrevFolderの上下の記述間違い修正。
・tkinfo.dllのNextFolder/PrevFolderの返り値が常に1になってしまうバグ修正。
・GetNextFolder, GetPrevFolder, GetMailCountInFolder, GetFolderHotState
 関数を追加して、さらに、GetFolderExpandState, RecvMailCountInFolder
 関数にアカウント名/フォルダ名を指定できるパラメータを追加した。
・GetNextFolder/GetPrevFolder関数についてのヘルプの間違い修正。

 または、

・上のフォルダ/下のフォルダコマンドを追加した。
・「上のフォルダ、下のフォルダ」コマンドで、アカウント用のフォルダを選
 択した時に勝手にアカウントが展開してしまうバグ修正。
・キー割り当てで「上のフォルダ/下のフォルダ」を割り当てて、そのキーを
 リピートがかかるように押さえた時に、リピート中はメール一覧の更新をし
 ないようにした。

 のようなのしかヒットしないので、仕様変更してないはずだと思います。

> 回避方法をご教示いただきましたが、もしできることなら、フォルダツリーの開閉
> 状態に関わらず、次のフォルダに移動するという関数をサポートしていただけると
> 大変ありがたいです。

 長々と回避マクロを書きましたけど、最後にちょっと書いた通り、実は、

    #n = dllfunc( "ExpandFolder", 1 );
    #n = dllfunc( "NextFolder" );

 と2行書くだけ済みます。

 PrevFolderについては上記のように簡単にはいかないんですけど、とりあえず
NextFolderだけでいいなら、上記の2行で済む話なので、わざわざ関数追加する
必要は無いと思います。

 ただ、それでもなお必要だとおっしゃるなら、パラメータ追加という形で対応
してもいいです。(上方向に進む方は面倒というのもあるので)

[ ]
RE:02471 マクロの nextfolder 関数についNo.02472
ぱと さん 10/02/21 21:02
 
秀まるお さん

秀丸メールユーザーのぱとと申します。

> 一応、V3.03(2008年8月)とソースコード比較した限りはまったく変わってま
>せんでした。

なるほど、仕様は変更されていないということで了解しました。
なお、念のためですが、マクロのタイムスタンプを見てみたところ、2006年の4月で
した。

loaddll "TKInfo.dll";

#n = dllfunc( "DisableDraw", 1 );

while(1){
    if(!dllfunc( "NextFolder" ) ) break;
    else {
    #n = dllfunc("SetViewArea", 1);
    }
}

#n = dllfunc( "EnableDraw" );

endmacro;

と、これだけのマクロです。

何かの拍子に、それぞれのフォルダの ViewArea が[全体]になってしまうことがあ
り、メールが多いフォルダが[全体]になった場合に、普通の操作で次の未読メール
に飛ぶという操作が重くなることがあるので(ホームディレクトリをサーバーにおい
てある影響があると思います。)、ViewArea を「最近の分」に統一するという用途
に使ってました。

>    #n = dllfunc( "ExpandFolder", 1 );
>    #n = dllfunc( "NextFolder" );
>
> と2行書くだけ済みます。

上記のように、他の皆さんのマクロの見よう見まねで、while を break する条件に
NextFolder 関数の戻り値を入れているので、私の知識ではちょっと試行錯誤しなけ
ればならないようです。他にも検索フォルダのこともマクロの中で考慮しないとな
りませんね。

----
ぱと

[ ]