●VB6 UserControlを作る

懐かしい開発環境のVB6でユーザーコントロールを作る必要が出てきたので作成することにしました。
そもそも、Windows10にVB6をインストールする時点でデータアクセスの「ADO、RDSおよびOLE DBプロバイダ」と「リモートデータオブジェクトとコントロール」除いてインストールしないとうまくいきませんでした。
そして、Windows10ではVB6.exeを探してプロパティで管理者で実行にチェックを入れないとレジストリに登録されないのでUserControlは動きませんでした。
あと、つまずいた点としては、プロジェクト名前が呼んだ先と同じだとエラーがでました。
変更するには、ココでプロパティを選択して、


プロジェクト名がぶつからないように変更します。

プロジェクト名が呼びだし側と同じだとうまく動かなくて色々悩む事になるので注意が必要です。


▼プロパティの作成

さて、さっそくコードを書いてみましょう。

こいつですよ、こいつ。
これを新規で作成して、フォームみたいなのをクリックして次のコードを貼り付けます。
Public Property Let test(value As Boolean)

End Property

Public Property Get test() As Boolean

End Property
このコードでOCXを作成して、VisualBasicで作成したコンポーネントを追加すると、こんな感じにプロパティが設定できます。


あとコードのほうでも

選択肢が表示されています。


▽プロパティで選べる選択肢を与える

Boolean以外でもプロパティを設定するだけでなくて選択肢を用意したいと思います。
次のコードを使ってOCXを作成してみてください。
Public Enum mode
    aaa = 1
    bbb = 2
    ccc = 3
End Enum

Private a As mode

Public Property Let test(value As mode)
    a = value
End Property

Public Property Get test() As mode
    test = a
End Property
このコードで作成したOCXを参照して、コンポーネントを張り付けると、こんな感じにプロパティが設定できます。

もちろん、コードの方でも選択肢として表示されます。



▼公開する変数の作成

フォームみたいなのをクリックして次のコードを貼り付けます。
Public aaa As Integer
このように変数宣言をしてみます。
このコードでOCXを作成して他のプロジェクトから参照してみると、

読み書きできる変数が作成できました。


▼イベントの作成

フォームみたいなのにタイマーを張り付けて1秒毎のイベントを発生するようにしました。
タイマーをクリックして次のコードを貼り付けます。
Public Event testEvent(ByVal index As Integer)

Private Sub Timer1_Timer()
    RaiseEvent testEvent(ByVal 1)
End Sub
このコードでOCXを作成して他のプロジェクトから参照します。
張り付けたUserControlをダブルクリックするとイベントが来るところが開きます。

デバッグ出力してみると1秒毎にイベントが発生しているのが確認できました。


■ MSCommコントロールの一部のプロパティを表現してみる

VB6評価版でもMSCommの必要な機能を限定してデザイン画面でも使えるようにならないかと実験的にコードを書きました。
MSCommのOCXと今回作成するOCXを regsvr32 ***.ocx でレジストリに登録するととりあえず動作します。
全ての機能は実装していません、VB6で作成した自分のアプリに必要だった一部の機能のみです。
私は同一PC内にVB6通常版を持っていますので問題は無いと思いますが、持ってない人は開発ライセンスの問題があるかもしれません。

MSComm.Inputが識別子のため使えないっぽいのでInput_にしています。
あと、改行文字の処理などちょっと動きがおかしいところもあります。

標準モジュール
Public Const comEvReceive = 2
Public Const comEventBreak = 1001
Public Const comEventCTSTO = 1002
Public Const comEventDSRTO = 1003
Public Const comEventFrame = 1004
Public Const comEventOverrun = 1006
Public Const comEventCDTO = 1007
Public Const comEventRxOver = 1008
Public Const comEventRxParity = 1009
Public Const comEventTxFull = 1010
Public Const comEventDCB = 1011

ユーザーコントロール
Public Enum Handshaking_mode
    comNone
    comXOnXoff
    comRTS
    comRTSXOnXOff
End Enum

Public Enum InputMode_mode
    comInputModeText
    comInputModeBinary
End Enum

Public Event OnComm()

Private Sub MSComm1_OnComm()
    RaiseEvent OnComm
End Sub

Public Property Let CommPort(value As Integer)
    MSComm1.CommPort = value
End Property

Public Property Get CommPort() As Integer
    CommPort = MSComm1.CommPort
End Property

Public Property Let DTREnable(value As Boolean)
    MSComm1.DTREnable = value
End Property

Public Property Get DTREnable() As Boolean
    DTREnable = MSComm1.DTREnable
End Property

Public Property Let EOFEnable(value As Boolean)
    MSComm1.EOFEnable = value
End Property

Public Property Get EOFEnable() As Boolean
    EOFEnable = MSComm1.EOFEnable
End Property

Public Property Let Handshaking(value As Handshaking_mode)
    MSComm1.Handshaking = CInt(value)
End Property

Public Property Get Handshaking() As Handshaking_mode
    Handshaking = MSComm1.Handshaking
End Property

Public Property Let InBufferSize(value As Integer)
    MSComm1.InBufferSize = value
End Property

Public Property Get InBufferSize() As Integer
    InBufferSize = MSComm1.InBufferSize
End Property

Public Property Let InputLen(value As Integer)
    MSComm1.InputLen = value
End Property

Public Property Get InputLen() As Integer
    InputLen = MSComm1.InputLen
End Property

Public Property Let InputMode(value As InputMode_mode)
    MSComm1.InputMode = CInt(value)
End Property

Public Property Get InputMode() As InputMode_mode
    InputMode = MSComm1.InputMode
End Property

Public Property Let NullDiscard(value As Boolean)
    MSComm1.NullDiscard = value
End Property

Public Property Get NullDiscard() As Boolean
    NullDiscard = MSComm1.NullDiscard
End Property

Public Property Let OutBufferSize(value As Integer)
    MSComm1.OutBufferSize = value
End Property

Public Property Get OutBufferSize() As Integer
    OutBufferSize = MSComm1.OutBufferSize
End Property

Public Property Let ParityReplace(value As String)
    MSComm1.ParityReplace = value
End Property

Public Property Get ParityReplace() As String
    ParityReplace = MSComm1.ParityReplace
End Property

Public Property Let RThreshold(value As Integer)
    MSComm1.RThreshold = value
End Property

Public Property Get RThreshold() As Integer
    RThreshold = MSComm1.RThreshold
End Property

Public Property Let RTSEnable(value As Boolean)
    MSComm1.RTSEnable = value
End Property

Public Property Get RTSEnable() As Boolean
    RTSEnable = MSComm1.RTSEnable
End Property

Public Property Let Settings(value As String)
    MSComm1.Settings = value
End Property

Public Property Get Settings() As String
    Settings = MSComm1.Settings
End Property

Public Property Let SThreshold(value As Integer)
    MSComm1.SThreshold = value
End Property

Public Property Get SThreshold() As Integer
    SThreshold = MSComm1.SThreshold
End Property

Public Property Let PortOpen(value As Boolean)
    MSComm1.PortOpen = value
End Property

Public Property Get PortOpen() As Boolean
    PortOpen = MSComm1.PortOpen
End Property

Public Property Let Output(value As Variant)
    MSComm1.Output = value
End Property

Public Property Get OutBufferCount() As Integer
    OutBufferCount = MSComm1.OutBufferCount
End Property

Public Property Get CommEvent() As Integer
    CommEvent = MSComm1.CommEvent
End Property

'Inputが識別子のため使えないっぽい
Public Property Get Input_() As Variant
    Input_ = MSComm1.Input
End Property


今回作成したユーザーコントロールのOCXを参照してフォームに貼り付けた時に、オブジェクト名をMSCommに変更するとコードの修正を最小限にできるようです。



■識別子であるInputを無理やり使えるようにする

実験的に作成してみました、たぶん許諾契約的にいろいろ引っかかると思いますので実際には使わない方が良いです。
作成したOCXをバイナリエディタで開き、 Input_ の文字を検索します。


Input_の _ 部分を0x00に置き換えます。

全部で2か所、Input_ の文字がありますので同様に修正しました。
書き換えたOCXでは Input が使用できました。


▲トップページ > Visual BASIC と C#