投稿者 イヨ  (社会人) 投稿日時 2021/1/14 10:16:01
>下記のようなコードを実行すると、Button1 を押すたびに、
>新しい Form2 が表示される事象を確認できると思います。
なるほどそういうことだったのですね
いっぱいウインドウが押すたびにでてきました!
なんだか昔のpcの固まった時みたいですね( ´∀` )

>それに対して、Shared で宣言された g_Data の場合、
>複数のインスタンスがあったとしても、g_Data 変数は一つしか存在できません。
勉強になります。いろいろ使い道がありそうです。

>何故、このような設計にしてあるのか、作成者にコードの意図を聞いてみたいところですが…
私もいろいろ聞いてみたいのですが、いまは違うところにいらっしゃるようで聞けないのです、、><
今回の件はマストではありませんが、そんな機能があったら便利みたいな感覚でやってます。



書いて頂きましたコードを入れたらSub DataReceived内でg_Dataが書き換わりました。
ありがとうございます。

g_SerialPortは下記のように書いてありSerialPort型でした。
Public Class BarcodeReader
    ''' <summary>受信データ</summary>
    Private Shared g_Data As String = ""
    ''' <summary>受信データ</summary>
    Private Shared g_DataHash As Hashtable = Nothing
    ''' <summary>シリアルポートオブジェクト</summary>
    Private Shared g_SerialPort As SerialPort = Nothing



Public Sub DataReceived()はこのように書き換えました。
もとのこのコードはバーコードスキャンがトリガーとなっているようで
読み取ったデーターをg_Dataにわたしているみたいです。
自分はこのトリガーをForm2 button click に置き換えてg_Dataをtextboxで横から書き換えたら
それに準じたデーターが表示されるとおもいましたが
やっていくうちに結構複雑なのかなと思い始めました。。

  Public Sub DataReceived()
        'MsgBox(g_Data)
        Try
            If USE_SCANNER Then
                g_Data &= g_SerialPort.ReadExisting()
            Else
                g_Data = "30013001C0100"
            End If
        Catch ex As Exception
            MessageBox.Show("バーコードの読み込みに失敗しました" & vbCrLf & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
            '受信バッファはクリア
            g_Data = ""
            Return
        End Try
        If g_Data.Length <> 8 Then
            g_Data = ""
            Return
        End If
        ''''データを分解する
        ScanDataDisassemble(g_Data)
        ''イベント通知
        RaiseEvent BarcodeReceived(g_Data)
        ' 受信バッファはクリア
        g_Data = ""
        Return
    End Sub
    Public Sub New()
    End Sub
    Public Sub New(s As String)
        g_Data = s
    End Sub
End Class


ちなみに   AddHandler g_SerialPort.DataReceived, AddressOf DataReceived の
部分は下記の中にかいてありました。

Public Function Open() As Boolean
        Dim Result As Boolean = False
        Try
            If USE_SCANNER Then

                g_SerialPort = New SerialPort()
                g_SerialPort.PortName = SysValue.ComPortName
                'g_SerialPort.Encoding = System.Text.Encoding.GetEncoding("Shift-JIS")
                g_SerialPort.Encoding = System.Text.Encoding.GetEncoding("utf-8")
                'ポートオープン
                g_SerialPort.Open()
                'RTS出力 (送信要求)
                g_SerialPort.RtsEnable = True
                'DTR出力 (端末レディ)
                g_SerialPort.DtrEnable = True
                'パリティー設定(偶数)
                g_SerialPort.Parity = Parity.Even

                ''データ受信ハンドラ設定
                AddHandler g_SerialPort.DataReceived, AddressOf DataReceived
            End If
            g_DataHash = New Hashtable()
            Result = True

        Catch ex As Exception
            MessageBox.Show("オープンエラー" & vbCrLf & ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Result = False
        End Try
        Open = Result
    End Function