VB6 Bug in Projekt mit 2 Textboxen und 5 Zeilen

Hallo,
ich habe ein kleines VB Projekt.
Form1 mit 2 Textboxen
Neue Form2 ohne alles
Im Text1_Validate folgenden Code:

Private Sub Text1_Validate(Cancel As Boolean)
Dim myForm As Form2
Set myForm = New Form2
myForm.Show vbModal
End Sub

Beim starten ist der Focus auf der TextBox1. Jetzt klicke ich mit der Maus auf die Textbox2. Dann kommt die Form 2 hoch. Beim Schließen der Form 2 ist die Textbox2 zwar markiert und hat den Focus, jedoch kann ich nichts darin schreiben, ich muss diese erst noch einmal anklicken. Es kommt mir vor, als wenn die Textbox meint, dass noch die Linke Mausstate der Maus gedrückt hat.

Ist das ein VB6 Bug
Hat jemand eine Idee was ich dagegen machen kann? (In Lost_Focus kann ich meinen Code für die Form 2 leider nicht legen. Damit würde das Problem nicht auftauchen.)
Kann man der Maus sagen, dass keine Taste mehr gedrückt ist?
Ich kann auch gerne das Projekt versenden!

Hat jemand eine Idee?
Bin für jede Info dankbar
Thomas

Hallo Thomas,

nachdem ich Dein Problem nun endlich verstanden habe, habe ich auch eine Lösung gefunden, auch wenn mir die noch nicht so richtig gefällt.

Option Explicit

Private Declare Function SetCursorPos Lib "user32" (ByVal \_
 X As Long, ByVal Y As Long) As Long

Private Declare Sub mouse\_event Lib "user32" (ByVal dwFlags \_
 As Long, ByVal dx As Long, ByVal dy As Long, ByVal \_
 cButtons As Long, ByVal dwExtraInfo As Long)

Const MOUSEEVENTF\_LEFTDOWN = &H2
Const MOUSEEVENTF\_LEFTUP = &H4

Private Sub Text1\_Validate(Cancel As Boolean)
 Form2.Show vbModal
End Sub

Private Sub Text2\_GotFocus()
 Call mouse\_event(MOUSEEVENTF\_LEFTDOWN, Me.Left + 600, Me.Top + 60, 0, 0)
 Call mouse\_event(MOUSEEVENTF\_LEFTUP, Me.Left + 600, Me.Top + 60, 0, 0)
End Sub

Ich habe inzwischen noch bei http://www.ActiveVB.de gefragt und hoffe noch auf eine bessere Lösung, denn das hier sieht ‚gebastelt‘ aus und ich bin selbst nicht so recht überzeugt, daß das wirklich stabil läuft. Als Notlösung ist das aber erst mal einsetzbar.

Wenn ich noch eine bessere Lösung finde, schreibe ich sie.

Gruß Rainer

Hallo Thomas,

zwei weitere Lösungen, nun auch endlich stabil.

Das Problem entsteht, weil die Form2 geöffnet wird, bevor der Mouseclick vollständig in Text2 angekommen ist. In meinem Code kann ich Mousedown also weg lassen und benötige auch keine Koordinaten. Das sieht dann so aus:

Option Explicit

Private Declare Function SetCursorPos Lib "user32" (ByVal \_
 X As Long, ByVal Y As Long) As Long

Private Declare Sub mouse\_event Lib "user32" (ByVal dwFlags \_
 As Long, ByVal dx As Long, ByVal dy As Long, ByVal \_
 cButtons As Long, ByVal dwExtraInfo As Long)

Const MOUSEEVENTF\_LEFTUP = &H4

Private Sub Text1\_Validate(Cancel As Boolean)
 Form2.Show vbModal
End Sub

Private Sub Text2\_GotFocus()
 Call mouse\_event(MOUSEEVENTF\_LEFTUP, 0, 0, 0, 0)
End Sub

Das ist der korrekte Weg.

Einfacher ist es, wenn Du statt Validate das Ereignis LostFocus verwendest, das wird erst ausgeführt, wenn das Klickereignis vollständig in Text2 angekommen ist. Für Dich wird das keinen Unterschied machen, für VB aber schon.

Das sieht dann so aus:

Private Sub Text1\_LostFocus()
 Form2.Show vbModal
End Sub

Deutlich weniger Code, läuft auch stabil. Ob Du das verwenden kannst, musst Du sehen.

Gruß Rainer

Danke perfekt
Hallo Rainer, danke, perfekt.

Ich mache den Aufruf
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
in TextBox1_LostFocus.

Dann geht es immer, egal in welches Control gesprungen wird (Hier in dem Beispiel natürlich nur ein weiteres Control)

Im Lost Focus kann ich die Modale Maske leider nicht anzeigen.

Danke
Thomas

Hallo thomas,

Ich mache den Aufruf
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
in TextBox1_LostFocus.

das ist auch ein Gedanke, darauf bin ich nicht gekommen.

Dann geht es immer, egal in welches Control gesprungen wird
(Hier in dem Beispiel natürlich nur ein weiteres Control)

Im Lost Focus kann ich die Modale Maske leider nicht anzeigen.

Ja, so wie Du es jetzt hast, funktioniert es ja und das ist auch genau das, was da fehlt. Das ist eine stabile Lösung, gefällt mir! :smile:

Gruß Rainer