Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Leider kann das Trennzeichen bei StringField nur ein Zeichen lang sein.
Daher hab ich hier mal eine Möglichkeit erstellt um Zeichenketten als Trennzeichen zu verwenden.
; Syntax
; Ergebnis$ = StringFieldChain(String$, Index, Trennzeichen$ [, Modus])
;
; Beschreibung
; Gibt den Feldinhalt des 'String$' an der angegebenen Stelle 'Index' zurück.
; Ein 'Trennzeichen$' (bestehend aus einem oder mehreren Zeichen) wird zur Aufteilung des Strings benutzt.
; Die erste 'Index'-Position ist 1.
; 'Modus' ist ein optionaler Parameter und kann folgenden Wert annehmen:
; #PB_String_NoCase : Suchen/Entfernen unabhängig von Groß-/Kleinschreibung
Procedure.s StringFieldChain(String$, Index, Trennzeichen$, Modus = 0)
Protected zeichen, i, TestString$
If Modus = #PB_String_NoCase
Trennzeichen$ = LCase(Trennzeichen$)
TestString$ = LCase(String$)
Else
TestString$ = String$
EndIf
If Index > 0
zeichen = Len(Trennzeichen$)
lastIndex = 1
For i = 1 To Index
nextIndex = FindString(TestString$, Trennzeichen$, lastIndex)
If nextIndex = 0
If i = Index
ProcedureReturn Mid(String$, lastIndex)
EndIf
ProcedureReturn ""
ElseIf i <> Index
lastIndex = nextIndex + zeichen
EndIf
Next
ProcedureReturn Mid(String$, lastIndex, nextIndex - lastIndex)
EndIf
EndProcedure
; Beispiel:
Define Text$, i
Text$ = "Als Trennzeichen können hier auch zeichenketten angegeben werden."
Debug StringFieldChain(Text$, 1, "können")
Debug StringFieldChain(Text$, 2, "TrennZEICHEN ", #PB_String_NoCase)
Text$ = "abc#*#def#*#ghi#*#jkl#*#mno#*#pqr"
For i = 1 To 6
Debug "Teil " + Str(i) + " = "+ StringFieldChain(Text$, i, "#*#")
Next
Gute Idee so eine Funktion kann man gewiss mal brauchen. Ich habe es mal noch so umgeschrieben wie ich das gelöst hätte. Sollte auf jeden Fall schneller sein wie die Version von String und sollte eigentlich auch noch minimal schneller sein als die Version von Demivec habe ich aber nicht getestet.
Hallo miteinander!
Nicht schlecht, nu gibt es gleich mehrere Varianten.
Da kann man sich seine Lieblings Version aussuchen.
Kompakter und oder schneller ist auf jeden Fall besser. Super!
Gruß Markus
; Syntax
; Ergebnis$ = StringFieldChain(String$, Index, Trennzeichen$ [, Modus])
;
; Beschreibung
; Gibt den Feldinhalt des 'String$' an der angegebenen Stelle 'Index' zurück.
; Ein 'Trennzeichen$' (bestehend aus einem oder mehreren Zeichen) wird zur Aufteilung des Strings benutzt.
; Die erste 'Index'-Position ist 1.
; 'Modus' ist ein optionaler Parameter und kann folgenden Wert annehmen:
; #PB_String_NoCase : Suchen/Entfernen unabhängig von Groß-/Kleinschreibung
Procedure.s StringFieldChain(String.s, Index.i, Trennzeichen.s, Modus.i = 0)
Protected *start = @String, *t.Character = @Trennzeichen
Protected *c.Character = *start + SizeOf(Character)
Repeat
If (*t\c = 0 Or *c\c = 0)
If (Index = 1)
ProcedureReturn PeekS(*start, *c - *start - (*t - @Trennzeichen))
EndIf
*start = *c
Index - 1
EndIf
If (*c\c = 0)
ProcedureReturn ""
EndIf
If (*c\c = *t\c)
*t + SizeOf(Character)
Else
*t = @Trennzeichen
EndIf
*c + SizeOf(Character)
ForEver
EndProcedure
For i = 1 To 4
Debug "'" + StringFieldChain("Das ist ein Test ist ein Test ein Test", i, " ein ", 0) + "'"
Next
For i = 1 To 11
Debug "'" + StringFieldChain("NicTheQuick", i, "", 0) + "'"
Next
Bei mir ist es allerdings auch so, dass wenn man als Trennzeichen einen Leerstring angibt, wird jeder Buchstabe einzeln ausgegeben.