none
Uhrzeit und Datum mit DateTimePicker RRS feed

  • 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?

    Samstag, 7. August 2010 19:35

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 Date

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            mtbDate.Focus()
        End Sub

        Private 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.TextChanged

            If mtbTime IsNot Nothing Then
                mtbTime.Text = ""
            End If

            If Date.TryParseExact _
                    (mtbDate.Text, "dd.mm.yyyy", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.None, _
                     mD) Then

                mtbDate.BackColor = Color.Green

                mDateOK = True
                mtbTime.Focus()
            Else

                mDateOK = 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.TextChanged

            If Date.TryParseExact _
                    (mtbTime.Text, "HH:mm:ss", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.NoCurrentDateDefault, _
                     mT) Then

                mTimeOK = 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
            Else

                If mtbTime.Text = "  :  :" Then
                    mtbTime.BackColor = _
                        Color.FromKnownColor(KnownColor.Window)
                Else
                    mtbTime.BackColor = Color.Red

                End If

                mTimeOK = False
            End If

            ' Console.WriteLine("mTimeOK: " & mTimeOK.ToString)
        End Sub
    End Class
    ' \\\ E N T E

    Das 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)

    Mittwoch, 11. August 2010 18:35

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
    Sonntag, 8. August 2010 11:40
  • 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

    Sonntag, 8. August 2010 18:36
  • 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
    Sonntag, 8. August 2010 19:31
  • Hallo Dominique,

    für eine Datums- oder Zeiteingabe wäre ggf. ein:

    [DateTimePicker-Steuerelement (Windows Forms)]
    http://msdn.microsoft.com/de-de/library/4xyy1csh.aspx

    mit der Format-Eigenschaft auf Time bzw. Short (oder CustomFormat) besser.


    ciao Frank
    Sonntag, 8. August 2010 19:52
  • Hallo Dominik

    versuchs mal damit

    If MaskedTextBox1.TextLength >= 0 Then
          MsgBox("Fehler")
        End If
    wenn die Textlänge kleiner, oder gleich Null ist dann Fehlermeldung
    Montag, 9. August 2010 11:05
  • 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
    Montag, 9. August 2010 16:09
  • 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
    Montag, 9. August 2010 19:01
  • 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
    Montag, 9. August 2010 19:28
  • Also:

    Ich habe:
    If MaskedTextBox1.MaskFull Then
    MsgBox("Alles Eingegeben")
    Else
    MsgBox("Es Fehlen Angaben!", MsgBoxStyle.Critical)
    End If

    Wenn 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

    Montag, 9. August 2010 19:48
  • 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
    Dienstag, 10. August 2010 09:54
  • 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

    Dienstag, 10. August 2010 11:12
  • 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
    Dienstag, 10. August 2010 12:50
  • 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!

    Dienstag, 10. August 2010 19:09
  • 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
    Dienstag, 10. August 2010 20:23
  • 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

    Mittwoch, 11. August 2010 08:57
  • 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
    Mittwoch, 11. August 2010 09:04
  • 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
    Mittwoch, 11. August 2010 09:46
  • @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!

    Mittwoch, 11. August 2010 10:54
  • 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 Date

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            mtbDate.Focus()
        End Sub

        Private 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.TextChanged

            If mtbTime IsNot Nothing Then
                mtbTime.Text = ""
            End If

            If Date.TryParseExact _
                    (mtbDate.Text, "dd.mm.yyyy", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.None, _
                     mD) Then

                mDateOK = 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.TextChanged

            If Date.TryParseExact _
                    (mtbTime.Text, "HH:mm:ss", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.NoCurrentDateDefault, _
                     mT) Then

                mTimeOK = 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 E

    Nach 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)

    Mittwoch, 11. August 2010 13:33
  • 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

     

    Mittwoch, 11. August 2010 13:46
  • Hallo Dominik,

    prima. Dann halte ich  mich jetzt aus dem Thread raus ;-).

    Viel Erfolg noch.


    Liebe Grüße Stefan
    Mittwoch, 11. August 2010 15:06
  • 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 If

    dient 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)

    Mittwoch, 11. August 2010 18:17
  • 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 Date

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                ) Handles MyBase.Load

            CreateControls()
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            mtbDate.Focus()
        End Sub

        Private 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.TextChanged

            If mtbTime IsNot Nothing Then
                mtbTime.Text = ""
            End If

            If Date.TryParseExact _
                    (mtbDate.Text, "dd.mm.yyyy", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.None, _
                     mD) Then

                mtbDate.BackColor = Color.Green

                mDateOK = True
                mtbTime.Focus()
            Else

                mDateOK = 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.TextChanged

            If Date.TryParseExact _
                    (mtbTime.Text, "HH:mm:ss", _
                     Globalization.CultureInfo.CurrentCulture, _
                     Globalization.DateTimeStyles.NoCurrentDateDefault, _
                     mT) Then

                mTimeOK = 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
            Else

                If mtbTime.Text = "  :  :" Then
                    mtbTime.BackColor = _
                        Color.FromKnownColor(KnownColor.Window)
                Else
                    mtbTime.BackColor = Color.Red

                End If

                mTimeOK = False
            End If

            ' Console.WriteLine("mTimeOK: " & mTimeOK.ToString)
        End Sub
    End Class
    ' \\\ E N T E

    Das 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)

    Mittwoch, 11. August 2010 18:35
  • Hallo Dominik,

    ich deute Dein Schweigen zu dem Thema als Zeichen dafür, dass Dir die Antwort von Peter weitergeholfen hat.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Samstag, 14. August 2010 19:45