RS232Cの通信プログラムについて勉強中です。
今回の質問は正直、関数の使用方法レベルの話で恐縮なのですが、どうしても解決ができずご教授お願いします。
以下のプログラムで実行したとき、ctlCommのコンパイルエラーが出てしまいます。
また、エラーのでる箇所をいくつか変更し試してみましたが、オブジェクト変数が認識されていないというエラーがでます。
初歩的な質問で恐縮なのですが、どのようにしたらエラーが出ず正常に設定を反映させることができるのか教えてください。
通信データ構造体は略
↓設定ボタンを押したときのプログラム
Private Sub cmdSetup_Click()
COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
COMM_DATA.port_speed = cmbPortSpeed.Text
COMM_DATA.data_bit = cmbDataBit.Text
COMM_DATA.stop_bit = cmbStopBit.Text
If cmbParity.Text = "なし" Then
COMM_DATA.parity = "N"
ElseIf cmbParity.Text = "奇数" Then
COMM_DATA.parity = "O"
ElseIf cmbParity.Text = "偶数" Then
COMM_DATA.parity = "E"
End If
If cmbFllow.Text = "なし" Then
COMM_DATA.fllow = "0"
ElseIf cmbFllow.Text = "ソフトウェア" Then
COMM_DATA.fllow = "1"
ElseIf cmbFllow.Text = "ハードウェア" Then
COMM_DATA.fllow = "2"
End If
If commOpen(ctlComm) = 0 Then
MsgBox "設定完了", vbCritical, "確認画面"
End If
End Sub
↓ MainModule内プログラム
Public Function commOpen(ctlComm As Object) As Integer
On Error GoTo ErrorHandle
'通信設定値を反映
With COMM_DATA
ctlComm.CommPort = .comm_port
ctlComm.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit
Select Case .fllow
Case 0
ctlComm.Handshaking = comNone
Case 1
ctlComm.Handshaking = comXOnXoff
Case 2
ctlComm.Handshaking = comRTS
End Select
End With
ctlComm.RTSEnable = True
ctlComm.PortOpen = True
commOpen = 0
Exit Function
ErrorHandle:
MsgBox "通信ポートの設定が正常に行えませんでした", vbCritical, "通信ポート設定エラー"
commOpen = -1
End Function
On Error GoTo ErrorHandleをコメントアウトすると
実際にはどこで、どのようなエラーが出ますか?
レス有難うございます。
”オブジェクト変数または With ブロック変数が設定されていません。”
というエラーが出ます。
場所を記入していませんでした。
With COMM_DATA
ctlComm.CommPort = .comm_port ←ここで止まります。
ctlComm.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit
デバックですとCOMM_DATA.comm_portへ値は入っています。
ので、ctlComm.CommPort がうまく認識されてないのだと考えています。
素人っぽい表現ですみません。
>ので、ctlComm.CommPort がうまく認識されてないのだと考えています。
ウォッチ式、やイミディエイトウィンドウで参照したとき、
"オブジェクト変数または With ブロック変数が設定されていません。"
と確認できるはずですので、まずは確定(Commit)させましょう!
っていうか、確定してから質問しようよ、そこまで調査できているのならば。
特に問題が有りそうな点は見当たりません。
取りあえず、宣言を含め全て提示されたコードを
MainModuleの上ではなく、呼び出すFormの上に
書いたみたらいかがでしょうか。
いなさんと被った。(^^;
宣言の部分が無いので良くわかりませんが、
>"オブジェクト変数または With ブロック変数が設定されていません。”
このエラーはなんとなくいやな匂いがするのですが。
ん〜、っと先の書き方ではかわいそうなので、
チョットやわらかい言い方に
ctlComm.CommPortが、
"オブジェクト変数または With ブロック変数が設定されていません。"
ってことは、
「そんな変数オラ知らねぇ〜」っていうことなんだけれども、
スコープの範囲内に宣言されてる?
申し訳ございません。重要なこと質問ミスしていました。
まず、最初ここで”コンパイルエラー 変数が定義されていません”となったため(エラー箇所は下に記入しました)
そのため
Dim ctlComm As Object の一行を追加してしまいました。
そして、質問で上げたソースがその一行を付け足す前のソースでした。
その後のエラーは Dim ctlComm As Object の一行を追加した状態でのエラーということになります。
ヤヤコシクしてしまって申し訳ありません。
Commitに関しては使用方法がわからないので、調べております;;
↓設定ボタンを押したときのプログラム
Private Sub cmdSetup_Click()
COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
COMM_DATA.port_speed = cmbPortSpeed.Text
COMM_DATA.data_bit = cmbDataBit.Text
COMM_DATA.stop_bit = cmbStopBit.Text
If cmbParity.Text = "なし" Then
COMM_DATA.parity = "N"
ElseIf cmbParity.Text = "奇数" Then
COMM_DATA.parity = "O"
ElseIf cmbParity.Text = "偶数" Then
COMM_DATA.parity = "E"
End If
If cmbFllow.Text = "なし" Then
COMM_DATA.fllow = "0"
ElseIf cmbFllow.Text = "ソフトウェア" Then
COMM_DATA.fllow = "1"
ElseIf cmbFllow.Text = "ハードウェア" Then
COMM_DATA.fllow = "2"
End If
If commOpen(ctlComm) = 0 Then ←ここのctlCommへカーソルが行きエラーとなりました。
MsgBox "設定完了", vbCritical, "確認画面"
End If
End Sub
ctlComm が何か?ってのが一番知りたかったり…
フォーム上にデザイン画面で貼り付けた
コミュニケーション (MSComm) コントロール
ですか?
エラーの直接の原因とは関係ないかもしれないけど
>Public Function commOpen(ctlComm As Object) As Integer
が気持ち悪いので
Public Function commOpen(ctlCommA As MSComm) As Integer
とデータ型をハッキリさせて同じ名前の変数を使わないようにして、
フォーム側の
> If commOpen(ctlComm) = 0 Then
は
If commOpen(Me.ctlComm) = 0 Then
としてみて下さい。
できれば cmbParity とかも Me.cmbParity に…
>ん〜、いいたいことはまるるうさんが語ってしまったので、
ゴメン、あのさ
Dim ctlComm As Object の一行を追加してしまいました。
というけど、極力"AS Object"
系の変数宣言を明示的に宣言した方がいいと思うのね。
あ、ゴメン、
>Commitに関しては使用方法がわからないので、調べております;;
これはただの英語、VBとは関係ありません。
あぁ〜本当に、質問内容や解釈がザルで申し訳ございません。
おっしゃる通りctlCommコミュニケーション (MSComm) コントロールです。
スコープに関して・・・申し訳ございません。
MSCommのオブジェクト名をctlCommとした、という事ですが、
範囲内なのか範囲外なのかの判断が付きません。
名前の付け方もご指摘のようにしてみます。
現在、MSCommのオブジェクト名をctlCommAとし実行してみました。
下の箇所で”コンパイルエラー メソッドまたはデータメンバが見つかりません”
というエラーが出てしまいす。
再度どうかご教授お願いします。
Private Sub cmdSetup_Click()
COMM_DATA.comm_port = CInt(Mid(cmbCommPort.Text, 4))
COMM_DATA.port_speed = cmbPortSpeed.Text
COMM_DATA.data_bit = cmbDataBit.Text
COMM_DATA.stop_bit = cmbStopBit.Text
If cmbParity.Text = "なし" Then
COMM_DATA.parity = "N"
ElseIf cmbParity.Text = "奇数" Then
COMM_DATA.parity = "O"
ElseIf cmbParity.Text = "偶数" Then
COMM_DATA.parity = "E"
End If
If cmbFllow.Text = "なし" Then
COMM_DATA.fllow = "0"
ElseIf cmbFllow.Text = "ソフトウェア" Then
COMM_DATA.fllow = "1"
ElseIf cmbFllow.Text = "ハードウェア" Then
COMM_DATA.fllow = "2"
End If
If commOpen(Me.ctlCommA) = 0 Then ←ここでエラーです。
MsgBox "設定完了", vbCritical, "確認画面"
End If
End Sub
昨日はちょっと忙しかったので。。。。
ちょっと錯綜してきました、少し問題点を整理してみましょう。
私が2回目のレスで試したコードは、ボタン(cmdSetup)一つと
Mscomm(ctlComm)コントロール一つだけをフォームに置いて、
Form1:
Private Sub cmdSetup_Click()
COMM_DATA.comm_port = 1
If commOpen(ctlComm) = 0 Then
MsgBox "設定完了"
End If
End Sub
Module:
Public Type Comset
comm_port As Integer
End Type
Public COMM_DATA As Comset
Public Function commOpen(ctlComm As Object) As Integer
On Error GoTo e
With COMM_DATA
ctlComm.CommPort = .comm_port
End With
ctlComm.PortOpen = True
commOpen = 0
Exit Function
e:
MsgBox (Err.Description)
commOpen = 1
End Function
このコードは試されるとわかるのですが、問題なく実行されます。
最初に疑うのは誰も同じで、COMM_DATA のスコープですが、
Module内の宣言をコメントアウトして、Form内にPrivate で
宣言してみました。結果は、「Option Explicit」を指定しない場合は
「オブジェクトが必要です」のエラーメッセージが、「Option Explicit」を
指定した場合は、「変数が定義されていません」のエラーメッセージが出ます。
提示された「オブジェクト変数または With ブロック変数が設定されていません。」の
エラーにはなりません。
確かにcommOpen(ctlComm As Object) はレイトバインドで気持ちは悪いのですが
エラーになることは無いと思います。
>チロルさん
上のコードを試されて、もしエラーが出ないのなら、少しずつ肉付けをされれば
何が問題かわかるでしょう。
ねろさん有難うございます。
アドバイスもらったように、まず新しいプロジェクトを用意し最小限の機能だけでやってみました。
結果正常に作動させることができました。言われたように、少しづつ肉付けしていくことが大切だと思いました。
結局、直接的な原因は不明なままですが、何か自分の手には負えない箇所でツジツマが合ってなかったのかもしれません。
自分の技量わきまえず、下手に流用できる部分を流用してしまったことに原因があるのかと思いました。
アドバイスを頂いた方、有難うございました。
一応、少しだけ色をつけて動作したソースを報告します。
Form1:
Private Sub cmdSetup_Click()
With COMM_DATA
.comm_port = CInt(Mid(cmbCommPort.Text, 4))
.port_speed = cmbPortSpeed.Text
.data_bit = cmbDataBit.Text
.stop_bit = cmbStopBit.Text
If cmbParity.Text = "なし" Then
COMM_DATA.parity = "N"
ElseIf cmbParity.Text = "奇数" Then
COMM_DATA.parity = "O"
ElseIf cmbParity.Text = "偶数" Then
COMM_DATA.parity = "E"
End If
End With
If commOpen(ctlCommA) = 0 Then
MsgBox "OK"
End If
End Sub
Module:
Type TYP_COMM_DATA ' 通信データ構造体
comm_port As Integer
port_speed As String
data_bit As String
stop_bit As String
parity As String ' N:なし E:偶数 O:奇数
End Type
Public COMM_DATA As TYP_COMM_DATA
Public Function commOpen(ctlCommA As MSComm) As Integer
On Error GoTo ErrorHandle
With COMM_DATA
ctlCommA.CommPort = .comm_port
ctlCommA.Settings = .port_speed + "," + .parity + "," + .data_bit + "," + .stop_bit
End With
ctlCommA.PortOpen = True
commOpen = 0
Exit Function
ErrorHandle:
MsgBox (Err.Description)
commOpen = 1
End Function
ツイート | ![]() |