- 締切済み
プログラム終了時のデータ送信処理@VB6
プログラム終了時のデータ送信処理@VB6 複数のフォームがあり(A-Z)プログラム終了の際はどのフォームがアクティブであっても、 かならずフォームAをアンロードするようにプログラムされています。 フォームAにはWinsockコントロールが2個使われておりフォームがアンロード(UnloadまたはUnloadQuery)される際には相手先にCLOSEとDISCONNECTを送信するようにくみます。 このときに、 送信コマンドをForm_QueryUnloadイベントに組み込んだところデータが送れませんでした。 もちろんForm_Unloadでも送れませんでした。 アンロード時にデータを送信するにはどうすればよろしいでしょうか? ご助力お願いします
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kaihatusha
- ベストアンサー率46% (7/15)
Form_QueryUnloadでのみ送信できないというのは不思議な現象ですね。 DoEventを送信処理の途中で組み込んでみるとか・・。 フォームAをアンロードするのをコード指定しているのであれば、非表示フォームを作りその直前にでも送信処理を組み込んでみるとか・・。 あまりいい案ではないですが、これぐらいしか思いつきません。
- kiki_s
- ベストアンサー率59% (147/248)
最近はVB自体さわらないのでほとんど忘れていますが、 フォームAをアンロードする際は、Call Unload(FormA)とされているのでしょうか? 別フォームから別フォームをアンロードしても、QueryUnloadイベントは発生するはずです。 一番単純に2つのフォームを作り、フォーム1からフォーム2をロード、アンロード出来るようにします。 フォーム2に下記コードを入れて挙動を確認して下さい。 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) MsgBox "QueryUnload実行" End Sub 必ず、メッセージが表示されます。 Winsockコントロールなどを利用されていらっしゃるのですから、 私など足下に及ばないでしょうが、まず基本的な部分から攻めてみるのが一番の近道です。 不特定のフォームに必要なコードを記述するのであれば、 標準モジュールに記述して呼び出すのも方法かと思います。
補足
Unloadの呼び出しは Unload FormA と記述しています 私も呼び出しが正常に行われているのかチェックしていたところ、ログ表示もできているので Form_QueryUnload自体は動いているようで、他の処理は行われています。 直前でWinsockのステータスを確認しても正常接続の7が返ってきます。 Winsockのほうで送信できない状況らしく、その原因がわかりません。 CLOSEシグナルが送れていないので当然その応答が返ってくるわけもなく困っています -------------------------- 閉じるボタン側のソース -------------------------- ' '終了ボタン ' Private Sub cmdEnd_Click() Unload formA End Sub -------------------------- アンロードされる側のソース -------------------------- ' 'ソフト終了 ' Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) 'タイムアウト用カウンタ Dim intI As Integer intI = 0 'Cliantソケット通信の終了 If Winsock1.State = 7 Then Winsock1.SendData CLOSESignal 'ログの書き出し Debug.Print "送信" & CLOSESignal Do Until (blnCliantRec = True) Sleep (1000) intI = intI + 1 Winsock1.SendData CLOSESignal 'ログの書き出し Debug.Print "再送" & CLOSESignal 'リトライ回数超過 If intI >= cintMaxRetry Then Debug.Print "応答受信待ちタイムアウト" Exit Do End If Loop End If Winsock1.Close End Sub