Q&A-ActiveX編 |
プロセス、スレッドやプロセス間通信に関する質問をまとめました。
実行時にコントロールを非表示にするには
作成した ActiveX コントロールの Enabled が変更できない。(VB5.0 Only)
ActiveX 修正時の関連 EXE の再コンパイルを避けるには
モーダルフォームを表示すると、TABキーの移動ができなくなりますが?
フォームの情報を UserControl に渡すには?
固定サイズのコントロールを作るには?
タイマーコントロールのように、フォームに貼り付けられたコントロールが実行時表示されないようにするにはどうするのか?
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
(注意)
ここでの情報については、あくまでも各自の責任にて、ご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
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
この例を見てわかるように、イベントを発生させるには、RaiseEvent で Event
で定義した関数を呼ぶような形でできます。
(注意)このページの内容は、Visual
Basic6.0(SP3)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。
コモンダイアログのように、「デザイン時にコントロールの大きさが固定されている」ものを作りたいんですが、どうすれば良いのでしょうか?
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)
を対象に記述されています。他のバージョンでは、対応できないこともあるので、ご注意願います。
(注意)
ここでの情報については、あくまでも各自の責任にて、充分にテストを行ってご使用ください。内容に関する質問については、回答できる保証がありませんので、予めご了承願います。