"Option Strict On" lässt spätes Binden nicht zu.

  • VB.NET

Es gibt 44 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    MarvinKleinMusic schrieb:

    CustomTextBox124

    Warum denn nicht endlich ein DataGridView? :cursing:
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich hab immer mehr das Gefühl, dass wir an der richtigen Lösung vorbeitrudeln.

    Was soll denn der Code machen? Also was ist das Ziel? Welche Daten werden eingegeben? Was wird überprüft? Wenns ne Uhrzeit ist, geht das auch anders...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    sonne75 schrieb:

    ((KeyCode >= 48 AndAlso KeyCode <= 57) OrElse KeyCode = 8) AndAlso txtSender.Text.Length = 4 Then

    So sperrt er das Feld schon ab dem : ?(

    BiedermannS schrieb:

    Ich hab immer mehr das Gefühl, dass wir an der richtigen Lösung vorbeitrudeln.

    Was soll denn der Code machen? Also was ist das Ziel? Welche Daten werden eingegeben? Was wird überprüft? Wenns ne Uhrzeit ist, geht das auch anders...
    Ja es soll eine Uhrzeit Darstellen im Format 12:05 (Sprich jeweils 4 Zahlen und ein : als Trenner).

    In einer Funktion im Programm werden dann die Zahlen vor und nach dem Doppelpunkt getrennt.

    Die Funktion soll jetzt nur den Ausrechnen Buttonsperren falls ein Rotes Feld besteht , um Fehler bei der Rechung zu vermeiden.

    sonne75 schrieb:


    Wieso? Da müssen doch 4 Zeichen sein?
    Wenn ich jetzt Beispielsweise 00:00 eingeben will geht es nur bis 00: bei jeden weiteren Tastendrücken kommt nur ein Geräusch.

    LG
    Warum nicht gleich so.

    Also, anstatt die einzelnen Zeichen zu prüfen, wird der ganze Text geprüft. Also im TextChanged Event.

    Das Prüfen einer Zeit kann mit DateTime.TryParse gemacht werden:

    VB.NET-Quellcode

    1. Private Sub TextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles TextBox1.TextChanged
    2. Dim txtSender As TextBox = DirectCast(sender, TextBox)
    3. Dim time As DateTime
    4. If DateTime.TryParse(txtSender.Text, time) Then
    5. txtSender.ForeColor = Color.Green
    6. rechnen.Enabled = True
    7. Else
    8. txtSender.ForeColor = Color.Red
    9. rechnen.Enabled = False
    10. End If
    11. End Sub


    Wenn du danach damit arbeitest, kannst du den Text als DateTime Parsen und über die Eigenschaften Hour und Minute auf die entsprechenden Werte zugreifen.

    P.S.: Das mit der Rücktaste geht nicht, weil deine Methoden deklaration falsch war (Die Parameter wurden als Value übergeben). Da ich diese richtiggestellt habe, hat der Code welcher die Eigenschaft KeyChar löscht nun den KeyChar so wirklich gelöscht und ist nicht mehr zur TextBox durchgekommen.

    Solche Überprüfungen sollten immer auf den gesamten String angewandt werden und nicht auf die einzelnen Zeichen. Wenn du nun noch beginnst mit Date zu arbeiten, dann wird das auch kein Problem mehr sein wenn man 22:2 hinschreibt. Das ist nämlich genauso eine richtige Uhrzeit wie 22:02.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Hallo nochmal!

    Jetzt Funktioniert die Farbanzeige Perfekt & auch die Rücktaste geht. Allerdings auch alle anderen Buchstaben , ebenso ist es möglich das System auszutricksen , indem man einfach in der zweiten Textbox den Wert Grün stellt.

    Sprich es sollen nur Zahlen und : erlaubt sein & der Rechnen Button muss solange auf false sein bis alle Werte die eingetragen sind auch wirklich Grün sind.

    LG

    PS: Ich schau mir mal die Datetime Funktion etwas genauer an ;)

    MarvinKleinMusic schrieb:

    Sprich es sollen nur Zahlen und : erlaubt sein [...]

    Dann ist vielleicht die MaskedTextBox ja was für dich?
    Mein Vorschlag wäre wieder den Tag zu verwenden, damit du im Designer die TextBoxen kennzeichnen kannst, die in die Überprüfung miteinbezogen werden.

    Also erst mal schön in alle Tag Felder das Wort "this" hinein (Ohne Anführungszeichen)

    Danach werden alle Steuerelemente die in die Überprüfung miteinfließen in einer Variable gespeichert. Da die Überprüfung bereits bei der Eingabe stattfindet, würd ich hier ein Dictionary nehmen, welches einfach nur das Ergebnis der Überprüfung zur entsprechenden TextBox speichert.

    Wenn der Button zum Berechnen geklickt wird, wird noch eine kleine Funktion aufgerufen, welche überprüft ob alle Werte auf True gesetzt sind.

    z.B.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Hier werden alle TextBoxen gespeichert und der entsprechende Wert, ob der eingegebene Text gültig ist
    2. Private CheckControls As New Dictionary(Of TextBox, Boolean)
    3. Sub Reg(ByVal TagString As String, ByVal parent As Control)
    4. 'Alle Steuerelemente durchlaufen
    5. For Each c As Control In parent.Controls
    6. 'Für alle untergeordneten Steuerelemente (Damit nichts vergessen wird)
    7. If c.HasChildren Then Reg(TagString, c)
    8. 'Wenn der Tag gesetzt wurde und dem Text in TagString entspricht und das Steuerelement eine TextBox ist
    9. If c.Tag IsNot Nothing AndAlso c.Tag.ToString = TagString AndAlso c.GetType() Is GetType(TextBox) Then
    10. 'TextBox in einem Dictionary speichern, mit dem Wert false
    11. CheckControls.Add(DirectCast(c, TextBox), False)
    12. 'entsprechenden Handler hinzufügen
    13. AddHandler c.TextChanged, AddressOf TextBox1_TextChanged
    14. End If
    15. Next
    16. End Sub
    17. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    18. 'In Form_Load werden die Handler gesetzt und die Elemente gesucht
    19. CheckControls.Clear()
    20. Reg("this", Me)
    21. End Sub
    22. 'Achtung, kein Handles am Ende der Sub
    23. Private Sub TextBox1_TextChanged(sender As Object, e As System.EventArgs)
    24. Dim txtSender As TextBox = DirectCast(sender, TextBox)
    25. Dim time As DateTime
    26. If DateTime.TryParse(txtSender.Text, time) Then
    27. txtSender.ForeColor = Color.Green
    28. 'Hier wird auf das Dictionary über die TextBox zugegriffen und der entsprechende Wert gesetzt
    29. CheckControls(txtSender) = True
    30. Else
    31. txtSender.ForeColor = Color.Red
    32. CheckControls(txtSender) = False
    33. End If
    34. End Sub
    35. 'Mit dieser Funktion kannst du überprüfen ob alle Werte auf True sind
    36. Function CheckAllValues() As Boolean
    37. Return CheckControls.Values.All(Function(value As Boolean) value)
    38. End Function


    Der Vorteil hier ist, wenn eine neue TextBox hinzukommt, brauchst du diese "nur" auf der Form platzieren, den Tag richtig setzen und in die Berechnung einbauen. Die Überprüfung erfolgt automatisch.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Also erst mal schön in alle Tag Felder das Wort "this" hinein (Ohne Anführungszeichen)
    Welche Tag Felder meinst du?
    Ich habe jeweils1 Label für die Tages anzeige und dann 4 CustomTextBoxen zum Tag.

    LG
    Wenn du im Designer bist und dir die Eigenschaften der TextBox ansiehst, findest du eine Eigenschaft mit dem Namen Tag. Dabei handlet es sich nicht um das deutsche Wort Tag (also der tag im kalender), sondern um das englische, was etwas so viel bedeutet wie kennzeichen.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

    BiedermannS schrieb:

    Wenn du im Designer bist und dir die Eigenschaften der TextBox ansiehst, findest du eine Eigenschaft mit dem Namen Tag. Dabei handlet es sich nicht um das deutsche Wort Tag (also der tag im kalender), sondern um das englische, was etwas so viel bedeutet wie kennzeichen.
    Funktioniert wunderbar! Einziges Problem ist jetzt wieder das er schon bei 4 Zeichen die Textbox Grün färbt und nicht erst bei 5.

    LG

    BiedermannS schrieb:

    Das ist egal.

    22:2 = 22:02
    22:20 = 22:20

    Ist ja ne gültige Zeit :D

    Nein ist es nicht , das Programm braucht ein volles 5er Format zur berechnung:

    VB.NET-Quellcode

    1. Private Function BerechneDauer(ByRef BeginnStr As String, ByRef EndeStr As String) As Integer
    2. ' gibt die Dauer aus zwei Textfeldern als Ineger in Minuten zurück
    3. Dim Dauer1 As Integer
    4. Dim Dauer2 As Integer
    5. Dim Anfang, Ende As Integer
    6. 'ANFANG
    7. 'Stunden Anfang, WICHTIG: Stunden zweistellig!!
    8. Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(BeginnStr, 2))
    9. 'Minuten Anfang, WICHTIG: Minuten zweistellig!!
    10. Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(BeginnStr, 2))
    11. 'Anfang in Minuten umgerechnet
    12. 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
    13. Dim methode As New INIDatei
    14. methode.Pfad = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Umrechner\settings.ini"
    15. If methode.WertLesen("General", "Methode") = "Dezimal" Then
    16. Anfang = CInt(Dauer1 * 60 + Dauer2 / 100 * 60)
    17. Else
    18. Anfang = Dauer1 * 60 + Dauer2
    19. End If
    20. 'ENDE
    21. 'Stunden Anfang, WICHTIG: Stunden zweistellig!!
    22. Dauer1 = Convert.ToInt32(Microsoft.VisualBasic.Left(EndeStr, 2))
    23. 'Minuten Anfang, WICHTIG: Minuten zweistellig!!
    24. Dauer2 = Convert.ToInt32(Microsoft.VisualBasic.Right(EndeStr, 2))
    25. 'Ende in Minuten umgerechnet
    26. 'Annahme ist, dass die Minuten in Dezimal angegeben sind, und erst umgerechnet werden müssen:
    27. If methode.WertLesen("General", "Methode") = "Dezimal" Then
    28. Ende = CInt(Dauer1 * 60 + Dauer2 / 100 * 60)
    29. Else
    30. Ende = Dauer1 * 60 + Dauer2
    31. End If
    32. 'Dauer vormittag in Minuten
    33. BerechneDauer = Ende - Anfang
    34. End Function


    mit left & right wird jeweils auf die zahlen vor und nach dem : zugegriffen.

    LG
    Splitten, dann mit dem Index arbeiten. Du solltest dir generell ne andere Struktur überlegen. INIDatei ist ein absolutes NoGo und auch Path.Combine() nutzen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    INIDatei ist ein absolutes NoGo
    Find ich nicht für meinen Fall reicht eine ini Datei vollkommen aus. Außerdem heißt es nur so weil die Klasse auch so dafür heißt.

    LG
    Das mein ich nicht. Der Name ist absolut nicht gut. Deutsch passt da nich.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das ist nunmal die Klasse die ist komplett in Deutsch ausgelegt. Ich rufe ja auch die Funktionen mit WertLesen und WertSchreiben auf.

    Ich komme damit gut klar.

    LG
    Für Informatik mag das reichen, aber wenn man die Guidelines richtig beachtet und die Projekte passend gestalten will, dann sollte es halt englisch sein.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: