環境: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がおかしいのでしょうか?
アドバイスお願いします。
なぜコンパイル前後で動作が違うかは分かりませんが、コンパイル後はMsgBoxを表示する前にText2_GotFocusイベントが発生しています。
イベントの流れを考えるとText2_GotFocusイベントが発生することは正しいと思いますよ。
IDE上ではIDEが介入しているだろうからなんともいえないかな。(SPのバージョンを上げることで直る可能性があるけど実際はどうなんだろう。)
確認環境:VB6+SP5, Win2K+SP4
>コンパイル前と後で動作が変わることなどあるのでしょうか?
例えば、
条件付コンパイル引数を指定したり、
コマンドライン引数を指定してたり・・・。
ってそうゆうことじゃないか・・・。
ヒントはDoEventsです。
Form2.Show vbModalの後にDoEventsを入れてみてください。
その動作が本来の動作なのです。
つまりForm2がUnloadした後、当然フォーカスは元に戻り
Text2_GotFocusイベントが起きるはずなのですが、
DoEventsが入っていない為、メッセージの処理が間に合わず、
Text2.Tag の値が書き換わらないで前の値を垂れ流しています。
開発環境では速度が遅い為メッセージの処理が間に合わない、
コンパイルすると処理が早くなってメッセージの処理が間に合うだけです。
引数は何も入れてないです。
実際のプログラム上では、
「あるテキストにフォーカスが移動したとき、そこに表示されている
値をテキストのタグに格納する。
そこのコードを入力するときに、エンターキーでコード検索画面を出す。
検索画面で選んだコードをテキストに表示させるが、
一部のコードについては入力できないので、メッセージで
エラーを表示し、タグに格納してある入力前の値を表示する。」
という流れにしようと思っています。
メッセージ表示とGotfocusイベントの兼ね合いが問題ならば、
仕様の変更が必要なのかな・・・(ノД`)
>メッセージ表示と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
とやってみて下さい。
フォームのShowにメッセージ表示が続くと変な動きになるのですね。
少し仕様を変えるとうまくいきました。
どうもです。
>フォームのShowにメッセージ表示が続くと変な動きになるのですね。
違います。(^^;
ツイート | ![]() |