検索結果一覧のソートNo.37252
twk さん 09/11/03 16:48
 
いつもお世話になっています。

DoGrepにより作成される検索結果一覧のウィンドウに対して
ソート方法をマクロで指定する方法はありますでしょうか。
どなたかご存じの方がいらっしゃったら
教えていただけませんでしょうか。
よろしくお願いいたします。

[ ]
RE:37252 検索結果一覧のソートNo.37253
秀まるお2 さん 09/11/04 10:17
 
 現状、検索結果のウィンドウでソート方法をマクロからコントロールすること
は出来ないです。

 SetSortMethodという関数があるんですが、検索結果には働いてくれてないで
す。

 次のβ版以降から、ちゃんと検索結果ウィンドウ上で効くように修正させてい
ただきます。

 現状でなんとかするとしたら、DoGrepを実行する前にレジストリのSortByGrep
というDWORD値を書き換えてEnvChanged関数呼び出す、ということで一応ソート
方法をコントロール出来るかなぁと思いますけども、ちょっと難しいのであまり
おすすめしないです。(具体的にどういう値を書き込めばいいかの関係もややこ
しいし)

[ ]
RE:37253 検索結果一覧のソートNo.37265
twk さん 09/11/04 23:37
 
回答頂きありがとうございます。

> SetSortMethodという関数があるんですが、検索結果には働いてくれてないで
>す。

どうにかしたら働いてくれないかと色々試していたのですが、やっぱり無理でしたか。

> 次のβ版以降から、ちゃんと検索結果ウィンドウ上で効くように修正させてい
>ただきます。

早速対応頂きありがとうございます。
楽しみに待っています。

> 現状でなんとかするとしたら、DoGrepを実行する前にレジストリのSortByGrep
>というDWORD値を書き換えてEnvChanged関数呼び出す、ということで一応ソート
>方法をコントロール出来るかなぁと思いますけども、ちょっと難しいのであまり
>おすすめしないです。(具体的にどういう値を書き込めばいいかの関係もややこ
>しいし)

提案ありがとうございます。
こちらも参考にさせて頂きます。

[ ]
RE:37265 検索結果一覧のソートNo.37277
秀まるお2 さん 09/11/06 11:08
 
 ちなみにV5.27β2にて、この修正(SetSortMethodが検索結果にも効くように
する修正)が入ってしまってるはずなので、もしよかったらそちらを試していた
だくといいかもしれません。

[ ]
RE:37277 検索結果一覧のソートNo.37288
twk さん 09/11/06 22:49
 
V5.27β2を試してみました。
検索結果ウィンドウからのマクロ実行でSetSortMethodが
効くようになりました。
早速の修正ありがとうございました。

ただ、本体ウィンドウ上のマクロでDoGrep実行し、
生成された検索結果ウィンドウに対してSetSortMethodを
動作させたいのですが、マクロの実行元を検索結果ウィンドウに
切り替えるための方法が見つけられませんでした。

これについてはどのような手段を用いればよろしいのでしょうか。

[ ]
RE:37288 検索結果一覧のソートNo.37293
秀まるお2 さん 09/11/09 17:36
 
 すみません。返事忘れてました。

> マクロの実行元を検索結果ウィンドウに
> 切り替えるための方法が見つけられませんでした。

 その方法は存在しないと思います。(たぶん)

 SetMainWndTop関数みたいな感じで検索結果ウィンドウにマクロ実行を移動さ
せる関数を次のβ版に追加させていただきます。

 SetGrepWndTop関数と、あと、GrepWnd関数も追加します。
 (うまくいけばですが)

[ ]
RE:37293 検索結果一覧のソートNo.37295
twk さん 09/11/09 22:04
 
> SetGrepWndTop関数と、あと、GrepWnd関数も追加します。
> (うまくいけばですが)

たびたび申し訳ありません。
よろしくお願いします。

[ ]
RE:37293 検索結果一覧のソートNo.37326
twk さん 09/11/16 22:27
 
> SetGrepWndTop関数と、あと、GrepWnd関数も追加します。
> (うまくいけばですが)

関数を追加頂きありがとうございます。
Ver. 5.30beta3のマクロヘルプに関数が追加されていましたので、
早速試してみました。

下記のようなマクロを作成して実行したところ、

loaddll "TKInfo.dll";
$account = dllfuncstr("CurrentAccount");
$folder  = dllfuncstr("CurrentFolder");
#n = dllfunc("SetFindPack", "flag=transmit=2009/11-2009/11, subfolder=1");
#n = dllfunc("DoGrep", $account, $folder);
#n = dllfunc("SetGrepWndTop");
#n = dllfunc("SetSortMethod", 7);

「マクロのウィンドウ間切り替えに失敗しました。
 マクロの実行を中断します。」
との表示が出てウィンドウ間の切り替えができませんでした。

ちなみに、その状態から再度マクロを実行させようとした場合には、
「他の秀丸メール内エディタ(または秀丸メール本体)が
 マクロ実行中です。秀丸メール内でのマクロの並行動作は
 できません。」
との表示が出て秀丸メールを再起動させないとマクロが実行できない
状態になります。

このような状態になるのは当方の環境だけでしょうか。
確認事項等ございましたら、ご指摘いただけないでしょうか。

[ ]
RE:37326 検索結果一覧のソートNo.37327
秀まるお2 さん 09/11/17 09:16
 
 僕のWindowsXPマシンとWindows Vista 64bitのテストマシンでテストした限り
はマクロはうまく動作しているようでした。


 ただ、マクロの最後に

    message "A";

 という文を入れてみたところ、なぜかそれが秀丸メール本体上で実行されてし
まう現象が起きてしまいました。ということで、何かおかしい点があるようです。
その辺調査して修正させていただきます。その結果としてtwk様のところでおか
しい現象も直るかなぁと思います。

> 確認事項等ございましたら、ご指摘いただけないでしょうか。

 もしかしたらですが、検索結果ウィンドウの中にある「内容表示」のオプショ
ンがOFFの場合に限ってうまく動かないって話かもしれません。そこのオプショ
ンをONにしてからマクロ実行すると直るかもしれないです。

[ ]
RE:37327 検索結果一覧のソートNo.37328
秀まるお2 さん 09/11/17 10:11
 
 検索結果ウィンドウの「内容の表示」がOFFだとmessage "A";のメッセージが
秀丸メール本体上に出てきてしまうバグの方は直せました。

 「内容の表示」がONになっていればうまく動くと思いますがどうでしょ?。も
しそれでもダメだとしたら、何か別のバグがあるということで調べてみます。

[ ]
RE:37328 検索結果一覧のソートNo.37336
twk さん 09/11/18 00:30
 
早速、調査頂きありがとうございます。

> 「内容の表示」がONになっていればうまく動くと思いますがどうでしょ?。も
>しそれでもダメだとしたら、何か別のバグがあるということで調べてみます。

試してみたところ、「内容の表示」がONの場合には問題なく動作することが確認でき
ましたので、原因はご推察の通りかと思います。
遅くなりましたが、ご報告致します。

[ ]
RE:37336 検索結果一覧のソートNo.37337
秀まるお2 さん 09/11/18 12:17
 
 確認ありがとうございます。ということでさっそく問題のバグ修正をして
V5.30β4としてアップロードさせていただきました。

 これで「内容の表示」がOFFの場合でもうまくいくはずだと思います。

 (こちらでは一応問題の症状までは再現してないので一抹の不安はあります
が)

 ということでお願いします。

http://hide.maruo.co.jp/software/bin2/hmmail530b4_signed.exe

[ ]
RE:37337 検索結果一覧のソートNo.37348
twk さん 09/11/19 23:44
 
遅くなりましたが、V5.30β4で試してみました。
「内容の表示」をONにするか、枠のレイアウトを「3枠区切り」にすると、
テスト用マクロでウィンドウ間切り替えに失敗することは無いないようです。

しかし、「内容の表示」をOFF、枠のレイアウトを「2枠区切り」とした状態で
テスト用マクロを実行すると、ウィンドウ間切り替えに失敗します。
1台のPCでは常に失敗しましたが、別のPCでは以下の作業をすると失敗しました。

1. テスト用マクロを実行し検索一覧ウィンドウを表示する
2. 検索一覧ウィンドウを残したままフォーカスをメインウィンドウに移す
3. テスト用マクロを再度実行

PCはどちらもXP 32bit です。
以上、ご報告致します。

ところで、手動で検索一覧を実行するときのソート設定を事前に指定しておきたい
と思うのですが、検索一覧ウィンドウが存在しない状態でソート設定だけをマクロで
指定するようにはできないでしょうか。
ご検討頂ければうれしいです。

[ ]
RE:37348 検索結果一覧のソートNo.37351
秀まるお2 さん 09/11/20 10:35
 
> しかし、「内容の表示」をOFF、枠のレイアウトを「2枠区切り」とした状態で
> テスト用マクロを実行すると、ウィンドウ間切り替えに失敗します。

 テストしてみたら再現しました。たしかに「ウィンドウ間切り替えに失敗」の
エラーまで再現出来ました。

 ということで情報ありがとうございます。

 今度こそ修正させていただきます。

> ところで、手動で検索一覧を実行するときのソート設定を事前に指定しておきたい
> と思うのですが、検索一覧ウィンドウが存在しない状態でソート設定だけをマクロで
> 指定するようにはできないでしょうか。

 たしかにそういうことが出来た方がマクロもシンプルでよかったと思いますが、
実はその方法がありました。最初にそういうアイデアを書かせていただければよ
かったんですが、気づきませんでした。失礼しました。

 やり方としては、以下のように、SaveConfigしてからレジストリの
"SortByGrep"を書き換えて、その後EnvChangedDanger関数でパラメータに数値の
1を指定する、という手順になります。

---------------------------------------------------------------------------
loaddll "TKInfo.dll";

#n = dllfunc("SaveConfig", 0);
openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
writeregnum "SortByGrep", 0x50007;
closereg;
#n = dllfunc("EnvChangedDanger", 1);

$account = dllfuncstr("CurrentAccount");
$folder  = dllfuncstr("CurrentFolder");
#n = dllfunc("SetFindPack", "flag=transmit=2009/11-2009/11, subfolder=1");
#n = dllfunc("DoGrep", $account, $folder);
---------------------------------------------------------------------------

 "SortByGrep"のDWORD値に指定する値は「フォルダ順ソート」の場合なら上記
の0x5007ですが、他の値も必要でしたら、以下のマクロで調べることが出来ます。

---------------------------------------------------------------------------
loaddll "tkinfo.dll";
#n = dllfunc("SaveConfig", 0);
openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config";
#sort = getregnum( "SortByGrep" );
closereg;
message "0x" + hex(#sort);
---------------------------------------------------------------------------

 上記マクロを実行する前に、まず検索結果一覧を表示させてソート方法を指定
し、それから秀丸メール本体上でマクロ実行すると出てきます。

 という方法でなんとかお願いします。

 バグ修正の方ももちろんやります。

[ ]
RE:37351 検索結果一覧のソートNo.37358
twk さん 09/11/21 01:07
 
> テストしてみたら再現しました。たしかに「ウィンドウ間切り替えに失敗」の
>エラーまで再現出来ました。
>
> ということで情報ありがとうございます。
>
> 今度こそ修正させていただきます。

情報が提供できて良かったです。
修正、よろしくお願い致します。

>  やり方としては、以下のように、SaveConfigしてからレジストリの
> "SortByGrep"を書き換えて、その後EnvChangedDanger関数でパラメータに数値の
> 1を指定する、という手順になります。

提案頂いた方法で対応したいと思います。

>  "SortByGrep"のDWORD値に指定する値は「フォルダ順ソート」の場合なら上記
> の0x5007ですが、他の値も必要でしたら、以下のマクロで調べることが出来ます。

"SortByGrep"のDWORD値を調べてみたのですが、下位の値はSortMethod関数の返値に
対応するようですが、
上位の値がソート条件を換えながら試していると変わることがあります。
上位の値にはどのような意味があるのでしょうか。
ちなみに当方で「フォルダ順ソート」で調べた場合の結果は、
0x20007, 0x40007, 0x50007などでした。


[ ]
RE:37358 検索結果一覧のソートNo.37360
秀まるお2 さん 09/11/21 12:29
 
> 上位の値にはどのような意味があるのでしょうか。

 説明を省略してしまいましたが、実はソート方法というのは2段階になってま
す。

 例えば「送受信日付」の順で一度ソートさせてから次に「フォルダ」の順で
ソートさせると、第1優先順位のソート方法がフォルダ順になって、第2優先順
位のソート方法が送受信日付順になります。

 その場合、例えばフォルダが同じメールについては送受信日付順でソートされ
る形になります。

 画面上では第2優先順位のソート方法が何になってるか分かりませんが、内部
的にはそういう処理がされてます。

 それで、SortByGrepの上位16ビットは、その第2優先順位のソート方法が入り
ます。

[ ]
RE:37360 検索結果一覧のソートNo.37364
twk さん 09/11/21 22:23
 
ご説明ありがとうございます。

> それで、SortByGrepの上位16ビットは、その第2優先順位のソート方法が入り
>ます。

確認できました。第2優先はソート方法を+1した値で表しているのですね。

また、教えて頂いたSortByGrepで指定する方法を試してみました。
マクロ的に非常に使いやすい動作になりますね。
ありがとうございました。

[ ]
RE:37364 検索結果一覧のソートNo.37366
秀まるお2 さん 09/11/22 13:41
 
> 確認できました。第2優先はソート方法を+1した値で表しているのですね。

 ソート方法の値は、ソート種類について拡張しつつもレジストリ上の互換性を
維持するために、かなりややこしい値構造になってます。なので実際にどういう
ソート順ならどういう値になるか、レジストリを見て確認していただかないと難
しいです。

 参考ソースコード:

enum SORTBY {
    SORTBY_ICON,
    SORTBY_SUBJECT,
    SORTBY_SENDER,
    SORTBY_DATE,
    SORTBY_TRANSMIT,
    SORTBY_SIZE,
    SORTBY_EXTRA,
    SORTBY_FOLDER,
    SORTBY_SUBJECT2,
    SORTBY_SUBJECT3,
    SORTBY_SENDER2,             // メールアドレスの@以降部分を使ってソート。
    SORTBY_COLOR,               // 色でソート
    SORTBY_TIMESTAMP,           //V4.72β2
    SORTBY_MEMO,                //V4.74β1
    SORTBY_BOOKNOTE1,           //V4.80β3
    SORTBY_BOOKNOTE2,           //V4.80β3
    SORTBY_BOOKNOTE3,           //V4.80β3
    SORTBY_RESERVE5,
    SORTBY_RESERVE6,
    SORTBY_RESERVE7,
    SORTBY_RESERVE8,
    SORTBY_RESERVE9,
    SORTBY_RESERVE10,
    SORTBY_RESERVE11,
    SORTBY_RESERVE12,
    SORTBY_RESERVE13,
    SORTBY_RESERVE14,
    SORTBY_RESERVE15,
    SORTBY_RESERVE16,
    SORTBY_RESERVE17,
    SORTBY_RESERVE18,
    SORTBY_RESERVE19,
    SORTBY_RESERVE20,
    SORTBY_RESERVE21,
    SORTBY_RESERVE22,
    SORTBY_RESERVE23,
    SORTBY_RESERVE24,
    SORTBY_RESERVE25,
    SORTBY_RESERVE26,
    SORTBY_RESERVE27,
    SORTBY_RESERVE28,
    SORTBY_RESERVE29,
    SORTBY_ICON_REVERSE,
    SORTBY_SUBJECT_REVERSE,
    SORTBY_SENDER_REVERSE,
    SORTBY_DATE_REVERSE,
    SORTBY_TRANSMIT_REVERSE,
    SORTBY_SIZE_REVERSE,
    SORTBY_EXTRA_REVERSE,
    SORTBY_FOLDER_REVERSE,
    SORTBY_SUBJECT2_REVERSE,
    SORTBY_SUBJECT3_REVERSE,
    SORTBY_SENDER2_REVERSE,
    SORTBY_COLOR_REVERSE,
    SORTBY_TIMESTAMP_REVERSE,           //V4.72β2
    SORTBY_MEMO_REVERSE,                //V4.74β1
    SORTBY_BOOKNOTE1_REVERSE,           //V4.80β3
    SORTBY_BOOKNOTE2_REVERSE,           //V4.80β3
    SORTBY_BOOKNOTE3_REVERSE,           //V4.80β3
    SORTBY_RESERVE5_REVERSE,
    SORTBY_RESERVE6_REVERSE,
    SORTBY_RESERVE7_REVERSE,
    SORTBY_RESERVE8_REVERSE,
    SORTBY_RESERVE9_REVERSE,
    SORTBY_RESERVE10_REVERSE,
    SORTBY_RESERVE11_REVERSE,
    SORTBY_RESERVE12_REVERSE,
    SORTBY_RESERVE13_REVERSE,
    SORTBY_RESERVE14_REVERSE,
    SORTBY_RESERVE15_REVERSE,
    SORTBY_RESERVE16_REVERSE,
    SORTBY_RESERVE17_REVERSE,
    SORTBY_RESERVE18_REVERSE,
    SORTBY_RESERVE19_REVERSE,
    SORTBY_RESERVE20_REVERSE,
    SORTBY_RESERVE21_REVERSE,
    SORTBY_RESERVE22_REVERSE,
    SORTBY_RESERVE23_REVERSE,
    SORTBY_RESERVE24_REVERSE,
    SORTBY_RESERVE25_REVERSE,
    SORTBY_RESERVE26_REVERSE,
    SORTBY_RESERVE27_REVERSE,
    SORTBY_RESERVE28_REVERSE,
    SORTBY_RESERVE29_REVERSE,
};

#define SORTBY_COUNT_OLD    24
#define SORTBY_HALF_COUNT_OLD   12


#define SORTBY_COUNT    84
#define SORTBY_HALF_COUNT   42


int SMALLENT SaveSortbyToOldStyle( SORTBY sortby ) {
    int n;
    if( sortby >= SORTBY_HALF_COUNT_OLD ) {
        if( sortby >= SORTBY_HALF_COUNT ) {
            if( sortby >= SORTBY_TIMESTAMP_REVERSE ) {
                n = 128 + sortby;
            } else {
                n = sortby - SORTBY_HALF_COUNT + SORTBY_HALF_COUNT_OLD;
            }
        } else {
            n = 128 + sortby;
        }
    } else {
        n = sortby;
    }
    return n;
}

SORTBY SMALLENT LoadSortbyFromOldStyle( int n ) {
    SORTBY  sortby;
    if( n  < SORTBY_HALF_COUNT_OLD ) {
        sortby = (SORTBY)n;
    } else if( n >= 128 ) {
        sortby = (SORTBY)( n - 128 );
    } else {
        sortby = (SORTBY)( n - SORTBY_HALF_COUNT_OLD + SORTBY_HALF_COUNT );
    }
    return sortby;
}

[ ]
RE:37366 検索結果一覧のソートNo.37369
twk さん 09/11/22 21:18
 
ソートについての解説ありがとうございます。
参考にさせて頂きます。

[ ]
RE:37366 検索結果一覧のソートNo.37390
twk さん 09/11/25 00:53
 
早速、V5.30β5で試してみました。
従来問題の起きていた環境で異常なく動作することが確認できました。
ありがとうございました。

[ ]