|
分類:[.NET 全般]
機能追加を依頼されたプログラムが不思議な構造をしております。 主要業務のみVB2008でプログラミングされていて、それ以外の業務はAccessのVBAでプログラミングされています。
このため、以下の通りにVBからAccessのFormを表示しています。
AccObj = GetObject(, "Access.Application") Accessが起動されていないとエラーが発生します。(Err.Number = 429)
Getできた場合は、AccObj.CurrentDB.NameでMDBファイルのパスを取得します。 該当のMDBでない場合、Getしたオブジェクトをメモリ解放し、Getしなかったことにします。 Getできなかった場合、CreateObjectし、OpenCurrentDataBaseでMDBファイルを開きます。
下記でAccessのフォームを開くと、開いたフォームが背面に隠れる場合がありましたので、 SetForegroundWindowでAccess メインウィンドウを最前面にしています。
Call SetForegroundWindow(AccObj.hWndAccessApp) AccObj.Docmd.OpenForm("Form名", 0, , , 1, 3, wArgs)
Accessのフォームを閉じると、AccessのメインフォームでVBのフォーム(呼び出し元)が隠れました ので、下記の対策を行いました。
(1) 自分のプロセスIDを取得しておき、Accessのメインフォームからリターン後にAppActivate GetObjectの前 : Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess() Accessからリターン後 : Interaction.AppActivate(hProcess.Id)
(2) 自分のプログラムのメインフォームのウィンドウハンドルを取得し、SetForegroundWindowを実行
どちらの対策を行ってもAccessのメインフォームは最前面の残ったままになりました。
Me.TopMostを一時的にTrueにしてみたところ、Accessのメインフォームは背面に移動しました。 Me.TopMost = True Me.TopMost = False
「は?」って感じで、何かきつねにつままれた様な気持ちです。
今のところ問題は起きていませんが、本当にこの対策で問題はないのでしょうか? すごく不安です。
どなたか、ご意見をお願いします。
VB2008、Access2003を使用しています。
|