2003-02-18 130462 [長年日記]

遅延フォルダ選択

時々話題になっていた遅延フォルダ選択の問題を。これは、たとえばフォルダビューでフォルダをキーボードで選択した直後にフォルダのプロパティを表示させると、前に選択していたフォルダのプロパティが開いてしまうというような問題です。

代々、フォルダビューのツリービューのイベントを受け取ったときにタイマをかまして遅延させていたのですが、このタイミングでは遅延させず、フォルダモデルを更新し、そのフォルダモデルからイベントを受け取った側で遅延させることにしました。

.folders

最後までXMLになっていなかった.foldersもXML化しました。スキーマ(in RELAX NG Compact Syntax)と、サンプル

BASP21

COMインターフェイスからメッセージのコンテンツをそのままバイト列で返すプロパティを公開したものの、FileSystemObjectはバイナリはサポートしていなくて使い道がないなぁと思っていたのですが、BASP21というコンポーネントを使うととりあえずファイルに出力するのは出来ました。

set account = document.accounts("test")
set folder = account.folders("Inbox")
set mh = folder.messages(0)
set message = mh.message
content = message.content
 
set basp = CreateObject("basp21")
basp.BinaryWrite content, "d:\temp\test.msg"

ちなみにバイナリは、VT_UI1のSAFEARRAYを作ってデータをコピーして、VARIANTにVT_UI1|VT_ARRAYでセットしておくとちゃんと扱えるみたいです。SAFEARRAYを直接だとどうも上手く受け渡しが出来ないみたいなのですが、Dispatch互換型でバイナリを扱うときの作法なんでしょうね。

Uuencode

メッセージの本文中に埋め込まれているUuencodeをデコードしたいという要望を以前から頂いていて、本体でサポートするのはあんまり美しくないなぁと思っていたのですが、スクリプト側でサポートするというのはどうだろうと思っています。

ADODB.Stream

バイナリファイルはこれを使っても出来るようです。ADOが入っていないとダメですが。今度はJScriptで。

var account = document.accounts("test");
var folder = account.folders("Inbox");
var mh = folder.messages(3);
var message = mh.message;
var content = message.content;
 
var stream = new ActiveXObject("ADODB.Stream");
stream.Open();
stream.Type = 1/*adTypeBinary*/;
stream.Write(content);
stream.SaveToFile("d:\\temp\\test.msg",
  2/*adSaveCreateOverWrite*/);

ちなみに、SaveToFileの二番目の引数には、ビット和が渡せるとドキュメントには書いてありますが、3を渡すとエラーになります。