Attachment型(添付ファイル型)も、このように扱ってくると色々と深い所が見えてきます。
個人的にはそれを扱うためのコントロールが力不足じゃないとか思っているのですが、今回はそれを補完する形で。
まずは前回のPostでOpenボタンを作ったけど、ファイルをどうやって開くって事に関してです。
リストボックス(実際はコンボボックス使ってます)に添付ファイル名を列挙したり、添付ファイルの数を表示する事は、標準のAttachment Controlのプロパティを参照する事で出来ました。
ですがそれ以外のファイルを開く・保存するようなメゾッド/プロパティをコントロールが持っていない為に、そのままではAttachment ControlのManagementダイアログを介しての操作しか出来ません。
そこでコード(VBA)で何とかしようという話ですが、コントロールにそれらのメゾッド/プロパティが無い以上、コントロールには何一つ頼れません。ですのでRecordsetを直接扱う必要が出てきます。
そして今回のAccessの更新で重要な事にDAO(Data Access Object)がバージョンアップしているという事があります。この拡張されたDAOの機能を使うことでAccess2007は添付ファイルなり複数値データを扱えるようになっているのです。(DAOのバージョンアップの扱いに関しては別Postで書きます。)
実はAttachment型(添付ファイル型)のフィールドにはRecordsetが値として入っているのです。テキストや数値などではなく、Object的にRecordsetがValueとして入る/入っています。
ですので、当該FieldのValueをRecordsetとして扱い、後は今回追加されたメゾッドあるFieldオブジェクトのSaveToFileメゾッドを使いファイルを保存する事が出来ます。(ファイルを開くは、指定ファイルに保存さえ出来れば、特に問題なく従来と同様の方法で可能です。)
具体的なコードはこんな感じです。
ファイルに保存先に使ったTemporaryディレクトリを取得する為に、Microsoft Scripting Runtimeに含まれるFileSystemObjectと、ファイルを関連付けられたアプリケーションから開く為にWindows APIのShellExecute()を使っていますが、基本的に難しい事はしていません。
FormにバインドされているMailsテーブルのRecordsetは常に現在扱っている/表示しているレコードにカーソルがありますから、そのレコードの添付ファイルが格納されているattachments FieldのValueをRecordset2型のオブジェクト変数であるrAttachmentsに代入しています。(参照をセット)
後はその添付ファイルの入っているRecordsetのカーソル位置をリストボックスで選ばれた物と同期させて、FileData Field(ファイルの中身がバイナリで入っている)を新メゾッドであるSaveToFileでファイルに保存しています。
このSaveToFileメゾッドですが、VBAでコード書いてる時に自動的にIntelliSense(インテリセンス- プロパティとかメゾッドの候補を表示してくる)には出てきませんが、気にせずに使ってください。
大体こんな感じでファイルを開く機能は実現できました。実際には一時ファイルフォルダにZ存されたファイルは放置されてしまうので消したりとかする方法を考慮しなくていけないのですが・・。Attachment Controlの管理ダイアログボックスから開くと、一時ファイルはインターネット一時ファイルフォルダ(Temporary Internet File)に保存され、またダイアログボックス自体がモーダルで表示されるので、削除や告知したり出来ていますし。
次はバージョンアップされたDAOに関してとRecordset2などのオブジェクト、そしてAttachment型のレコードセットに関しては書く予定です。
関連のありそうな記事 |
0 コメント:
コメントを投稿