[CONSOLE] Wenn etwas bestimmtes eingegeben wurde dann etwas bestimmtes machen

  • VB.NET

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    ~blaze~ schrieb:

    so aus
    Hast Du eine feuchte Wohnung oder eine kaputte Ehe?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    :D die komplizierte Variante hat auch noch das Formatieren von Eingaben vorgesehen und eine Unterstützung für Eingaben, wie "bla "" xy" "Test" (=> { "bla " & """" & " xy", "Test" }). Das Formatieren wäre dann über Properties gelaufen, sodass eine Klasse mit Property SomeProp über "SomeProp-Wert: {SomeProp}" auswertbar wäre.
    Da kann man nichts sagen, es IST die einfache Variante. ;)

    Gruß
    ~blaze~

    ~blaze~ schrieb:

    die komplizierte Variante
    meinend:
    Hast Du nix anderes zu tun, als des TE's Problem zu lösen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich wollte nur kurz noch anmerken, dass ich gerade Lust hatte, die Formatierung zu implementieren. Vielleicht kann @iEi: später mal was damit anfangen, ist sicherlich das eine oder andere interessante mit dabei:

    VB.NET-Quellcode

    1. Shared Function Format(pattern As String, value As Object) As String
    2. Dim sb As New System.Text.StringBuilder()
    3. Dim p As Integer = 0
    4. Format(pattern, p, value, sb) 'Pattern auswerten, beginnend bei 0
    5. If p < pattern.Length Then Throw New FormatException("End of pattern expected.") 'Wurde das gesamte Pattern ausgewertet oder nur ein Teil davon?
    6. Return sb.ToString()
    7. End Function
    8. Private Shared Sub Format(pattern As String, ByRef index As Integer, value As Object, output As System.Text.StringBuilder)
    9. If value Is Nothing Then Throw New ArgumentNullException("value")
    10. Dim i As Integer = index
    11. Dim marker As Integer = index
    12. Dim escape As Boolean = False
    13. Dim valueType As Type = Nothing
    14. Dim propName As String
    15. Dim prop As PropertyInfo
    16. While i < pattern.Length
    17. If pattern(i) = "{"c AndAlso Not escape Then 'Eigenschaften auswerten, Bei einem Escapezeichen auslassen
    18. i += 1
    19. marker = i
    20. If valueType Is Nothing Then valueType = value.GetType()
    21. Do
    22. If i >= pattern.Length Then Throw New FormatException("Unexpected end of pattern.") '{... ist nicht zulässig, wenn kein zugehöriges } folgt
    23. If pattern(i) = "{"c OrElse pattern(i) = "}"c Then '{ und } als Sonderzeichen ansehen
    24. If i = marker AndAlso pattern(i) = "}"c Then '{}
    25. If pattern(i) = "}"c Then 'Escapezeichen {} behandeln
    26. escape = True
    27. i += 1
    28. Exit Do
    29. Else
    30. Throw New FormatException("Property name missing.")
    31. End If
    32. End If
    33. propName = pattern.Substring(marker, i - marker) 'Namen der Eigenschaft auslesen, marker ist auf das erste Zeichen nach dem { gesetzt
    34. prop = valueType.GetProperty(propName, BindingFlags.Public Or BindingFlags.Instance) 'Zugehörige Property finden
    35. If prop Is Nothing Then Throw New ArgumentException("Missing property '" + propName + "' on object.")
    36. If prop.GetIndexParameters().Length > 0 Then Throw New ArgumentException("Non-indexed property expected.")
    37. Dim val As Object = prop.GetValue(value, Nothing)
    38. If pattern(i) = "}"c Then 'Property abschließen, also {...}
    39. i += 1
    40. output.Append(val)
    41. Else
    42. Format(pattern, i, val, output) 'Verschachtelte Properties behandeln, also {...{...}...}, so ist auch {...{...}...{...}...} möglich, also mehrfache Ausführung auf einem Wert, der vor dem ersten geschachtelten { angegeben wurde
    43. marker = i
    44. End If
    45. Exit Do
    46. Else
    47. i += 1
    48. End If
    49. Loop
    50. ElseIf pattern(i) = "}"c AndAlso Not escape Then '} beendet die Vearbeitung in dieser Tiefe, sofern es kein Escapezeichen ist
    51. i += 1
    52. Exit While
    53. ElseIf Not escape OrElse (pattern(i) = "{"c OrElse pattern(i) = "}"c) Then 'Gültige Escapezeichen filtern
    54. escape = False
    55. output.Append(pattern(i))
    56. i += 1
    57. Else
    58. Throw New FormatException("Unexpected escape sequence.")
    59. End If
    60. End While
    61. index = i
    62. End Sub


    Anwenden kann man sie bspw. wie folgt:

    VB.NET-Quellcode

    1. Console.WriteLine("{}{{A}; {R}; {G}; {B}{}}", Color.Blue)

    {} ist eine Escapesequenz, um { und } schreiben zu können, Properties werden in {} definiert. Eine verschachtelte Angabe von Properties ist ebenfalls möglich:

    VB.NET-Quellcode

    1. Console.WriteLine("Länge des Namens: {Name{Length}}", Color.Blue)

    Ist noch etwas unschön, aber was auch geht:

    VB.NET-Quellcode

    1. Dim frm As New Form()
    2. MessageBox.Show(Format("Schriftart: {Font{Name}, {Style}, {Size}}", frm))

    Schöner könnte es trotzdem sein, aber das war in der ursprünglichen Architektur eben nicht so vorgesehen.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „~blaze~“ ()