Q&A-ActiveX編

プロセス、スレッドやプロセス間通信に関する質問をまとめました。

実行時にコントロールを非表示にするには
作成した ActiveX コントロールの Enabled が変更できない。(VB5.0 Only)
ActiveX 修正時の関連 EXE の再コンパイルを避けるには
モーダルフォームを表示すると、TABキーの移動ができなくなりますが?
フォームの情報を UserControl に渡すには?
固定サイズのコントロールを作るには?


Q 実行時にコントロールを非表示にするには

タイマーコントロールのように、フォームに貼り付けられたコントロールが実行時表示されないようにするにはどうするのか?

A InvisibleAtRuntime プロパティを True に設定します

作成するコントロールの UserContol の InvisibleAtRuntime プロパティを True に設定します。

(注意)このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q 作成した ActiveX コントロールの Enabled が変更できない。(VB5.0 Only)

作成した ActiveX コントロールを 、モーダルに開くフォーム上に配置し、Enabled を  False に設定しても、画面上の表示が変わりません。対応方法はあるでしょうか?

A API を使用して Enabled を変更します。

この現象は、VB5.0 のバージョンで確認できます。VB6.0では、修正されているようです。
Enabled プロパティに従って、ActiveXコントロール内に配置された コントロールの Enabled を変更する場合、Windows の API 関数 EnableWindow を使用して、有効/無効を切替えます。

まず、標準モジュールに以下の宣言を入れます。

Declare Function EnableWindow Lib "user32" ( _
    ByVal hwnd As Long,
    ByVal fEnable As Long
) As Long

最初の引数は、有効/無効を切替えるコントロールの hWnd プロパティを指定します。2番目の引数は、無効なら0、有効なら1を指定します。
例えば、Enabled プロパティに従って Text1 を有効/無効にするには次のようにします。

Public Property Let Enabled(ByVal New_Enabled As Boolean)
    EnableWindow Text1.hwnd, IIf(New_Enabled, 1, 0)
    PropertyChanged "Enabled"
End Property

(参考)この情報は、マイクロソフト テクニカルサポートの 文書番号: J041834 を参考にして、作成しました。

(注意)このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q ActiveX 修正時の関連 EXE の再コンパイルを避けるには

VBで作成した ActiveX の DLL やコントロールを修正した場合に、DLL やコントロールを使用している EXE を再コンパイルしないと、実行時にエラーになります。これを避ける方法はありますか?

A 「バイナリ互換」を設定します

ActiveX を修正、コンパイルする前に、[プロジェクト]−[XXX のプロパティ]で「コンポーネント」のタグを選択して「バイナリ互換」を選択してください。
但し、関数やイベント等のインターフェイスを変更した場合は、バイナリ互換でコンパイルする事はできません

また、次のような状況でもバイナリ互換でコンパイルする事はできません。


現在 ActiveX を使用しているプログラムが存在している場合。
ActiveX をテストする為に、プロジェクトを追加している場合は、追加したプロジェクトを解放するか、ActiveX のプロジェクトだけを読込んでコンパイルしてください。また、このActiveX を使用している他のプログラムがあってもコンパイルできません。作成した ActiveX を参照している全てのアプリケーションを終了させてください。

ActiveX がエラー等を起こして、メモリ上に残っている場合。

PCを再起動することで回避する事ができます。

(注意)このページの内容は、Visual Basic5.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q モーダルフォームを表示すると、TABキーの移動ができなくなりますが?

モーダルフォールを表示する ActiveX コントロールを作成して。このコントロールを使用するアプリケーションを作成した場合、コントロールのモーダルフォールを表示すると、アプリケーションに戻ってから TABキーの移動ができなくなります。

A EXE 形式になっている場合は発生しません。

この現象は、コンパイルされたOCXを使用したアプリケーションを、開発環境で実行した場合に発生します。
詳細に付いては、Microsoft の以下のサイトを参考にしてください。(1999/3/21 のアドレスです、見つからない場合は、検索で文書番号の J046161  を検索してください)

http://www.microsoft.com/japan/support/kb/articles/j046/1/61.htm


(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q フォームの情報を UserControl に渡すには?

AcitveX コントロール上でフォームを表示しているのですが、フォームで入力された内容を、UserControl の ラベルなどに表示したいのですが、どうすれば良いでしょうか?

A Event を使用して情報が渡せます

フォームから UserControl に情報を設定するには、UserContorl.Test1.Text とか、UserContorl.Label1.Caption といった参照ができれば問題ないのですが、実際にはそのような参照はできません。
では、どうすれば良いかと言えば、Event を フォーム上で定義し、Event を発生させて UserControl で受け取ります。
まず、以下のような定義をフォームで行います。

Event OnSomeMessage(Value As Variant)

OnSomeMessage はイベントの名称、Value As Variant が渡すデータの定義です。
これで、フォームの情報を渡す準備ができました。次に、UserControl 側ですが、以下のような定義を行います。

Private WithEvents mform As Form1

ここで、Form1 は情報を渡す側のフォームのオブジェクト名です。ただし、Event を使用して情報を渡す場合は、この Form1 をそのまま使用することはできません。3番目に指定した mform を使用して、情報を渡します。そこで、mform を作成する必要があります。

Set mform = New Form1
mform.Show vbModal
Set mform = Nothing

最初の1行でフォームの作成をして、最後の1行でフォームの破棄を行ってます。この作成、破棄を UserControl の Initialize や Terminate で行ってもかまいません。真ん中の行は、フォームの表示を行っています。
ここで、UserControl のコードウィンドウ左上にある、オブジェクトのリストを開いてみてください。あーら不思議(^^)さきほど、WithEvents で定義した mform の名前が出てきます。これを選択すると、イベントのリストにフォームで定義した Event の OnSomeMessage が出てきます。これを選択すると、以下のようなコードが作成されます。

Private Sub mform_OnSomeMessage(Value As Variant)

End Sub

これでもう、フォームから UserContorl   にデータが渡せます。さっそくなにか渡してみましょう。
例えば、フォームのボタンが押されたらば、 フォームの Text1 の内容を UserControl のラベルに表示するには、以下のようにします。

・フォーム上の定義

Event OnSomeMessage(Value As Variant)

Private Sub Command1_Click()
    RaiseEvent OnSomeMessage(Text1.Text)
End Sub

・UserControl上の定義

Private WithEvents mform As Form1

Private Sub Command1_Click()
    Set mform = New Form1
    mform.Show vbModal
    Set mform = Nothing
End Sub

Private Sub mform_OnSomeMessage(Value As Variant)
    Label1.Caption = Value
End Sub

この例を見てわかるように、イベントを発生させるには、RaiseEventEvent で定義した関数を呼ぶような形でできます。


(注意)このページの内容は、Visual Basic6.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。

(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。


Q 固定サイズのコントロールを作るには?

コモンダイアログのように、「デザイン時にコントロールの大きさが固定されている」ものを作りたいんですが、どうすれば良いのでしょうか?

A UserControl_Resize イベントでサイズを戻します

UserControl_Resize イベントで、以下の様にすればデザイン時にもサイズが変更できないようになります。一応サイズ変更のドラッグはできますが、ボタンを離せば、元のサイズに戻ります。この動作はコモンダイアログと同じです。

Private Sub UserControl_Resize()
    UserControl.Height = 420
    UserControl.Width = 420
End Sub

注意点として、元に戻すサイズは UserContorl のデザイン時のサイズと同じにしてください。でなければ、UserControl_Resize が再起的に呼び出されスタックオーバフローとなります。これを回避するには、以下のよう方法が安全です。

Private Sub UserControl_Resize()
    Static bFlg As Boolean

    If bFlg Then Exit Sub
    bFlg = True
    UserControl.Height = 420
    UserControl.Width = 420
    bFlg = False
End Sub

(注意)このページの内容は、Visual Basic5.0(SP3)Visual Basic6.0(SP3) を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意) ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。