コンパイルすると動きが変わってしまう

解決


コロナタス  2005-12-06 01:09:23  No: 128570

環境:WindowsXP Pro SP2、VB6SP4

VBで以下のコード記述します。

'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'フォーム1
'オブジェクト名:Form1
'フォーム上のコントロール:Text1、Text2(ともにテキストボックス)
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Private Sub Command1_Click()

    Text2.Text = Text1.Text

End Sub

Private Sub Form_Load()
Text1.Text = "1"
Text2.Text = "2"
End Sub

Private Sub Text1_GotFocus()
Text1.TabIndex = 0
End Sub

Private Sub Text2_GotFocus()
Text2.TabIndex = 0
Text2.Tag = Text2.Text
End Sub

Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyReturn
    Form2.Show vbModal
    If Text1.Text <> Text2.Text Then
        If Llb = 0 Then
        Unload Form2
         
        Text2.Text = Text2.Tag
        Text2.SetFocus
        End If
    End If
End Select
End Sub
Private Function Llb() As Integer

Llb = 0
MsgBox "変更できません", vbOKOnly + vbInformation, App.FileDescription
End Function

Private Sub Text2_LostFocus()
    If Trim(Text2.Text) = "" Then
        Text2.Text = Text2.Tag
    End If
End Sub

'★★★★★★★★★★★★★★★★★★★★★★★★★★★★
'フォーム2
'オブジェクト名:Form2
'フォーム上のコントロール:Text1(テキストボックス)、Command1(コマンドボタン)
'★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Private Sub Command1_Click()
Unload Me
End Sub

まずForm1が表示されます。
Text1には1、Text2には2が表示されています。
Text2に何か文字を入力します。例えば"2test"と入力します。
フォーカスがText2にある状態でエンターを押します。
するとForm2が表示されます。
Command1をクリックします。
Form2は消え、「変更できません」とメッセージが出ます。
Form1のText1の"2test"が元の"2"に戻ります。

しかし、これをコンパイルして実行ファイル形式で動かすと、最後のところが
2testのまま変わりません。

コンパイル前と後で動作が変わることなどあるのでしょうか?

それともPCがおかしいのでしょうか?
アドバイスお願いします。


GOD  2005-12-06 03:02:14  No: 128571

なぜコンパイル前後で動作が違うかは分かりませんが、コンパイル後はMsgBoxを表示する前にText2_GotFocusイベントが発生しています。
イベントの流れを考えるとText2_GotFocusイベントが発生することは正しいと思いますよ。
IDE上ではIDEが介入しているだろうからなんともいえないかな。(SPのバージョンを上げることで直る可能性があるけど実際はどうなんだろう。)

確認環境:VB6+SP5, Win2K+SP4


ななし  2005-12-06 03:32:31  No: 128572

>コンパイル前と後で動作が変わることなどあるのでしょうか?

例えば、
条件付コンパイル引数を指定したり、
コマンドライン引数を指定してたり・・・。

ってそうゆうことじゃないか・・・。


我龍院忠太  2005-12-06 03:37:52  No: 128573

ヒントはDoEventsです。
Form2.Show vbModalの後にDoEventsを入れてみてください。
その動作が本来の動作なのです。
つまりForm2がUnloadした後、当然フォーカスは元に戻り
Text2_GotFocusイベントが起きるはずなのですが、
DoEventsが入っていない為、メッセージの処理が間に合わず、
Text2.Tag の値が書き換わらないで前の値を垂れ流しています。
開発環境では速度が遅い為メッセージの処理が間に合わない、
コンパイルすると処理が早くなってメッセージの処理が間に合うだけです。


コロナタス  2005-12-06 03:47:23  No: 128574

引数は何も入れてないです。
実際のプログラム上では、

「あるテキストにフォーカスが移動したとき、そこに表示されている
  値をテキストのタグに格納する。
  そこのコードを入力するときに、エンターキーでコード検索画面を出す。
  検索画面で選んだコードをテキストに表示させるが、
  一部のコードについては入力できないので、メッセージで
  エラーを表示し、タグに格納してある入力前の値を表示する。」

という流れにしようと思っています。

メッセージ表示とGotfocusイベントの兼ね合いが問題ならば、
仕様の変更が必要なのかな・・・(ノД`)


我龍院忠太  2005-12-06 04:05:18  No: 128575

>メッセージ表示とGotfocusイベントの兼ね合いが問題ならば、
私が書いたメッセージとはMsgBoxでは無く、Windowsのメセージループの
事です。(^^;
ちょっと色々おかしいところはありますが、とりあえず

Dim Flg As Boolean  'フォームで宣言しておいて、
Private Sub Text2_GotFocus()
    If Flg Then Exit Sub
    Text2.TabIndex = 0
    Text2.Tag = Text2.Text
End Sub

Private Sub Text2_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyReturn
        Flg = True
        Form2.Show vbModal
        DoEvents
        If Text1.Text <> Text2.Text Then
            If Llb = 0 Then
                Unload Form2
                Text2.Text = Text2.Tag
                Text2.SetFocus
            End If
        End If
    End Select
    Flg = False
End Sub
 
とやってみて下さい。


コロナタス  2005-12-06 20:07:16  No: 128576

フォームのShowにメッセージ表示が続くと変な動きになるのですね。
少し仕様を変えるとうまくいきました。
どうもです。


我龍院忠太  2005-12-06 20:38:43  No: 128577

>フォームのShowにメッセージ表示が続くと変な動きになるのですね。
違います。(^^;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加