Benutzer mit den meisten Antworten
Uhrzeit und Datum mit DateTimePicker

Frage
-
Hallo!
Wie kann ich überprüfen, ob in eine MaskedTextBox etwas eingetragen wurde?
Mit .Text = Nothing oder .Text = "" geht es nicht.Gibt es da irgendeine Möglichkeit?
- Bearbeitet Dominik Klasen Mittwoch, 11. August 2010 08:48
Antworten
-
Hallo Dominik,
ich habe Dir mein voriges Beispiel mal noch um das
Verändern der Hintergrundfarben der beiden Textboxen
erweitert:' / Code in Formmodul Form1.vb
Public Class Form1
Private WithEvents mtbDate As MaskedTextBox
Private WithEvents mtbTime As MaskedTextBox
Private lblDate As Label
Private lblTime As Label
Private mDateOK As Boolean
Private mTimeOK As Boolean
Private mD As Date
Private mT As DatePrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateControls()
End SubPrivate Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ShownmtbDate.Focus()
End SubPrivate Sub CreateControls()
Dim Fnt As Font = New Font("Arial", 28)mtbDate = New MaskedTextBox
With mtbDate
.Name = "mtbDate"
.Font = Fnt
.Mask = "00/00/0000"
.TextAlign = HorizontalAlignment.Center
.SetBounds(10, 30, 240, .Height)
End With
Me.Controls.Add(MTBdate)mtbTime = New MaskedTextBox
With mtbTime
.Name = "mtbTime"
.Font = Fnt
.Mask = "90:00:00"
.TextAlign = HorizontalAlignment.Center.SetBounds _
(mtbDate.Right + 10, _
30, 180, .Height)End With
Me.Controls.Add(mtbTime)lblDate = New Label
With lblDate
.Name = "lblDate"
.Font = New Font("Arial", 12)
.AutoSize = True.Location = _
New Point _
(mtbDate.Left, _
mtbDate.Top - .Height).Text = "Datum (dd.MM.yyyy)"
End With
Me.Controls.Add(lblDate)lblTime = New Label
With lblTime
.Name = "lblTime"
.Font = lblDate.Font
.AutoSize = True.Location = _
New Point _
(mtbTime.Left, _
mtbTime.Top - .Height).Text = "Zeit (HH:mm:ss)"
End With
Me.Controls.Add(lblTime)Me.ClientSize = _
New Size _
(mtbTime.Right + 10, _
mtbTime.Bottom + 20)End Sub
Private Sub mtbDate_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbDate.TextChangedIf mtbTime IsNot Nothing Then
mtbTime.Text = ""
End IfIf Date.TryParseExact _
(mtbDate.Text, "dd.mm.yyyy", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.None, _
mD) ThenmtbDate.BackColor = Color.Green
mDateOK = True
mtbTime.Focus()
ElsemDateOK = False
If mtbDate.Text = " . ." Then
mtbDate.BackColor = _
Color.FromKnownColor(KnownColor.Window)
Else
mtbDate.BackColor = Color.Red
End If
End If' Console.WriteLine("mDateOK: " & mDateOK.ToString)
End Sub
Private Sub mtbTime_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbTime.TextChangedIf Date.TryParseExact _
(mtbTime.Text, "HH:mm:ss", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.NoCurrentDateDefault, _
mT) ThenmTimeOK = True
mtbTime.BackColor = Color.Green
If mDateOK Then
MsgBox _
(mD.ToString("dd.MM.yyyy" _
& " " & _
mT.ToString("HH:mm:ss")))mtbDate.Focus()
mtbDate.SelectAll()
End If
ElseIf mtbTime.Text = " : :" Then
mtbTime.BackColor = _
Color.FromKnownColor(KnownColor.Window)
Else
mtbTime.BackColor = Color.RedEnd If
mTimeOK = False
End If' Console.WriteLine("mTimeOK: " & mTimeOK.ToString)
End Sub
End Class
' \\\ E N T EDas Beispiel arbeitet wie das vorige auch, es werden nun lediglich
die Textboxen bei gültigem Datum bzw. gültiger Zeit grün und bei
ungültigem Datum bzw. ungültiger Zeit rot hinterlegt. Sind die
Textboxen leer (nur Maske) dann wird der Hintergrund weiss.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Thorsten Dörfler Samstag, 14. August 2010 19:43
Alle Antworten
-
Hallo Dominik,
Wie kann ich überprüfen, ob in eine MaskedTextBox etwas eingetragen wurde?
wie sieht denn Deine Mask Eigenschaft aus, was hast Du dort eingetragen? Es ist nur bedingt richtig, dass ein leerer String zurückgegeben wird. Dies hängt nämlich von der eingegebenen Maske ab. Bei der Maske "00000" bspw. bekommt man eine leere Zeichenfolge (nicht Nothing!), die Maske "00.00" gibt jedoch 3 Zeichen " ," zurück auch wenn nichts eingegeben wurde. Zuverlässiger ist hier über die Eigenschaften MaskCompleted und MaskFull zu arbeiten, um zu prüfen, ob der Anwender die Maske vollständig ausgefüllt hat.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
Ich hab es versucht mit MaskFull. Leider geht das dann doch irgendwie nicht.
Habe ja eine If-Abfrage (Wenn "MaskFull" Dann soll er einen Timer starten, wenn nicht soll eine "Fehlermeldung" kommen. Also zum Beispiel "Es fehlen Angaben".
Meine Maske ist einmal auf
Datum (also xx.xx.xxxx) gestellt und die zweite auf
Benutzerdefiniert (xx:xx:xx , für Uhrzeit mit Sekundenangabe)LG
Dominik -
Hallo Dominik,
Ich hab es versucht mit MaskFull. Leider geht das dann doch irgendwie nicht.
Wenn Du genauer schilderst, was Du bisher unternommen hast und was nicht geht, könnte man Dir zielführender helfen. Hilfreich sind etwas Code oder auch die Bereitstellung eines einfachen Beispielprojekts via Skydrive, wenn sich das Problem mit Code nicht ausreichend darstellen lässt.
Habe ja eine If-Abfrage (Wenn "MaskFull" Dann soll er einen Timer starten, wenn nicht soll eine "Fehlermeldung" kommen. Also zum Beispiel "Es fehlen Angaben".
Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs _ ) Handles Me.Load ' Mask für Datum dd.mm.yyyy: MaskedTextBox1.Mask = "00/00/0000" ' Mask für Zeit hh:mm:ss: ' MaskedTextBox1.Mask = "90:00:00" End Sub Private Sub Button4_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs _ ) Handles Button4.Click If MaskedTextBox1.MaskFull Then MsgBox("Alle Eingaben erfolgt") Else MsgBox("Es fehlen Eingaben.") End If End Sub End Class
Meine Maske ist einmal auf
Datum (also xx.xx.xxxx) gestellt und die zweite auf
Benutzerdefiniert (xx:xx:xx , für Uhrzeit mit Sekundenangabe)Wenn Du die Mask Eigenschaft tatsächlich so festgelegt hast, kann es nicht funktionieren. Beachte die gültigen Maskierungselemente in der Dokumentation oder wie in meinem Beispiel oben angegeben.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Dominique,
für eine Datums- oder Zeiteingabe wäre ggf. ein:[DateTimePicker-Steuerelement (Windows Forms)]
http://msdn.microsoft.com/de-de/library/4xyy1csh.aspxmit der Format-Eigenschaft auf Time bzw. Short (oder CustomFormat) besser.
ciao Frank- Als Antwort markiert Dominik Klasen Montag, 9. August 2010 19:49
- Tag als Antwort aufgehoben Dominik Klasen Montag, 9. August 2010 21:30
-
Hallo Dominik,
Dein Code sah für mich schon ganz vielversprechend aus. Die Frage dich ich mir allerdings stelle ist die, warum du die Ereignisse auf FormLoad und ButtonClick ausführst.
Wenn du nich an anderer Stelle Werte ausliest (z.B. über mySettings) wird die MaskedTextBox leer sein und du autimatisch mit jedem Programmstart eine Meldung bekommen, dass du noch nichts eingetragen hast.
Wenn ich deine Frage richtig verstehe, möchtest du, dass was passiert, wenn dein MaskedtextBox1 vollständig ausgefüllt ist.
Dann probier mal den Code MaskedTextBox1_TextChanged aus.
Den Rest brauchst du dann vermutlich nicht mehr. Und das was passiert, wenn dein Ereignis eintritt, bestimmst du dann selber J
Public Class Form1
Private Sub MaskedTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MaskedTextBox1.TextChanged
If MaskedTextBox1.MaskFull Then
MaskedTextBox1.ForeColor = Color.Green
MaskedTextBox1.Font = New Font("Arial", 12, FontStyle.Bold)
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If MaskedTextBox1.MaskFull Then
MsgBox("Alle Eingaben erfolgt")
Else
MsgBox("Es fehlen Eingaben.")
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Mask für Datum dd.mm.yyyy:
MaskedTextBox1.Mask = "00,00,0000"
If MaskedTextBox1.MaskFull Then
MsgBox("Alle Eingaben erfolgt")
Else
MsgBox("Es fehlen Eingaben.")
End If
End Sub
End Class
Viel Glück
Liebe Grüße Stefan -
Hallo Stefan,
Hallo Dominik,
Dein Code sah für mich schon ganz vielversprechend aus. Die Frage dich ich mir allerdings stelle ist die, warum du die Ereignisse auf FormLoad und ButtonClick ausführst.
verwechselst Du da vielleicht gerade etwas, oder sehe ich hier einen Beitrag nicht? Das Beispiel in meinem Beitrag mit Form.Load und Button.Click hatte ich mir jetzt mal einfach aus den Finger gesogen. In Form.Load wird die passende Maske initialisiert. Das kann auch über den Designer erfolgen, für die Demonstration hier erschien mir dieser Weg jedoch vorteilhafter. Button.Click ist sinnvoll, wenn man den Anwender mit einer MessageBox "loben oder tadeln" möchte. Im TextChanged macht das mit der MaskFull - Eigenschaft nicht wirklich Spaß, da der Anwender ja zunächst paar Zeichen eingeben muss, bevor eine Aussage über die Vollständigkeit getroffen werden kann. Hier würde ggf. auch das MaskInputRejected Ereignis sinnvolle Dienste leisten.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Mask für Datum dd.mm.yyyy:
MaskedTextBox1.Mask = "00,00,0000"
Das hättest Du schon ruhig richtig aus meinem Beispiel mit "00/00/0000" übernehmen können. Mit deutschen Regionaleinstellungen kommt bei dem von Dir gewählten Format zwar auch ein '.' raus, dieser ist aber das Tausender-Trennzeichen, der auf einem System mit englischen Regionaleinstellungen als ',' ausgegeben wird. Die Eingabe ist so nicht mehr sinnvoll über DateTime.(Try)Parse verwertbar.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
... ist wohl eher so, dass ich da ggf. zu ungenau gelesen habe. Jedenfalls habe ich verdaddelt, dass der Code mit FormLoad und ButtonClick von dir kam. Der Rest ist vermutlich Geschmacksache.
Ich habe den Code bzw. einen Teil davon aus meinem aktuellen Programm in dem ich zwei Eingaben nämlich Urlaubsanfang und Urlaubsende abfrage und erst dann, wenn beide Angaben komplett sind, der Button zum speichern Enabled= True ist.
In diesem Fall schien es mir sinnvoll, wenn beispielsweise mit Vollenden von maskedtextBox1 der Focus gleich an MaskedTexBox2 übergeben wird und der Button1 erst dann enabled = true wird, wenn MaskedtextBox1 vollständig ist und verlassen wird.
Das mit deinem Beispiel "00/00/0000" tut mir leid. Das wusste ich einfach nicht besser und hat in meinem Code in meinem Programm ja auch geklappt. Also habe ich wieder was dazu gelernt. Danke.
Liebe Grüße Stefan -
Also:
Ich habe:
If MaskedTextBox1.MaskFull Then
MsgBox("Alles Eingegeben")
Else
MsgBox("Es Fehlen Angaben!", MsgBoxStyle.Critical)
End IfWenn die Maske nicht voll ist, geschieht nichts, aber es kommt auch keine Meldung.
Woran könnte das denn liegen?
//Edit: Das mit dem DateTimePicker ist eine Lösung, ist dann aber doch zu kompliziert, denn da ist ja das Datum und Uhrzeit, ob man will oder nicht. //Edit2: Wie kann ich verhindern dass zum Beispiel bei der Maske hh:mm:ss im vorderen Bereich was größeres als 23, im zweiten Bereich was höheres als 59 und im letzten Bereich was höheres als 59 eingegeben werden kann?LG
Dominik -
Hallo Dominik,
//Edit: Das mit dem DateTimePicker ist eine Lösung, ist dann aber doch zu kompliziert, denn da ist ja das Datum und Uhrzeit, ob man will oder nicht. //Edit2: Wie kann ich verhindern dass zum Beispiel bei der Maske hh:mm:ss im vorderen Bereich was größeres als 23, im zweiten Bereich was höheres als 59 und im letzten Bereich was höheres als 59 eingegeben werden kann?
da ist eigentlich nichts kompliziertes dran. Das angezeigte Format kannst Du, wie Frank bereits schrieb, über die Format-Eigenschaft bzw. CustomFormat-Eigenschaft so festlegen, wie Du es gerne haben möchtest. Für die Eingabe einer Uhrzeit, kannst Du zum Beispiel folgende Eigenschaften setzen:
DateTimePicker1.Format = DateTimePickerFormat.Time DateTimePicker1.ShowUpDown = True
Auslesen kannst Du den Zeitanteil dann über:
Debug.Print("Hour: {0}; Minute {1}; Second {2}", _ DateTimePicker1.Value.Hour, _ DateTimePicker1.Value.Minute, _ DateTimePicker1.Value.Second)
Für die Anzeige des kurzen Datums (Standard dt. Regionaleinstellungen: 'dd.MM.yyyy'), kannst Du folgendes verwenden:
DateTimePicker1.Format = DateTimePickerFormat.Short DateTimePicker1.ShowUpDown = False
Zugriff auf das Datum bspw.:
Debug.Print("Day: {0}; Month {1}; Year {2}", _ DateTimePicker1.Value.Day, _ DateTimePicker1.Value.Month, _ DateTimePicker1.Value.Year)
DateTimePicker.Value.Date gibt Dir das Datum ohne Zeitanteil bzw. 00:00:00 zurück. Wichtig ist hier, dass Du mit dem Datum (DateTimePicker.Value) weiterarbeitest und dieses nur dann in eine Zeichenfolge wandelst, wenn Du es als Zeichenfolge brauchst. Bei der Formatierung => Ausgabe bestimmst Du dann wieder, wie der Wert dargestellt wird. Insgesamt ist der DateTimePicker die bessere Alternative zur MaskTextBox und erlaubt auch die vollständige Eingabevalidierung, die bei der MaskTextBox manuell vorzusehen ist (max. 23 Stunden, 59 Minuten und 59 Sekunden).
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
Wie kann ich das "Debug.Print("...")" so verwenden, dass ich anschließend in einer Variable die Zeit stehen habe?
Irgendwie versteh ich es nicht so ganz, wie das funktionieren soll.Ich hoffe du (und natürlich auch die anderen) verstehst/verstehen mein Problem. Bin nämlich auch erst seit gut einem halben Jahr dabei und bin noch dabei zu lernen, und dass mache ich auch nicht rund um die Uhr, vielleicht 1 Mal in der Woche.
LG
Dominik -
Hallo Dominik,
Wie kann ich das "Debug.Print("...")" so verwenden, dass ich anschließend in einer Variable die Zeit stehen habe?
Dim lTime As Date = DateTimePicker1.Value
In lDate steht Dir Datum + Uhrzeit als Variable zur Verfügung. Auf die einzelnen Bestandteile der Zeit, kannst Du wie bereits gezeigt zugreifen. Wenn Du eine Darstellung als Zeichenfolge wünschst, musst Die Ausgabe entsprechend formatieren:
Dim lStr As String = lTime.ToString("HH:mm:ss")
Es hängt aber davon ab, wie Du die eingegebene Zeit weiterverarbeiten möchtest, welche Varianten hier sinnvoll ist. TimeSpan stellt auch eine Art dar mit Zeitwerten zu arbeiten. Was möchtest Du mit dem Wert machen?
Bin nämlich auch erst seit gut einem halben Jahr dabei und bin noch dabei zu lernen
Jeder hat mal klein angefangen. Aber bitte habe Verständnis dafür, dass das Forum hier keinen Ersatz für ein gutes Buch sein kann und Du Dich selber darum kümmern musst, entsprechende Grundlagen anzueignen. Empfehlenswert ist hier, falls Du das noch nicht kennst:
Galileo OpenBook - Einstieg in Visual Basic 2010
http://openbook.galileocomputing.de/einstieg_vb_2010/
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
ich möchte den Wert so verwenden, dass wenn die aktuelle Systemzeit der eingegebenen Zeit entspricht, soll er den weiteren Code ausführen (In meinem Fall zum Beispiel herunterfahren, das ist aber nicht das entscheidende).
Ich habe auch schon versucht eine Variable mit dem .Value zu füllen, daber dann habe ich bei Time zum beispiel diesen Wert: 10.09.2010 23:23:42
Bei der Eigenschaft Short habe ich 10.09.2010 23:23. Das ist ja mein Problem.Aber bitte habe Verständnis dafür, dass das Forum hier keinen Ersatz für ein gutes Buch sein kann und Du Dich selber darum kümmern musst, entsprechende Grundlagen anzueignen. Empfehlenswert ist hier, falls Du das noch nicht kennst
Und nur mal so: Ich habe drei Openbooks über Visual Basic, das oben genannte, VB .Net und VisualBasic 2008.
Aber entweder bin ich zu blöd um etwas zu diesem Thma zu finden oder es steht nicht drin? Ich hab auf jeden Fall in allen drei nichts gefunden.
Und mal ehrlich: Wenn ich wirklich etwas will, dann schau ich dass ich dafür auch Resourcen (wie Bücher, Hilfsdokumente, Tutorials ...) finde. Ist ja auch nicht so dass ich mich nicht bemühen würde etwas zu diesem Thema zu finden. Ich finde einfach nichts. Google versagt komplett, in anderen Foren gibts blöde Antworten. Dass kann ich nicht gebrauchen. Vor allem wenn dann so etwas kommt wie "Schau Google, Schau hier, Schau da, Schau Buch (und dann eine Kaufempfehlung für ein mit 2 Sternen bewertetes Buch für 60€)
Auf sofwas kann ich echt verzichten. Für euch sind Anfänger immer gleich: Anfänger? -> Kann nix -> Wills nicht können -> zu blöd dafür!
Da brauchen wir auch nicht zu diskutieren, ich probiere es ein letztes Mal, wenn es nicht klappt dann halt Pech, gibt ja auf dieser Welt nichts was so klappt wie es soll, ich entwickle mich einfach wieder zu einem DAU (Dümmster anzunehmender User) zurück. Ganz einfach! -
Hallo Dominik,
ich möchte den Wert so verwenden, dass wenn die aktuelle Systemzeit der eingegebenen Zeit entspricht, soll er den weiteren Code ausführen (In meinem Fall zum Beispiel herunterfahren, das ist aber nicht das entscheidende).
Ich habe auch schon versucht eine Variable mit dem .Value zu füllen, daber dann habe ich bei Time zum beispiel diesen Wert: 10.09.2010 23:23:42
Bei der Eigenschaft Short habe ich 10.09.2010 23:23. Das ist ja mein Problem.Das Problem wirst Du bei Datum bzw. besonders Zeitwerten immer haben. Die aktuelle Systemzeit wird sogar mit Millisekunden angegeben. Wenn Du hier einen Vergleich durchführen möchtest, musst Du beide Daten in ein einheitliches Format bringen oder Du kannst die DateDiff Funktion verwenden, um die Differenz zwischen zwei Daten zu ermitteln. Dabei bestimmst Du über den Parameter interval, auf welche Einheit heruntergerechnet wird und hast so auch eine entsprechende Genauigkeit des Ergebnisses:
If DateDiff(DateInterval.Minute, DateTimePicker1.Value, Now) = 0 Then MsgBox("Aktion") End If
Wenn Du rein mit den Zeitanteilen arbeiten möchtest, hilft Dir die TimeOfDay Eigenschaft des Date Datentyp weiter:
If DateTimePicker1.Value.TimeOfDay.Subtract(Now.TimeOfDay).Minutes = 0 Then MsgBox("Aktion") End If
Beachte, dass Du genauso gut mit Seconds, oder Hours arbeiten kannst, je nachdem, wie genau Du Dir das Ergebnis wünschst. Die Dokumentation zur DateTime Struktur, geht auf das Thema noch etwas genauer ein und erläutert auch die Unterschiede zu TimeSpan bzw. sinnvolle Einsatzgebiete.
Und nur mal so: Ich habe drei Openbooks über Visual Basic, das oben genannte, VB .Net und VisualBasic 2008.
Aber entweder bin ich zu blöd um etwas zu diesem Thma zu finden oder es steht nicht drin?Ein Buch kann natürlich nicht jedes Thema im Detail behandeln. Mein Hinweis kam daher, da Dich scheinbar mein Beispiel mit Debug.Print zu verwirren schien und ich den Eindruck hatte, dass Dir das Grundlagenthema Variablenzuweisung unklar ist. Entschuldige bitte, wenn ich das hier falsch aufgefasst habe.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort markiert Dominik Klasen Mittwoch, 11. August 2010 10:54
- Tag als Antwort aufgehoben Dominik Klasen Mittwoch, 11. August 2010 12:52
-
Hallo Thorsten!
Also ich will es eigentlich nur auf die Sekunde genau, Millisekunden brauche ich nicht. Also kann ich den oben geschriebenen Code auch in
If DateTimePicker1.Value.TimeOfDay.Subtract(Now.TimeOfDay).Seconds = 0 Then MsgBox("Aktion") End If
umschreiben, damit das bei Sekunden funktioniert? Bevor ich jetzt meinen schon unübersichtlichen Code umschreibe, frage ich lieber dich =D
Tut mir leid wenn ich mich blöd dran stelle. Ist im Moment alles etwas stressig zu Hause :)
Und mit dem Buch: Ich hab mir das glaube ich schon 3 Mal durchgelesen und probiert, doch mit Schule und Stress vergisst man dass doch recht schnell wieder.
LG
Dominik -
Hallo Dominik,
Also ich will es eigentlich nur auf die Sekunde genau, Millisekunden brauche ich nicht. Also kann ich den oben geschriebenen Code auch in
If DateTimePicker1.Value.TimeOfDay.Subtract(Now.TimeOfDay).Seconds = 0 Then MsgBox("Aktion") End If
umschreiben, damit das bei Sekunden funktioniert?
Yep, so ist es.
Vielleicht noch der Hinweis: Wenn Du mit einem Timer arbeitest, was ich jetzt mal vermute, solltest Du dessen Intervall nicht auf 1000 ms (1 Sek) setzen, sondern niedriger (ca. 600 ms), da es sonst vorkommen kann, dass Dein Timer genau dann auslöst, wenn der Zeitpunkt bereits überschritten ist.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Dominik,
ich bin mir immer noch nicht sicher, ob ich dein Problem ganz verstanden habe. Du hast ein MaskedTextBox in das du eine Uhrzeit eingibst. Das Format 00:00 oder 00:00:00 bestimmst du selber.
Du möchtest nun in diese MaskedTextBox eine Uhrzeit eingeben und – wenn ich das richtig lese – quasi bei der Eingabe prüfen, ob deine eingegeben Uhrzeit mit der Systemzeit des PC übereinstimmt. In Abhängigkeit der Prüfung soll dann was passieren?
Da sich die Systemzeit sekündlich ändert, ist das natürlich eine Art Roulett.
Ich würde das als ausreichend genau einstufen, wenn mit dem Öffnen des Formulars die aktuelle Systemzeit ermittelt und als gegeben übernommen wird. Wenn das nicht deine Absicht ist, musst du diese an der Stelle aktualisieren, die dir als passend erscheint.
Für Versuchszwecke würde ich mir die Systemzeit auf einem Label anzeigen lassen. (Kannste später ggf. unsichtbar machen, der Vergleich ist dennoch möglich).
Wenn du dann möchtest, dass der Vergleich bereits erfolgt, wenn du eine Eingabe machst, dann musst du das mit dem TextChanged-Event machen.
Probier doch mal den nachstehenden Code:
Wenn du die Prüfung lieber auf Abruf machst, nehme den Button1_Click-Code. Du kannst dich für den Code entscheiden, der deiner Vorstellung am ehesten entspricht.
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
MaskedTextBox1.Mask = "00:00:00"
Label1.Text = TimeOfDay
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If MaskedTextBox1.MaskFull Then
If MaskedTextBox1.Text = Label1.Text Then
MsgBox("Übereinstimmung!", MsgBoxStyle.Information)
Else
MsgBox("Abweichung!", MsgBoxStyle.Exclamation)
End If
End If
End Sub
Private Sub MaskedTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MaskedTextBox1.TextChanged
If MaskedTextBox1.MaskFull Then
If MaskedTextBox1.Text = Label1.Text Then 'Könntest auch TimeOfDay einsetzen gibt aber Probleme
MsgBox("Übereinstimmung!", MsgBoxStyle.Information)
Else
MsgBox("Abweichung!", MsgBoxStyle.Exclamation)
End If
End If
End Sub
End Class
Natürlich kannst du die Anzeige der Systemzeit auch über einen Timer mit dem Intervall 1000 aktualisieren lassen. Dann hast du aber das beschriebene Problem, dass deine Bedingung nur dann erfüllt ist, wenn du deine Eingabe auf die 1/00 Sekunde genau mit der Systemzeit übereinstimmt.
Liebe Grüße Stefan -
@Thorsten
Ja ich arbeite mit einem Timer. Dessen Interval habe ich auf 100 stehen :-P
// Geht nicht. Ich brauche die komplette Zeit: zum Beispiel 13:23:22. Wenn ich den Code umschreibe passiert nichts.
// Datum: Ich brauche auch das Datum komplett, also zum Beispiel 12.12.2012
Sonst würde das funktionieren...
@Stefan
Die Maske war auf 00:00:00 für die Sekundeneingabe gestellt.
Nein, nicht während der Eingabe. Das mit der Eingabe in die MaskedTextBox war so gemeint: Es sollte überprüft werden, ob etwas in einer MaskedTextBox steht. Wenn die Maske "voll" war sollte dies in eine Variable geschrieben werden und mit (wie bei dir auch) mit einem Label verglichen werden, in dem "TimeOfDay" steht.
Wenn dann halt die eingegebene Zeit der Zeit (TimeOfDay) entspricht, sollte halt etwas passieren.
Aber das hat sich ja durch die Ablösund des DateTimePickers erledigt! -
Hallo Dominik,
Wie kann ich überprüfen, ob in eine MaskedTextBox etwas eingetragen
wurde?
Mit .Text = Nothing oder .Text = "" geht es nicht.
Gibt es da irgendeine Möglichkeit?Wenn ich Deine übrigen Fragen zu diesem Thema richtig verstanden habe,
möchtest du in eine erste TextBox (MaskedTextbox) ein Datum und in eine
zweite TextBox (MaskedTextbox) eine Uhrzeit eintragen und immer dann,
wenn sowohl ein gültiges Datum als auch eine gültige Uhrzeit eingetragen
worden sind, soll etwas geschehen.So weit richtig?
Im folgenden Beispiel gibt es zwei MaskedTextBoxen (mtbDate für das
Datum und mtbTime für die Zeit).Kopiere das nachfolgende Beispiel einfach in ein leeres Formmodul (Form1.vb)-
' / Beginn Code Form1.vb
Public Class Form1
Private WithEvents mtbDate As MaskedTextBox
Private WithEvents mtbTime As MaskedTextBox
Private lblDate As Label
Private lblTime As Label
Private mDateOK As Boolean
Private mTimeOK As Boolean
Private mD As Date
Private mT As DatePrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateControls()
End SubPrivate Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ShownmtbDate.Focus()
End SubPrivate Sub CreateControls()
Dim Fnt As Font = New Font("Arial", 28)mtbDate = New MaskedTextBox
With mtbDate
.Name = "mtbDate"
.Font = Fnt
.Mask = "00/00/0000"
.TextAlign = HorizontalAlignment.Center
.SetBounds(10, 30, 240, .Height)
End With
Me.Controls.Add(MTBdate)mtbTime = New MaskedTextBox
With mtbTime
.Name = "mtbTime"
.Font = Fnt
.Mask = "90:00:00"
.TextAlign = HorizontalAlignment.Center.SetBounds _
(mtbDate.Right + 10, _
30, 180, .Height)End With
Me.Controls.Add(mtbTime)lblDate = New Label
With lblDate
.Name = "lblDate"
.Font = New Font("Arial", 12)
.AutoSize = True.Location = _
New Point _
(mtbDate.Left, _
mtbDate.Top - .Height).Text = "Datum (dd.MM.yyyy)"
End With
Me.Controls.Add(lblDate)lblTime = New Label
With lblTime
.Name = "lblTime"
.Font = lblDate.Font
.AutoSize = True.Location = _
New Point _
(mtbTime.Left, _
mtbTime.Top - .Height).Text = "Zeit (HH:mm:ss)"
End With
Me.Controls.Add(lblTime)Me.ClientSize = _
New Size _
(mtbTime.Right + 10, _
mtbTime.Bottom + 20)End Sub
Private Sub mtbDate_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbDate.TextChangedIf mtbTime IsNot Nothing Then
mtbTime.Text = ""
End IfIf Date.TryParseExact _
(mtbDate.Text, "dd.mm.yyyy", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.None, _
mD) ThenmDateOK = True
mtbTime.Focus()
Else
mDateOK = False
End If' Console.WriteLine("mDateOK: " & mDateOK.ToString)
End Sub
Private Sub mtbTime_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbTime.TextChangedIf Date.TryParseExact _
(mtbTime.Text, "HH:mm:ss", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.NoCurrentDateDefault, _
mT) ThenmTimeOK = True
If mDateOK Then
MsgBox _
(mD.ToString("dd.MM.yyyy" _
& " " & _
mT.ToString("HH:mm:ss")))mtbDate.Focus()
mtbDate.SelectAll()
End If
Else
mTimeOK = True
End If' Console.WriteLine("mTimeOK: " & mTimeOK.ToString)
End Sub
End Class
' \\\ E N T ENach dem Programmstart siehst Du die Form mit den beiden
MaskedTextboxen für Datum u. Zeit.
Die Textbox für das Datum hat den Focus.Nur wenn in die linke Textbox ein gültiges Datum eingetragen worden
ist, wechselt der Focus auf die rechte Textbox zur Eingabe einer Uhrzeit.
Nur wenn in der linken Textbox eine gültiges Datum UND in der rechten
eine gültige Uhrzeit eingetragen worden ist, erhältst Du eine MsgBox
welche die in den Textboxen eingetragenen Werte für Datum u. Zeit
anzeigt.
Nach dem Schliessen der MsgBox wechselt der Focus wieder auf die
linke Textbox und das Spiel (Eingabe von Datum u. Zeit) kann erneut
beginnen.Die Prüfung des eingegebenen Datums sowie der Uhrzeit erfolgt im
Beispiel durch Date.TrypParseExact(). Damit muss das Datum exakt
im Format "dd.MM.yyyy" und die Zeit exakt im Format "HH:mm:ss"
eingegeben werden. Andere, weniger restriktive Eingabeformatvorgaben
kannst Du mit Hilfe von Date.TrypParse() realisieren.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen) -
Hallo Peter,
werde das mal versuchen (mit Mühe und Not ;) )
Falls es klappen sollte bedanke ich mich im Voraus.
Melde mich erneut wenn ich Ergebnisse hab.
//Ehhh...: Ich habe eine Frage:(MaskedTextBox1_TextChanged)
If Date.TryParseExact _ (MaskedTextBox1.Text, "HH:mm:ss", _ Globalization.CultureInfo.CurrentCulture, _ Globalization.DateTimeStyles.NoCurrentDateDefault, _ mT) Then MaskedTextBox1.BackColor = Color.Green Else MaskedTextBox1.BackColor = Color.Red End If
(MaskedTextBox2_TextChanged)If MaskedTextBox2 IsNot Nothing Then MaskedTextBox2.Text = "" End If If Date.TryParseExact _ (MaskedTextBox2.Text, "dd.mm.yyyy", _ Globalization.CultureInfo.CurrentCulture, _ Globalization.DateTimeStyles.None, _ mD) Then MaskedTextBox2.BackColor = Color.Green Else MaskedTextBox2.BackColor = Color.Red End If
Kann ich das so machen? Oder habe ich da jetzt einen Denkfehler drin?
Denn bei der MaskedTextBox MaskedTextBox2 kann ich zwar ein Zeichen eingeben, aber: Ich sehe dieses nicht und zweitens ich kann keine weiteren Zeichen eingeben!//Fehler Gefunden: Der Fehler mit dem einen Zeichen liegt hier, nur warum?:
If MaskedTextBox2 IsNot Nothing Then MaskedTextBox2.Text = "" End If
Falls du dich/sich jemand fragt, wie ich darauf komme:
Ich habe 2 Masked Text Boxen aus der Tool Box genommen und sie auf die Form gelegt. Dann habe ich halt eingestellt. Danach ein TextChanged-Event angelegt in dem ich diesen Code eingefügt habe.
LG
Dominik- Bearbeitet Dominik Klasen Mittwoch, 11. August 2010 14:51 Frage
-
Hallo Dominik,
werde das mal versuchen (mit Mühe und Not ;) )
Na ja, den Code musst Du ja nur in ein leeres Formmodul
kopieren.
Die Mühe dabei dürfte sich in Grenzen halten.Falls es klappen sollte bedanke ich mich im Voraus.
Es wir klappen.
Melde mich erneut wenn ich Ergebnisse hab.
//Ehhh...: Ich habe eine Frage:
(MaskedTextBox1_TextChanged)If Date.TryParseExact _ (MaskedTextBox1.Text, "HH:mm:ss", _ Globalization.CultureInfo.CurrentCulture, _ Globalization.DateTimeStyles.NoCurrentDateDefault, _ mT) Then </blockquote> Wenn Date.TrypParseExact ein True zurückgibt, bedeutet dies, dass ein gültiger Zeitausdruck in MaskedTextBox1.Text erkannt worden ist. Welchen Code Du auf dieses Ergebnis folgen lässt, ist Deiner Phantasie überlassen. Natürlich kann das auch Code sein, der die Hintergrundfarbe der MaskedTextbox1 beeinflusst. <blockquote> MaskedTextBox1.BackColor = Color.Green Else MaskedTextBox1.BackColor = Color.Red End If
(MaskedTextBox2_TextChanged)
If MaskedTextBox2 IsNot Nothing Then MaskedTextBox2.Text = "" End If If Date.TryParseExact _ (MaskedTextBox2.Text, "dd.mm.yyyy", _ Globalization.CultureInfo.CurrentCulture, _ Globalization.DateTimeStyles.None, _ mD) Then MaskedTextBox2.BackColor = Color.Green Else MaskedTextBox2.BackColor = Color.Red End If
Kann ich das so machen?
Ja, prinzipiell kannst Du das so machen.
Bei gültigem Datum bzw. gültiger Zeit wird Backcolor der jeweiligen
Textbox grün, bei ungültigem Datum oder ungültiger Zeit wird
Backcolor der jeweiligen Textbox rot.Oder habe ich da jetzt einen Denkfehler drin?
Nein, bis hierher passt das schon.
Denn bei der MaskedTextBox MaskedTextBox2 kann ich zwar ein
Zeichen eingeben, aber: Ich sehe dieses nicht und zweitens ich kann
keine weiteren Zeichen eingeben!Wenn Du meinen OriginalCode aus meinem vorigen Posting
verwendest kannst Du ein vollständiges Datum und eine
vollständige Zeit eingeben.
Ich vermute, Du hast die Mask-Eigenschaft Deiner maskedTextbox2
unpassend eingestellt.
Wie sieht Deine MaskedTextBox2.Mask konkret aus?//Fehler Gefunden: Der Fehler mit dem einen Zeichen liegt hier, nur warum?:
If MaskedTextBox2 IsNot Nothing Then MaskedTextBox2.Text = "" End If
Dieses Codestück in meiner Sub mtb_TextChanged
If mtbTime IsNot Nothing Then
mtbTime.Text = ""
End Ifdient dazu, den Inhalt der Textbox für das Datum zu löschen, wenn
ein neues Datum eingegeben wird. Die dabei verwendete Abfrage
auf IsNot Nothing verhindert, dass auf mtbTime zugegriffen wird, wenn
diese noch gar nicht existiert.
Nachdem in Sub CreateControls die MaskedTextbox mtbDate instanziert
und eingestellt worden ist, wird das Ereignis mtbDate_TextChanged
ausgelöst. Zu diesem Zeitpunkt existiert aber noch keine Instanz der
mtbDate, mtbDate ist also noch Nothing.Falls du dich/sich jemand fragt, wie ich darauf komme:
Ich habe 2 Masked Text Boxen aus der Tool Box genommen und sie
auf die Form gelegt. Dann habe ich halt eingestellt.Und was genau hast Du da eingestellt?
Danach ein TextChanged-Event angelegt in dem ich diesen Code
eingefügt habe.Im Prinzip alles genauso wie bei meinem Code, bei dem die
Textboxen eben nicht via Designer sondern via eigenem Code
(in Sub CreateControls) erstellt werden, was letztlich zum selben
Ergebnis führt.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen) -
Hallo Dominik,
ich habe Dir mein voriges Beispiel mal noch um das
Verändern der Hintergrundfarben der beiden Textboxen
erweitert:' / Code in Formmodul Form1.vb
Public Class Form1
Private WithEvents mtbDate As MaskedTextBox
Private WithEvents mtbTime As MaskedTextBox
Private lblDate As Label
Private lblTime As Label
Private mDateOK As Boolean
Private mTimeOK As Boolean
Private mD As Date
Private mT As DatePrivate Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.LoadCreateControls()
End SubPrivate Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ShownmtbDate.Focus()
End SubPrivate Sub CreateControls()
Dim Fnt As Font = New Font("Arial", 28)mtbDate = New MaskedTextBox
With mtbDate
.Name = "mtbDate"
.Font = Fnt
.Mask = "00/00/0000"
.TextAlign = HorizontalAlignment.Center
.SetBounds(10, 30, 240, .Height)
End With
Me.Controls.Add(MTBdate)mtbTime = New MaskedTextBox
With mtbTime
.Name = "mtbTime"
.Font = Fnt
.Mask = "90:00:00"
.TextAlign = HorizontalAlignment.Center.SetBounds _
(mtbDate.Right + 10, _
30, 180, .Height)End With
Me.Controls.Add(mtbTime)lblDate = New Label
With lblDate
.Name = "lblDate"
.Font = New Font("Arial", 12)
.AutoSize = True.Location = _
New Point _
(mtbDate.Left, _
mtbDate.Top - .Height).Text = "Datum (dd.MM.yyyy)"
End With
Me.Controls.Add(lblDate)lblTime = New Label
With lblTime
.Name = "lblTime"
.Font = lblDate.Font
.AutoSize = True.Location = _
New Point _
(mtbTime.Left, _
mtbTime.Top - .Height).Text = "Zeit (HH:mm:ss)"
End With
Me.Controls.Add(lblTime)Me.ClientSize = _
New Size _
(mtbTime.Right + 10, _
mtbTime.Bottom + 20)End Sub
Private Sub mtbDate_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbDate.TextChangedIf mtbTime IsNot Nothing Then
mtbTime.Text = ""
End IfIf Date.TryParseExact _
(mtbDate.Text, "dd.mm.yyyy", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.None, _
mD) ThenmtbDate.BackColor = Color.Green
mDateOK = True
mtbTime.Focus()
ElsemDateOK = False
If mtbDate.Text = " . ." Then
mtbDate.BackColor = _
Color.FromKnownColor(KnownColor.Window)
Else
mtbDate.BackColor = Color.Red
End If
End If' Console.WriteLine("mDateOK: " & mDateOK.ToString)
End Sub
Private Sub mtbTime_TextChanged _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mtbTime.TextChangedIf Date.TryParseExact _
(mtbTime.Text, "HH:mm:ss", _
Globalization.CultureInfo.CurrentCulture, _
Globalization.DateTimeStyles.NoCurrentDateDefault, _
mT) ThenmTimeOK = True
mtbTime.BackColor = Color.Green
If mDateOK Then
MsgBox _
(mD.ToString("dd.MM.yyyy" _
& " " & _
mT.ToString("HH:mm:ss")))mtbDate.Focus()
mtbDate.SelectAll()
End If
ElseIf mtbTime.Text = " : :" Then
mtbTime.BackColor = _
Color.FromKnownColor(KnownColor.Window)
Else
mtbTime.BackColor = Color.RedEnd If
mTimeOK = False
End If' Console.WriteLine("mTimeOK: " & mTimeOK.ToString)
End Sub
End Class
' \\\ E N T EDas Beispiel arbeitet wie das vorige auch, es werden nun lediglich
die Textboxen bei gültigem Datum bzw. gültiger Zeit grün und bei
ungültigem Datum bzw. ungültiger Zeit rot hinterlegt. Sind die
Textboxen leer (nur Maske) dann wird der Hintergrund weiss.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Thorsten Dörfler Samstag, 14. August 2010 19:43