Problem mit SetFocus

AlienShooter

Grünschnabel
Moin alle zusammen.
Ich habe ein Problem mit SetFocus in VB. Ich habe nun schon alles Probiert was mir einfällt und finde einfach nicht den Fehler (falls es überhaupt einen gibt! )

Ich möchte, dass wenn das Feld "txtJahr" leer ist, der Focus wieder auf der Feld gesetzt wird und dabei die Fehlermeldung im Labelfeld "lblFehler" ausgegeben wird.
Aber genau da hackt es. Ist das Feld leer, wird der Focus zwar wieder in das Feld gesetzt, aber die Fehlermeldung wird nicht ausgegeben... fragt mich nicht wieso....
Nehme ich die Zeile "txtJahr.SetFocus" raus, wird die Fehlermeldung geschrieben ?!

Wenn ich die Sub mit dem Debugger durchgehe, dann steht komischerweise der Text in dem Labelfeld (auch mit "txtJahr.SetFocus" !)

Hier ein Teil des Codes:
Code:
Private Sub txtJahr_LostFocus()
If txtJahr.Text = "" Then
        lblFehler.Caption = "Bitte eine Jahreszahl eingeben!"
        txtJahr.Text = Right$(Date, 4)
        txtJahr.SetFocus
    Else
        lblFehler.Caption = ""
End If
...
End Sub


Das komische dabei ist, dass ich es in einem anderem Feld genauso gemacht habe, und dort klappt es ohne Probleme .... nur bei den Feldern vom Tag, Monat und Jahr nicht !!**

Hier das Feld wo es klappt:
Code:
Private Sub txtClientnummer_LostFocus()
    If txtClientnummer.Text = "" Then
        lblFehler.Caption = ""
        lblFehler.Caption = "Bitte eine Clientnummer vergeben!"
        txtClientnummer.Text = "080"
        txtClientnummer.SetFocus
    Else
        lblFehler.Caption = ""
    End If
End Sub


Ich habe es auch schon versucht, ob das Problem auftaucht wenn ich die Fehlermeldung in einem Text- statt Labelfeld ausgebe, aber ohne Erfolg.

Weiß nicht mehr weiter. Hoffe das ihr mir helfen könnt.

** Zur Info: Beim Programm gibt es vier Textfelder: 3 Stück für das Datum und eins (txtClientnummer) wo eine Zahl von 000 bis 999 eingetragen werden kann.


Gr€€tz AlienShooter
 
um einen focus zu bekommen muss ein ctrl visible und enabled sein also prüfe vor dem setfocus

Visual Basic:
if txtJahr.Visible and txtJahr.enabled then
        txtjahr.setfocus
else
      call msgbox ("Kein focus möglich") 
end if
Grüsse bb
 
Danke erstmal für deine Antwort.

Also das Feld ist Visible und auch Enabled. (Habe das auch mal mit deinem Code ausprobiert)

Das Feld bekommt den Focus ja auch, nur wird die Fehlermeldung nicht ausgegeben.
Trage ich also bei "txtJahr" nichts ein und ich verlasse das Feld, so sschreibt er sofort das aktuelle Jahr da rein und setzt den Focus auf das Feld (alle markiert). So sollte es ja auch sein, nur das zusätzlich noch die Fehlermeldung im Label "lblFehler" ausgegeben werden sollte, was nicht passiert :confused:
 
Das Problem ist, dass Du, um das txtClient-Feld zu verlassen, in das txtJahr-Feld klickst, in dem schon was steht. Dadurch erhält das Feld txtJahr kurz den Focus, der ihm gleich wieder durch die Anweisung txtClientnummer.Setfocus entzogen wird, was wiederum zum Feuern des Lostfocus-Ereignisses für das Feld txtJahr führt. Da hier schon was drin steht, wird lblFehler sofort wieder leer gemacht.

Wenn Du im Client-Lostfocus einen Haltepunkt oder ein Debug.print einbaust, wirst Du sehen, dass dieses Ereignis nach Clicken in das Clientenfeld direkt ausgerufen wird:

Private Sub txtClientnummer_LostFocus()
If txtClientnummer.Text = "" Then
lblFehler.Caption = ""
lblFehler.Caption = "Bitte eine Clientnummer vergeben!"
txtClientnummer.Text = "080"
txtClientnummer.SetFocus
Else
lblFehler.Caption = ""
Debug.Print "ClientLF"
End If
End Sub

Wenn Du Dir ein zusätzliches Textfeld auf die Form setzt, und dahinein klickst, oder einen anderen Command-Button anklickst, wird auch die Meldung ausgegeben.

Übrigens ist es umgekehrt genauso, wenn Du zuerst in das Client-Feld klickst, und dann in das Jahr, fehlt die Meldung auch.

Die Logik ist also falsch, da das Label durch beide Ereignisse geleert wird, falls in einem der beiden Felder was drin steht.
 
Moin moin,
erstmal vielen dank, endlich weiß ich wo der Fehler liegt ^^
Habe es mal ausprobiert und das Labelfeld wird wirklich durch eines der anderen Felder gelöscht. Komisch nur das der beim Debuggen da gar nicht rein geht :confused:
Habe da auch mal einen Haltepunkt gesetzt, aber da ist da nicht reingegangen.
Egal, jetzt weiß ich wo ich was ändern muss.

Die Logik ist also falsch, da das Label durch beide Ereignisse geleert wird, falls in einem der beiden Felder was drin steht.

Hast du eine Idee wie ich das Labelfeld sonst leeren könnte? Also so, dass die Fehlermeldung weggeht sobald in dem Feld wieder was drin steht ?
Ich probier aber auch mal rum...

Vielen Dank aber für die Hilfe :)
 
Schreib in das TxtClientnummer_Change und TxtJahr_Change Ereignis:

private sub TxtJahr_Change()
call EingabeKontrolle
END sub

private sub TxtClientNummer_Change()
call EingabeKontrolle
END sub

Dann baue diese Prozedur ein:

Private sub EingabeKontrolle ()
IF TRIM(TxtClientnummer.Text)="" AND TRIM(TxtJahr.Text)="" THEN
lblFehler.caption="Nummer und Jahr eingeben!"
ELSEIF trim(TxtClientnummer.text)="" then
lblfehler.caption="Bitte Nummer eingeben"
ELSEIF trim(TxtJaht.text)="" then
lblfehler.caption="Bitte Jahr eingeben"
ELSE
lblFehler.caption=""
END IF
End sub

Damit sollte es gehen.
 
Jo danke, habe es so gelöst:
Habe für die verschiedenen Felder Abfragen reingesetzt, die Standardmäßig auf "False" gesetzt werden, außer ein Feld ist leer, dann wird es auf "True" gesetzt. Im Else-Zweig wird dann vorher abgefragt, ob die Felder (Tag, Monat, Jahr + Clientnummer) auf False sind, wenn ja löscht er das Label.

Hier ein Beispiel:
Code:
bolJahrPruef = False
    If txtJahr.Text = "" Then
        lblFehler.Caption = "Bitte eine Jahreszahl eingeben!"
        txtJahr.Text = Right$(Date, 4)
        txtJahr.SetFocus
        bolJahrPruef = True
    Else
        If bolTagPruef = False And bolMonatPruef = False And bolJahrPruef = False And bolClientPruef = False Then
            lblFehler.Caption = ""
        End If
    End If

Mit deinem Vorschlag geht es bestimmt auch, habe es eben aber so umgesetzt und las danach erst deinen Beitrag, trotzdem vielen Danke.

Danke an alle die mir bei dem Problem weitergeholfen haben :-)
Gr€€tz AlienShooter
 

Neue Beiträge

Zurück