String Analyse, Zerlegung und Action

  • VB.NET

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

    String Analyse, Zerlegung und Action

    Hi,

    Also ich übe in letzter Zeit die Arbeit mit Strings, darunter splitten etc.
    Nun habe ich folgende Idee weis aber nicht wie ich das genau machen soll, und zwar:

    Ich habe ein Textdokument mit folgendem Inhalt:

    VB.NET-Quellcode

    1. MsgBox{[Mein Text][1][Mein Titel]}


    Ich würde nun gerne den Text auslesen, und in folgendem Muster darauf agieren.
    Mein Programm erkennt den ersten Commando vor der ersten geschweiften Klammer, in dem Fall "MsgBox".
    OK, es handelt sich also um ne msgbox.
    Und jetzt soll er jeweils zwischen den eckigen klammern den Text bzw Zahl auslesen.
    Also die Parameter stehen zwischen den klammern.
    Die 1 wäre der Style.
    1 = Info
    2 = Critical
    3 = Warning
    Etc
    Er soll eben diese Zahl erkennen und entsprechend den Style nutzen. Und zwischen den dritten eckigen klammern, steht der dritte Parameter. Der Titel.
    Den soll das Programm auch auslesen.
    Bedenkt das das in net txt steht.
    Wie mache ich das am besten?
    Mit Regex?
    Kann mir jemand nen Denkanstoß geben?:)
    Ich hoffe ich konnte mich verständlich ausdrücken.
    C# Developer
    Learning C++
    @Rikudo

    Habs jetzt mal gebastelt...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub MessagBox_()
    5. Dim path As String = "C:\Users\NUTZER\Documents\TEST.txt"
    6. ' Open the file to read from.
    7. Dim readText() As String = File.ReadAllLines(path) 'Lesen der Zeilen, vom angegebenen Pfad
    8. Dim s As String
    9. For Each s In readText
    10. Dim strCommand As String = s
    11. Dim Result As String = strCommand.Split(" "c)(0)
    12. Dim strCommand1 As String = s
    13. Dim Result1 As String = strCommand.Split(" "c)(1)
    14. Dim strCommand2 As String = s
    15. Dim Result2 As String = strCommand.Split(" "c)(2)
    16. Dim Styles As Integer = 3
    17. Select Case Result1
    18. Case CStr(1)
    19. MsgBox(Result, MsgBoxStyle.Information, Result2)
    20. Case CStr(2)
    21. MsgBox(Result, MsgBoxStyle.Critical , Result2)
    22. Case CStr(3)
    23. MsgBox(Result, MsgBoxStyle.Exclamation, Result2)
    24. End Select
    25. Next
    26. End Sub


    Zur Erklärung:

    Die Textdatei ist zB so aufgebaut:
    Hi 1 Hi

    Nun wird im Case nach einer 1 gesucht...
    Wie wir sehen ist 1, die Style [Information]...

    Der Eingelesene Textpfad wurde zuvor GESPLITTET...

    Die Abstände müssen vorhanden sein, denn 0 ist für das "Glied" 1 ; 1 für das 2 "Glied" und 3 für das 3. "Glied"...

    Der Aufruf findet über MessageBox_ statt...

    Die IO Methode,ReadAllText stammt aus msdn.microsoft.com/de-de/libra….io.file.readalltext.aspx

    Mfg.eniking1998

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „enIking1998“ ()

    Hi
    ich hätte den Inhalt
    - in Tokens, also z.B. Methodennamen ("MsgBox", "x123_", etc.), Zahlen (1, &H1, 0.1f), Operatoren (+, .) , Klammern, Kommata, Strings und Chars, etc. gesplittet
    - nach Pattern unterteilt und Operatorenpräzedenz für binäre (z.B. a+b) und unäre (z.B. -a) Operatoren aufgelöst, etc.
    - Bezeichner z.B. über ein Dictionary einer zugehörigen Funktion/einem zugehörigen Feld zugeordnet
    - den eingehenden Code z.B. über Delegaten verwaltet und ausgeführt
    Hierzu hätte ich zwei Klassen Pattern(Of T) und PatternParser(Of TIn, TOut) Inherits Pattern(Of TIn) angelegt. Pattern sei dazu da, eine eingehende Abfolge von T-Instanzen zu überprüfen, die durch einen ContentEnumerator(Of T) bereitgestellt werden. PatternParser(Of TIn, TOut) überprüft eben eine Sequenz auf ein bestimmtes Pattern und man kann dann daraus eben ein TOut generieren lassen, also könnte man z.B. ein Token aus mehreren eingehenden Chars erzeugen.
    Pattern unterstützt eine abstrakte, geschützte Methode IsMatchCore(ByVal contentEnumerator As ContentEnumerator(Of T), ByRef parsingContext As ParsingContext) As Boolean. ContentEnumerator stellt als IEnumerator(Of TIn) bereit, bietet aber auch abstrakte Methoden, um den Enumerator-Status zurückzusetzen (seien hier Function Save() As ParserState, Sub Load(ByVal state As ParserState), wobei ParserState einfach eine Klasse ohne echten Inhalt ist, außer ggf. IDisposable abstrakt implementierend). Eine öffentliche Methode IsMatch(ByVal contentEnumerator As ContentEnumerator(Of T), ByRef parsingContext As ParsingContext) As Boolean behält dann den Enumerator-Status und ruft IsMatchCore mit den übergebenen Parametern auf. Wenn IsMatchCore False zurückgibt, wird der Enumerator-Status auf den gespeicherten Wert zurückgesetzt, sonst nicht.
    parsingContext ist ebenfalls eine leere Klasse, die Kontextinformationen für das Pattern bereitstellen kann. So kann z.B. PatternParser, welches eine Create(ByVal contentEnumerator As ContentEnumerator(Of T), ByVal parsingContext As ParsingContext) As TOut-Methode (man beachte ByRef -> ByVal im Vgl. zur IsMatch-Methode) besitzt, in der IsMatch-Funktion bereits Kontextinformationen zwischenspeichern, damit keine redundanten Abfragen benötigt werden. Create erzeugt dann eben aus dem Pattern ein zugehöriges TOut.
    T bei Pattern(Of T) bzw. TIn bei PatternParser(Of TIn, TOut) wäre beim Tokenizer Char, TOut wäre Token. Token ist ebenfalls eine Klasse, die eben den Contentstream bereitstellt.
    Es wäre übrigens sinnvoll, einige abstrakte Patterns zu definieren, wie z.B. Pattern-Gruppen mit Delimiter (sodass z.B. <pattern> ("," <pattern>)+ ausgelesen werden können, indem man "," als konstantes Pattern definiert), konstante Pattern (z.B. eben ","), Abfolgen von Pattern, etc.
    An sich ist es nicht allzu schwer, wenn (sofern) man obige Architektur verstanden hat. Das Pattern-Zeug kann man sowieso des öfteren gut brauchen. Überleg' dir einfach was und wenn etwas nicht klar ist, frag nochmal nach, bitte. Ggf. poste ich noch ein Beispiel, wie ich mir das vorstelle; bei meinem Programm habe ich allerdings Pattern und PatternParser einfach zusammengefasst.

    Gruß
    ~blaze~

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

    Wie ist die Datei aufgebaut? Ein Befehl pro Zeile? Weil dann braucht man auf die geschweiften Klammern zum Beispiel nicht mehr achten, wenn eh nicht mehrere pro Zeile möglich sind. Dann würde ich so vorgehen:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim fileContent() As String = File.ReadAllLines("e:\befehle.txt")
    5. For Each line As String In fileContent
    6. Dim command As String = line.Substring(0, line.IndexOf("{"))
    7. line = line.Substring(line.IndexOf("{")).Replace("{", "").Replace("}", "")
    8. Dim params() As String = line.Split({"[", "]"}, StringSplitOptions.RemoveEmptyEntries)
    9. ExecuteCommand(command, params)
    10. Next
    11. End Sub
    12. Private Sub ExecuteCommand(command As String, params As String())
    13. Select Case command
    14. Case "MsgBox"
    15. MsgBox(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2))
    16. End Select
    17. End Sub
    18. End Class

    kann beliebig um Befehle erweitert werden. Bei den Enums musst du dich allerdings an die vorgegebenen Werte halten. Also das Info icon hat den Wert 64, nicht 1.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Danke schonmal für eure Hilfe :)
    Allerdings habe ich eine Frage, und zwar verwende ich den Code von VB-Checker:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim fileContent() As String = File.ReadAllLines("e:\befehle.txt")
    5. For Each line As String In fileContent
    6. Dim command As String = line.Substring(0, line.IndexOf("{"))
    7. line = line.Substring(line.IndexOf("{")).Replace("{", "").Replace("}", "")
    8. Dim params() As String = line.Split({"[", "]"}, StringSplitOptions.RemoveEmptyEntries)
    9. ExecuteCommand(command, params)
    10. Next
    11. End Sub
    12. Private Sub ExecuteCommand(command As String, params As String())
    13. Select Case command
    14. Case "MsgBox"
    15. MsgBox(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2))
    16. End Select
    17. End Sub
    18. End Class


    Das funktioniert auch schon ganz gut, allerdings wird mit dem zweiten paramter die verschiedenen Button Combinationen geändert.



    Wie kann ich da noch den MsgBoxStyle einbauen.
    Vb-checker hat mich mit der Sache mit den Buttons inspiriert, so das ich diese auch mit einbauen möchte.
    Also z.B

    msgBox{[Meine Nachricht steht hier][1][3][Mein Titel]

    Wobei

    [3] = Buttons
    [1] = Style

    Schonmal danke soweit aber ich verstehe den Code noch nicht so ganz, es wäre sehr nett wenn du noch etwas dazu sagen könntest wie er funktioniert :)
    C# Developer
    Learning C++

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim fileContent() As String = File.ReadAllLines("e:\befehle.txt") 'Befehle zeilenweise ins Array laden
    5. For Each line As String In fileContent 'jede Zeile einzeln durchgehen
    6. Dim command As String = line.Substring(0, line.IndexOf("{")) 'das Command rausfiltern, also der Teil der Zeile, der vor { steht
    7. line = line.Substring(line.IndexOf("{")).Replace("{", "").Replace("}", "") 'nun alles vor { aus der zeile entfernen und dann direkt { und } auch löschen, weil man die nicht braucht, um die Parameter zu lesen
    8. Dim params() As String = line.Split({"[", "]"}, StringSplitOptions.RemoveEmptyEntries) ' alle Paramater einzeln in ein Array einlesen, in dem man nach [ und ] aufteilt/splittet
    9. ExecuteCommand(command, params) ' das Command und das Array mit den Parametern der ausführenden Funktion übergeben
    10. Next
    11. End Sub
    12. Private Sub ExecuteCommand(command As String, params As String())
    13. Select Case command ' nach verschiedenen Commands filtern
    14. Case "MsgBox"
    15. MsgBox(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2)) 'den Befehl musst du ändern, zum Beispiel die Zahl für die Buttons zum MessageBoxButtons Enum casten, wie ich es mit MsgBoxStyle gemacht habe
    16. End Select
    17. End Sub
    18. End Class


    Wenn du das verstanden hast, solltest du es selbst um einen weiteren Parameter erweitern können. Allerdings musst du MessageBox.Show() verwenden, wenn du Icons und Buttons einzeln steuern willst, da MsgBox() das nicht bietet. Noch Fragen? ;)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

    Okay, habs halnwegs verstanden, aber hier ist schon das erste Problem:
    MsgBox(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2)) 'den Befehl musst du ändern, zum Beispiel die Zahl für die Buttons zum MessageBoxButtons Enum casten, wie ich es mit MsgBoxStyle gemacht habe
    End Select

    Du sagst:

    Nutze messageBox andstatt msgBox

    MessageBox.show(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2)) 'den Befehl musst du ändern, zum Beispiel die Zahl für die Buttons zum MessageBoxButtons Enum casten, wie ich es mit MsgBoxStyle gemacht habe
    End Select


    Das geht nicht.
    Wie soll ich das nutzen?;o
    C# Developer
    Learning C++
    Du musst schon beachten, welche Paramter MessageBox.Show haben möchte. Du willst ja MessageBox.Show(String, String, MessageBoxButtons, MessageBoxIcon) benutzen, damit du alle deine Parameter unterbringen kannst. Da musst du also die Zahlen jeweils nach MessageBoxButtons und MessageBoxIcon umwandeln. Im Moment wandelst du eine Zahl nach MsgBoxStyle um, das wird hier gar nicht verlangt.

    edit: Übrigens, um die richtigen Zahlen für die Enums rauszufinden, kannst du folgendes machen:
    Bilder
    • Unbenannt.png

      51,05 kB, 1.200×460, 162 mal angesehen

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

    Das ganze geht auch mit Msgbox!

    Anschauen musst du das hier: MsgBox-Funktion

    VB.NET-Quellcode

    1. MsgBox(msg, style, title)


    Dh.
    bei msg steht "deine Nachricht"
    bei style steht "1 + 64"
    bei title steht "dein Titel"

    So ist das Beispiel dann im Code

    VB.NET-Quellcode

    1. MsgBox("deine nachricht", 1 + 64, "dein titel")

    Und so sieht es dann aus:

    Bei Style kann halt entweder die Nummer stehen oder du nimmst die ganzen Namen.
    Was es da alles gibt findest du hier: MsgBoxStyle-Enumeration
    Also laut Don Bastio geht das ja auch mit MsgBox.

    MsgBox{[Meine Nachricht :D][1][MessageBox Titel]}

    VB.NET-Quellcode

    1. MsgBox(params(0), CType(CInt(params(1)), MsgBoxStyle), params(2))


    Das ist der Teil von vb-checker.
    Ich möchte das ganze nun um den Style erweitern.

    MsgBox{[Meine Nachricht :D][1][Info][MessageBox Titel]}

    Ich würde den Dritten Parameter als Style nehmen.

    Info = MsgBoxStyle.Information
    Excl = MsgBoxStyle.Exclamation
    Crit = MsgBoxStyle.Critical
    Ques = MsgBoxStyle.Question
    None = MsgBoxStyle.None

    Ich kapier nicht wie ich das machen soll...
    Ich meine MsgBox hat Nachricht, Style und Titel, die Buttons gibts iwie nicht oder?
    Also wenn ich das mit MsgBox umkrempel, welcher param ist dann was? ?(
    Ich steh iwie auf'm Schlauch
    C# Developer
    Learning C++

    Rikudo schrieb:

    Ich meine MsgBox hat Nachricht, Style und Titel, die Buttons gibts iwie nicht oder?

    Bei der MsgBox sind icon und Buttons im "Style" kombiniert. Das ist ein wenig schwieriger, als MessageBox zu benutzen, da ist beides einzeln, also benutze das besser.

    @~blaze~:
    Dein Vorschläg wäre natürlich die Premium-Lösung ^^
    Da kann man aber auch mal eine Woche nur daran "verschwenden". Und bei den simplen Befehlen, die hier nur interpretiert werden sollen, ist das doch ein wenig Overkill (auch beim Wissensstand des Fragestellers), finde ich. Ich würde das konkrete Problem hier ganz simpel so lösen, weil es funktioniert und schnell umzusetzen ist: (ist natürlich nicht so allumfassend wiederverwendbar wie deins)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private commands As New Dictionary(Of String, Func(Of String(), Boolean)) From {
    4. {"MsgBox", AddressOf ShowMsgBox},
    5. {"MessageBox", AddressOf ShowMessageBox}
    6. }
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. Dim fileContent() As String = File.ReadAllLines("e:\befehle.txt")
    9. For Each line As String In fileContent
    10. Dim command As String = line.Substring(0, line.IndexOf("{"))
    11. line = line.Substring(line.IndexOf("{")).Replace("{", "").Replace("}", "")
    12. Dim params() As String = line.Split({"[", "]"}, StringSplitOptions.RemoveEmptyEntries)
    13. If commands.ContainsKey(command) Then
    14. If commands(command)(params) = False Then ' Fehler bei der Ausführung
    15. Throw New ArgumentException("Could not execute """ & command & """" & " with arguments: """ & line & """")
    16. End If
    17. Else ' Command ist nicht definiert
    18. Throw New KeyNotFoundException("Not a valid command: """ & command & """")
    19. End If
    20. Next
    21. End Sub
    22. Private Function ShowMsgBox(Params() As String) As Boolean
    23. Try
    24. MsgBox(Params(0), CType(CInt(Params(1)), MsgBoxStyle), Params(2))
    25. Return True
    26. Catch ex As Exception
    27. Return False
    28. End Try
    29. End Function
    30. Private Function ShowMessageBox(Params() As String) As Boolean
    31. Try
    32. MessageBox.Show(Params(0), Params(3), CType(CInt(Params(2)), MessageBoxButtons), CType(CInt(Params(1)), MessageBoxIcon))
    33. Return True
    34. Catch ex As Exception
    35. Return False
    36. End Try
    37. End Function
    38. End Class

    Rikudo wenn du was lernen willst schaust du dir das noch nicht an ;)

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    bei msgbox muss der style so sein wie ich es geschrieben habe!
    also entweder die nummer oder der ganze name

    Nummer und Name können aus dem einen Link entnommen werden

    Wenn mehrere Styles sein sollen, also zB MsgBoxStyle.Information und MsgBoxStyle.OkCancel

    dann kannst du demnach entweder MsgBoxStyle.Information + MsgBoxStyle.OkCancel oder 1 + 64 reinschreiben.
    mehrere sachen werden mit einem + (plus) verbunden



    Wenn du ihm das "Info" gibst, weiß er nicht was er damit anfangen soll und gibt dir daher eine Fehlermeldung

    Don_Batisto schrieb:

    mehrere sachen werden mit einem + (plus) verbunden

    Oder mit einem logischen Or. Also das geht auch als MsgBoxStyle: MsgBoxStyle.Information Or MsgBoxStyle.OkCancel

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Rikudo schrieb:

    Aber ich verstehe noch weniger als vorher ;o

    Also ganz oben siehst du ein Dictionary namens commands. In diesem "Wörterbuch" ist jeder gültige Befehl eingetragen und dazu eine Funktion, die diesen Befehl ausführen soll. Der Rest ist eigentlich gleich geblieben. Das erkannte Command wird dann nicht mehr mit einem Select Case unterschieden, sondern man schlägt im Dictionary nach. Wenn das Command dort eingetragen ist, wird die dort hinterlegte Funktion aufgerufen und die kümmert sich dann um die Ausführung.

    Rikudo schrieb:

    Wie wäre dann ein Beispiel aufruf?

    In der Textdatei kann zum beispiel folgendes stehen:

    Quellcode

    1. MsgBox{[Mein Text][65][Mein Titel]}
    2. MessageBox{[Mein Text][32][5][Mein Titel]}

    65 stellt wie ja schon erklärt die Kombination der Styles 64 und 1 dar.

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Okay, das leuchtet ein.
    Also, mir erscheint die Sache mit der MessageBox einfacher, deshalb würde ich gerne nur diesen Teil nehemen.
    Doch die Funktion der MsgBox und den Eintrag im Dictonary kann ich nicht einfach entfernen.
    Da kommt die Meldung:
    Fehler: Keine Überladung für die Add-Methode nimmt 1-Argumente an. "{key,value}" erwartet.

    Also, in diesem Fall mein ich:

    VB.NET-Quellcode

    1. Private commands As New Dictionary(Of String, Func(Of String(), Boolean)) From {"MessageBox", AddressOf ShowMessageBox}

    Anstatt:

    VB.NET-Quellcode

    1. Private commands As New Dictionary(Of String, Func(Of String(), Boolean)) From {
    2. {"MsgBox", AddressOf ShowMsgBox},
    3. {"MessageBox", AddressOf ShowMessageBox}
    4. }


    Hast du da ne Idee?
    Trotzdem schon mal ein fettes Dankeschön für deine Mühen :thumbsup:
    C# Developer
    Learning C++
    Du hast ein paar geschweifte Klammern zu viel gelöscht. Es muss {{"MessageBox", AddressOf ShowMessageBox}} sein. Die äußeren Klammern stellen das Dictionary dar und die inneren einen Eintrag (KeyValuePair genannt).

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Wenn es noch jemanden interessiert, hier wäre das Pattern-System aus meinem Programm. Ggf. wäre das für den einen oder anderen noch interessant. Ist allerdings ungetestet.
    Hier noch eine Beschreibung:
    - CombinationPattern kombiniert ein linkes und rechtes Pattern, sodass <left> <right> überprüft werden (sind beide verpflichtend)
    - FilterPattern erzeugt keine weiteren Inhalte, sondern stellt nur Abtrennungen bereit (z.B. kann man so in einem Tupel (a, b, c) die Kommata als verpflichtend voraussetzen, aber ohne eigenen Eintrag lassen. Hier könnt's sein, dass ich einen Bug hab', wenn ich bei der Überprüfung von Create-Aufrufen nicht auf Nothing überprüft habe, s. unten)
    - JoinedPattern liest Pattern der Form <arg> (<delimiter> <arg>)* aus, d.h. eben z.B. Tupel. Delimiter ist eben das Trennzeichen zwischen zwei Argumenten, jedes Argument ist wieder ein Pattern. Ist der Delimiter Nothing (bzw. Pattern(Of TIn, TOut).Empty), ist es quasi ein CombinationPattern mit mehreren verknüpften Patterns.
    - Den PatternSelector sollte man dann verwenden, wenn Gruppenpattern das gleiche linke Pattern besitzen (für mehrere kann man dann eben CombinationPattern/Join-Pattern dazunehmen), also z.B. <a> <b> und <a> <c>. PatternSelector stellt eine Performance-Verbesserung dar. Als linkes Argument wird das Pattern angegeben, das beide gemeinsam haben, als rechtes eine Aufzählung mehrerer möglicher rechter Pattern.

    Es gibt Pattern, die bei Create keinen Wert erzeugen. Das hat den Zweck, dass Pattern lediglich zur Übersichtlichkeit oder Trennung verwendet werden können, aber nicht selbst ins letztendliche Resultat einspielen. Also muss man bei Verwendung abfragen, ob ein Create-Aufruf Nothing zurückgegeben hat und entsprechend darauf reagieren.

    Für einen Tokenizer wäre ein Pattern dann entsprechend z.B. über Pattern(Of Char, Token) zu gestalten. Für Tupel wäre eben das JoinedPattern(Of Char, Token) praktisch, wobei <delimiter> ein FilterPattern(Of Char, Token) auf ","c ist (man beachte auch die statischen Funktionen der Klasse). Ansonsten matcht man einfach auf dem ContentEnumerator(Of T) über MoveNext und Current. Für Chars aus einem String könnte ein ContentEnumerator folgendermaßen aussehen:

    VB.NET-Quellcode

    1. Public Class StringContentEnumerator
    2. Inherits ContentEnumerator(Of Char)
    3. Private _input As String
    4. Private _index As Integer
    5. Public Sub New(ByVal input As String)
    6. _input = input
    7. End Sub
    8. Public Overrides Sub Load(ByVal state As ContentState)
    9. _index = DirectCast(state, StringContentState).Index
    10. End Sub
    11. Protected Overloads Overrides Function MoveNext(ByRef value As Char) As Boolean
    12. _index += 1
    13. If _index < _input.Length Then
    14. value = _input(_index)
    15. Return True
    16. Else
    17. Return False
    18. End If
    19. End Function
    20. Public Overrides Function Save() As ContentState
    21. Return New StringContentState(_index)
    22. End Function
    23. Private Class StringContentState
    24. Inherits ContentState
    25. Private _index As Integer
    26. Public Sub New(ByVal index As Integer)
    27. _index = index
    28. End Sub
    29. Public ReadOnly Property Index As Integer
    30. Get
    31. Return _index
    32. End Get
    33. End Property
    34. End Class
    35. End Class


    Gruß
    ~blaze~
    Dateien

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