会社行きたくなかったんです。

自由になりたくて会社辞めました

OCX ActiveX

VB.netでOCXコントロールを複数のフォームで共有する方法

投稿日:

OCXとActiveXの違いもよくわかっていない素人ですが、誰かの参考になるかもしれないので書きます。

VB.netでFormに貼り付けないと動作しないOCXを複数のFormがあるプログラムで使う場合、そのOCXコントロールを貼り付けたFormを用意しておいて、Moduleファイルでグローバル変数として宣言しておけばよいです。
こんな感じです。

Module Module1
    Public frmOCXを貼り付けたフォーム As Form1
End Module

OCXコントロールの名前はOCX1、クラスはAxOCXとして話を進めます。

スポンサーリンク

これを他のフォームやモジュールで使用する場合は、
frmOCXを貼り付けたフォーム.OCX1
を呼び出して使用するだけです。

OCXコントロールに対して、こちらからコマンドを送るだけの処理の場合は、これで問題ありません。
OCXコントロールで発生するイベントを捕捉する場合、このままだと困ります。
例えば、OPOSコントロールの場合は、DataEventというイベントで、OCX側で取得した数値等を取得します。
機器がシリアルポートと接続されている場合、プログラム起動時に機器と接続、終了時に接続解除したいです。
そうしないと、各処理のたびにCOMポートをOpenさせたり、ClaimDeviceというコマンドを送信する必要があり、とても非効率なシステムになってしまいます。

この問題を解決する方法を紹介します。
OPOSに準拠したOCXコントロールで、上記のような使用方法をしたい場合、プログラム起動時にfrmOCXを貼り付けたフォームをNewして、COMポートをオープン、ClaimDeviceを実行します。

各処理は個別のフォームで処理します。
例えば、Form2で処理する場合、Private WithEventsでOCX2を宣言します。
OCXコントロールをフォームに貼り付ける必要はありません。
そして、フォームロードのタイミングで、OCX2にOCX1をコピーすることで、OCX1で発生したイベントを捕捉することができます。
次のコードでは、DataEventを捕捉しています。

    Private WithEvents OCX2 As AXOCX
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        OCX2= frmOCXを貼り付けたフォーム.OCX1

    End Sub

    Private Sub OCX2_DataEvent(ByVal sender As Object, ByVal e As AxOCX.DataEventEvent) Handles OCX2.DataEvent

    End Sub

このようにしておけば、Form2を閉じて、次はForm3で処理といったことも自由自在にできます。
Form2だけじゃなく、複数のフォームでOCXを利用することができます。

-OCX ActiveX

Copyright© 自由になりたくて会社辞めました , 2024 AllRights Reserved Powered by AFFINGER4.