DisableDrawしているのに描画されてしまうNo.42212
虎鉄 さん 12/02/12 19:17
 

以下のマクロを実行すると、実行中はメール内容枠の中身が見えなくなってしまいま
す。
これを回避するにはどのように対処したらよろしいでしょうか?

実現したい事は、指定のフォルダ内のある条件のメールを検索し、
そのメールに対して処理をするという事です。
---------------------------------
Windwos XP Home Edition
秀丸メール Ver.5.72beta40
枠のレイアウト:3枠区切り

=======================================================================
loaddll "TKInfo.dll";
if (!result) endmacro;

$current_folder = dllfuncstr("CurrentFolder");
$target_folder  = "受信";
if ($current_folder == $target_folder) $target_folder = "草稿";
#n = dllfunc("DisableDraw",  1);
#n = dllfunc("SelectFolder", "", $target_folder);

#n = dllfunc("SetFindPack", "(\"TEST\", target=subject, regular)");
#n = dllfunc("FindDown");
sleep 1000; // 処理に時間が掛かる

#n = dllfunc("SelectFolder", "", $current_folder);
#n = dllfunc("EnableDraw");
endmacro;
=======================================================================

[ ]
RE:42212 DisableDrawしているのに描画さNo.42215
秀まるお2 さん 12/02/12 22:55
 
 DisableDrawしてる最中にウィンドウの中の様子が見えないのは、これはこれ
で仕様ってことになります。逆に見えてしまったらDisableDrawの意味が無いの
で。

 しいて、見たい所で見えるようにってことでしたら、その部分の直前でまた
EnableDrawすればいいんじゃないかと思います。

> #n = dllfunc("SetFindPack", "(\"TEST\", target=subject, regular)");
> #n = dllfunc("FindDown");

 ここのSetFindPackとFindDownの間にEnableDrawを入れればいいんじゃないで
しょうか。

 (実際にマクロを動かしてテストした訳では無いですが)

[ ]
RE:42215 DisableDrawしているのに描画さNo.42216
秀まるお2 さん 12/02/13 14:42
 
 今さらすみませんが、タイトルを見たら、「DisableDrawしてるのに描画され
てしまう」という件でした。

 現象を逆だと勘違いしてしまいました。

 今からマクロによる再現テストをしてみます。

[ ]
RE:42216 DisableDrawしているのに描画さNo.42217
秀まるお2 さん 12/02/13 14:58
 
 テストしてみました。

 結果、やはり、DisableDrawしてる最中はメール内容枠は書き換えされないと
いう、仕様通りのような気がします。

 マクロを、例えば

loaddll "TKInfo.dll";
if (!result) endmacro;

$current_folder = dllfuncstr("CurrentFolder");
$target_folder  = "受信";
if ($current_folder == $target_folder) $target_folder = "草稿";
#n = dllfunc("DisableDraw",  1);
#n = dllfunc("SelectFolder", "", $target_folder);

#n = dllfunc("SetFindPack", "(\"TEST\", target=subject, regular)");
#n = dllfunc("FindDown");
#n = dllfunc("BeginEditMail");
if( readonly ) readonlyswitch;
if( browsemode ) browsemodeswitch;
gofiletop;
while( #i < 5 ) {
    insert "A";
    message "書き換えます。";
    #i = #i + 1;
}
#n = dllfunc("CancelEditMail");
#n = dllfunc("SelectFolder", "", $current_folder);
#n = dllfunc("EnableDraw");
endmacro;

 のようにメールを書き換える例にしてみたんですけど、たしかに「書き換えま
す」が出てOKを押してもメール内容枠の中身は描画されないです。

 FindDownの直後にEnableDrawを呼び出すようにすれば書き換えてる様子が見え
るようになります。

 ということで、特に秀丸メールの動作がおかしいってことは無くて、仕様通り
動いてるように思います。

[ ]
RE:42217 DisableDrawしているのに描画さNo.42218
虎鉄 さん 12/02/13 18:51
 
テストしていただき、ありがとうございます。

こちらでも、ご呈示頂いたマクロを試してみましたが、「書き換えます」と
出た時には既に、メールの内容が見えなくなっていました。

「描画」の定義が曖昧なので、改めて現象を書いてみたいと思います。
説明がうまくないので、ちゃんと伝わるか自信が無いですが。。。

希望の動作としては、メールを読んでいる最中にマクロが動いても、
メールを読み続けたいと言う事なのですが、実際は、読んでいるメールが
見えなくなります。
これを、中身のないウィンドウが描画されるという意味で「描画されてしまう」
として使っていました。

どうも「SelectFolder」した時点で、中身が消えてしまうようなのですがいかがでし
ょう?
「SelectFolder」した時に、たまたま選択されているメールが添付ファイル付きだと、
中身のない
添付ファイル枠(?)も描画されます。

一応行った手順を書きますと、

・受信フォルダを選択し、その中の添付ファイル付きのメールを選択
・受信フォルダ以外のフォルダを選択し、その中の適当なメールを選択
 (添付ファイル無しのメール)
・マクロを実行

 ・メッセージボックスに「B」が表示された時点で、メール内容が見えなくなり、
  添付ファイル枠(?)が描画されます。
 ・メッセージボックスに「C」が表示された時点で、添付ファイル枠(?)が
  消えます。

申し訳ありませんが、ご検討よろしくお願いいたします。

※マクロをもうちょっと簡単なものに書き換えました。
=======================================================================
loaddll "TKInfo.dll";
if (!result) endmacro;

$current_folder = dllfuncstr("CurrentFolder");
$target_folder  = "受信";
if ($current_folder == $target_folder) $target_folder = "草稿";
#n = dllfunc("DisableDraw",  1);
message ("A");
#n = dllfunc("SelectFolder", "", $target_folder);
message ("B");
#n = dllfunc("SelectFolder", "", $current_folder);
message ("C");
#n = dllfunc("EnableDraw");

endmacro;
=======================================================================

[ ]
RE:42218 DisableDrawしているのに描画さNo.42219
秀まるお2 さん 12/02/13 21:58
 
 DisableDrawしてても、実は完全に画面の書き換えを抑止することは出来なく
て、添付ファイル付きメールを選択した時にその枠だけが出てくるとか、ある程
度画面の書き換えが発生してしまうっていのうはあります。

 完全に画面の書き換えをしないようにってのは現状不可能です。

> 希望の動作としては、メールを読んでいる最中にマクロが動いても、
> メールを読み続けたいと言う事なのですが、実際は、読んでいるメールが
> 見えなくなります。

 マクロが「動く」というのは、つまり、自分で「マクロを実行」て指示して
「動かした」じゃなくて、例えば定期受信が裏で動いて、勝手にマクロが自動起
動した場合って意味ですかね?

 つまり、ご自身が秀丸メールでメールを閲覧している最中に裏でマクロが動い
ても、それまで見てるメールはずっと表示したままで、マクロはマクロで勝手に
見えない所で動いて欲しいとか…。

 だとしたら、すみませんがはそれは不可能です。

 例えばですが、添付ファイル付きメールを選択したりすると、それによって添
付ファイルの枠を表示しようとしたりしまして、結果、ウィンドウのサイズ変更
が発生します。そうすると、どうしてもウィンドウの中身を再描画する必要が出
てきます。その時に、DisableDrawしてる場合はウィンドウの中身を真っ白で塗
りつぶすといった処理が実行されてしまいます。

 それの他に、時間のかかる処理をするとウィンドウが真っ白になってしまった
りってこともあると思いますが、それについてはdisablebreakって命令をマクロ
の先頭で実行してやれば、ある程度回避可能かと思います。

 とりあえず、現状では、定期受信などでマクロが自動で動いた場合、その
マクロが動いてる最中はちょっとがまんして待っていただく必要があります。そ
れだけは(秀丸メールの本体ウィンドウが1つしか無い以上)どうしようも無い
です。

[ ]
RE:42219 DisableDrawしているのに描画さNo.42226
虎鉄 さん 12/02/14 20:14
 
> それまで見てるメールはずっと表示したままで、マクロはマクロで勝手に
> 見えない所で動いて欲しいとか…。

「マクロをバックグラウンドで動かす」的な事をしたいと思い、色々と試していまし
た。
今回、メール本体ウィンドウではそれが不可能だという事が分かりましたので、
とりあえずは、エディタウィンドウでメールを読むスタイルに変えて様子を見てみよ
うと思います。

ちなみに、少し話がずれてしまいますが、「検索して一覧作成」について、現在は

〜「検索して一覧作成」の結果ウィンドウの中をマクロで参照することはできません。


となっていますが、これを可能にするという事は難しいですか?
もし、難しいようであればこれで終わりにします。


サポートありがとうございました。

[ ]
RE:42226 DisableDrawしているのに描画さNo.42229
秀まるお2 さん 12/02/14 22:59
 
 検索結果のウィンドウ上でマクロを動かすことは、条件付きで出来ることは出
来ます。

 条件としては、マクロの実行開始自体が検索結果上でなら、ということになり
ます。

 秀丸メール本体やエディタ・ウィンドウ上でマクロ実行を指示した場合には、
マクロ実行を検索結果ウィンドウ上に移動させることは出来ないです。

 例えば、

loaddll "TKInfo.dll";
#n = dllfunc("SetFindPack", "(\"abc\", target=all), inmail=0" );
#n = dllfunc("DoGrep", dllfuncstr("CurrentAccount"), "受信");
message "a";

 みたいなマクロを実行すると、"a"のメッセージ表示は秀丸メール本体
ウィンドウ上で実行されてしまいます。

 「検索して一覧作成」を実行して、結果として出てきたウィンドウ上でマクロ
実行させるには、「マクロ・マクロ登録...」の「検索結果の一覧」の所で適当
に設定をすればいいです。それでキーボード操作によってマクロ実行を指示する
ことは出来ます。

 現状そんな風になってます。



 他の作戦として、秀丸メール本体ウィンドウ上でのメール閲覧と並行して、裏
で何かしするとしたらですが…。例えば緒方聡さん作のhidebiffの場合だと、秀
丸メールの出力する「振り分けログ」を見て、それからメール用ファイルを独自
にアクセスしてって動作をしてるようです。

 そういう感じのプログラム(exeファイルとか?)を別途作って、それを受信
後にマクロから起動させて裏で処理させるとかってことは可能かと思います。た
だ、そんなプログラムを独自に作るとなると、技術的ハードルはかなり高いかと
思います。

[ ]
RE:42229 DisableDrawしているのに描画さNo.42241
虎鉄 さん 12/02/15 20:47
 
>  検索結果のウィンドウ上でマクロを動かすことは、条件付きで出来ることは出
> 来ます。

この条件で、やりたい事が実現できるか、色々と検討してみようと思います。
アドバイスありがとうございました。

また「hidebiff」というのを探して、マニュアルを読んでみましたが、外部からアク
セスするっていう
方法もあるんですね。目から鱗でした。
プログラムを作成するスキルがないので、実現は難しいと思いますし、出来たとして
も、自分の場合は、
ファイルに直接アクセスして、ファイルを壊してしまう可能性も有りますので、
もう少し力をつけてから挑戦してみたいと思います。

[ ]