検索フォルダでマクロが意図通りに動かなNo.39750
hum さん 10/12/23 03:27
 
 いつもお世話になります。
 秀丸メールはいつも便利に使わせていただいています。

> V5.60βになってから、秀丸エディタのV8.02相当とソースコード同期してまし
>て、それでいくつか非互換とかレベルダウンのバグが出たりという可能性はあっ
>たりします。
> (ちなみに秀丸メールV5.54以下では、秀丸エディタV7.11相当になってます)
>
> その辺お手数かけてすみませんが、秀丸エディタV8系用のマクロを使えるよう
>にして欲しいというご要望も多数あるので、今の時期に対応したという状況にな
>ってます。

いつもながら素早い修正対応ありがとうございます。

Windows XP Pro SP3
秀丸メール   Ver.5.60β7
秀丸エディタ Ver.8.03β6
2010-12-23(木)

 勘違いかも知れませんが………私の環境でも挙動が?な、マクロが出ました。
秀丸メール   Ver.5.50β21で「マクロ登録 - 自動起動 - 受信が一段落した時」
に マクロを登録し、秀丸メールV5.54以下では、意図通りに動いていた気がします。

1.検索フォルダを複数作成する。
  (仮に検索フォルダ名はA、Bとします。)
2.マクロが動いた時は「B」の検索フォルダのメールを選択していても
  「A」の検索フォルダを選択し直しその中で未読があれば未読メールにフォーカス
し、
  未読がなければ、一番下のメールを選択していたのですが………

マクロが動く前に「A」の検索フォルダでメールを選択しているとマクロが動いた時
は、
「A」の検索フォルダの最後に選択していたメールにフォーカスが残る様になりまし
た。
「B」の検索フォルダのメールを選択してマクロが動いた時は、意図通りに動いてい
ます。

つまり、マクロで検索フォルダを選択しているのですが、動作前に検索フォルダ
「A」を選んでいると
「A」→「A」→動作×になり、動作前に検索フォルダ「B」を選んでいると「B」
→「A」→動作○です。

回避策として、フォルダ選択を「A」→「B」→「A」→動作○で、使う事にしてい
ますが………
最近、V5.60βになってから、検索フォルダでマクロが意図通りに動かない事に気づ
きましたので、
ご確認お願いします。

//新着メール位置.mac
//  「B」の検索フォルダのメールを選択していても
//  「A」の検索フォルダの未読メールにフォーカスし、
//  未読メールなければ、「A」の一番下のメールを選択
loaddll "tkinfo.dll";
                        //      検索フォルダの中身の自動無効化を抑止
#n = dllfunc("SetGrepFolderAutoInvalidate", 0 );
//                        //    「B」検索フォルダを選択
//#n = dllfunc("SelectFolder", "", "受信\\B");
                        //      「A」検索フォルダを選択
#n = dllfunc("SelectFolder", "", "受信\\A");
                        //      未読メールにフォーカスし、なければ
#n = dllfunc("NextPrevCustom", "unread", "next", "mail", "over");
                        //      メール一覧を作成し直し
#n = dllfunc("RefreshMailList");
                        //      メール一覧側で、一番下のメールを選択
#n = dllfunc("SetMailIndex", 99999 );
endmacro;               //      マクロを終了

[ ]
RE:39750 検索フォルダでマクロが意図通りNo.39752
秀まるお2 さん 10/12/23 10:41
 
 こちらでマクロをテストしてみた限りでは特にV5.60βになって非互換が起き
てるような気配は無いように思います。そもそもマクロの中でやってるのは
dllfunc関数呼び出しを連続してやってるだけなので、マクロ的にややこしいこ
とは何も無いと思います。

 しいて、最近非互換が発生してるとしたら、秀丸エディタ相当部分の違いのせ
いというよりは、最近の秀丸メールでの修正が関係してるのではないかと思いま
すけども…。その辺ちょっと分かりません。



 それと、そもそもですが、このマクロを実行しても、

    「未読がある場合はそれを選択し、そうでない場合は
     一番下のメールを選択する」

 という風な動作にはならないと思います。

 一番下のメールを選択するというのが、たぶん、

    #n = dllfunc("SetMailIndex", 99999 );

 って所なんだと思いますが、SetMailIndexに渡されたパラメータの数値がメー
ル数以上の場合には、何も選択しないでスルーしてしまいます。

 期待する動作をするマクロを作るとしたら、以下のようにしたらいいんじゃな
いかと思います。

loaddll "tkinfo.dll";
#n = dllfunc("SetGrepFolderAutoInvalidate", 0 );
#n = dllfunc("SelectFolder", "", "受信\\A");
if( dllfunc("GetFolderMailCount", "", "", "unread") == 0 ) {
    //未読が無い場合
    #count = dllfunc("MailCount");
    if( #count > 0 ) {
        #n = dllfunc("SetMailIndex", #count - 1 );
    }
} else {
    //未読がある場合
    if( ! dllfunc("IsUnread") ) {
        //今現在選択してるメールが未読じゃない場合
        #n = dllfunc("DisableDraw");
        #n = dllfunc("SetMailIndex", 0);
        if( ! dllfunc("IsUnread") ) {
            #n = dllfunc("NextPrevCustom", "unread", "next", "mail", "
            ");
        }
        #n = dllfunc("EnableDraw");
    }
}


 あと、RefreshMailList関数呼び出しが必要なのだとしたら、SelectFolderし
た直後に呼び出した方がいいような気がします。

[ ]
RE:39752 検索フォルダでマクロが意図通りNo.39753
hum さん 10/12/23 13:55
 
いつもお世話になります。

>> それと、そもそもですが、このマクロを実行しても、
>
>    「未読がある場合はそれを選択し、そうでない場合は
>     一番下のメールを選択する」
>
> という風な動作にはならないと思います。

> 一番下のメールを選択するというのが、たぶん、
>
>    #n = dllfunc("SetMailIndex", 99999 );
>
> って所なんだと思いますが、SetMailIndexに渡されたパラメータの数値がメー
>ル数以上の場合には、何も選択しないでスルーしてしまいます。
>
> 期待する動作をするマクロを作るとしたら、以下のようにしたらいいんじゃな
>いかと思います。

なるほど、そうでしたか。調査ありがとうございました。
また、マクロ作成までして頂きありがとうございました。

ところで、気になったのは作成頂いたマクロでも、マクロが動く前に「A」の
検索フォルダでメールを選択してマクロが動いた時は、「A」の検索フォルダの
最後に選択していたメールにフォーカスが残り「A」の検索フォルダの一番下の
メールを選択しませんが………そういうもんなんでしょうかぁ?

マクロが動く前に「A」の検索フォルダの最後に選択していたメール
にフォーカスが残る件が最近の秀丸メールでの修正が関係してるのかも
しれないならば、しばらく様子見させて頂きます。

マクロが動く前に「B」の検索フォルダのメールを選択してマクロが動いた時は、
「A」の検索フォルダの一番下のメールを選択するので、マクロが動く前に「A」
の検索フォルダから移動しておけばいいだけですので、割切ります。



そもそも対象の検索フォルダには99999通のメール数以上にもならないので、
現状でも期待する動作はしているので、フォーカスが残る件は気にしない
ことにします………
そうすれば一応、未読メールは選択されますし、未読メールが無い場合も
一番下のメールを選択するし、大勢に影響なしです。

[ ]
RE:39753 検索フォルダでマクロが意図通りNo.39754
秀まるお2 さん 10/12/23 17:51
 
> ところで、気になったのは作成頂いたマクロでも、マクロが動く前に「A」の
> 検索フォルダでメールを選択してマクロが動いた時は、「A」の検索フォルダの
> 最後に選択していたメールにフォーカスが残り「A」の検索フォルダの一番下の
> メールを選択しませんが………そういうもんなんでしょうかぁ?

 既に選択してたメールが未読メールだったらそのままにする、という風なマク
ロにしてしまいました。

 未読メールがある場合は、その未読メールの中での一番先頭のメールを選択さ
せたいということでしたら、以下のようにすればいいと思います。

loaddll "tkinfo.dll";
#n = dllfunc("SetGrepFolderAutoInvalidate", 0 );
#n = dllfunc("SelectFolder", "", "受信\\A");
if( dllfunc("GetFolderMailCount", "", "", "unread") == 0 ) {
    //未読が無い場合
    #count = dllfunc("MailCount");
    if( #count > 0 ) {
        #n = dllfunc("SetMailIndex", #count - 1 );
    }
} else {
    //未読がある場合、一番先頭の未読メールを選択。
    #n = dllfunc("DisableDraw");
    #n = dllfunc("SetMailIndex", 0);
    if( ! dllfunc("IsUnread") ) {
        #n = dllfunc("NextPrevCustom", "unread", "next", "mail", "");
    }
    #n = dllfunc("EnableDraw");
}

[ ]
RE:39754 検索フォルダでマクロが意図通りNo.39756
hum さん 10/12/23 22:52
 

いつもながら素早い対応ありがとうございました。

> 既に選択してたメールが未読メールだったらそのままにする、という風なマク
>ロにしてしまいました。

なるほど、そうでしたか。

> 未読メールがある場合は、その未読メールの中での一番先頭のメールを選択さ
>せたいということでしたら、以下のようにすればいいと思います。

どうも、マクロ修正の面倒までお掛けし、申し訳ありませんでした。
早速差し替えて使ってみましたが、要望が伝わらないようで…すみません。

私の環境では、設定が影響しているのか?既読/未読を切替えて試しましたら、
未読メールはスルーされ、一番下のメールを選択されるという状況でして…

これ以上は、こだわらず別の運用方法を考えてみます。
また機会があれば宜しくお願いいたします。


[ ]
RE:39756 検索フォルダでマクロが意図通りNo.39757
秀まるお2 さん 10/12/24 08:45
 
 ということは、GetFolderMailCount関数が検索フォルダ対象でうまく機能して
ないのかもしれませんが、なぜだかちょっと分からずで…

 とりあえず以下のようなマクロならうまくいくかなぁと思いました。

loaddll "tkinfo.dll";
#n = dllfunc("SetGrepFolderAutoInvalidate", 0 );
#n = dllfunc("SelectFolder", "", "受信\\A");
#n = dllfunc("DisableDraw");
#n = dllfunc("RefreshMailList");
#n = dllfunc("SetMailIndex", 0);
if( ! dllfunc("IsUnread") ) {
    #n = dllfunc("NextPrevCustom", "unread", "down", "mail", "");
    if( #n == 0 ) {
        #n = dllfunc("SetMailIndex", dllfunc("MailCount") - 1 );
    }
}
#n = dllfunc("EnableDraw");

 ダメでしたら、元のマクロのままでもいいのかもしれません。というのは、つ
まり、humさんの所では「全般的な設定・未読メールの閲覧・詳細」の「フォル
ダ切り替え時に選択するメールの指定」が何か適当な設定になっていて、フォル
ダを切り替えることによってうまく期待するメールが選択されているような気が
します。だとしたら、一度Bフォルダを選択してからAフォルダに戻るとうまく
いく、というのは理にかなった話のような気がしました。

[ ]