Hier mal eine Alternative ohne Verwendung von Stringlists, universell (für alle möglichen Separatoren) verwendbar und unabhängig von der Delphi-Version:
Code:
function TokenCount(const s: Ansistring; Separator: Char): Integer;
var
i: Integer;
begin
Result := 0;
if s = '' then exit;
i := 1;
while (i <= Length(s)) do
begin
if (s[i] = Separator) then Inc(Result);
Inc(i);
end;
end;
function GetToken(const s: Ansistring; Separator: Char; TokenAtPos: Integer): Ansistring;
var
j, i: Integer;
begin
Result := '';
if s='' then exit;
j := 1; // Counter für aktuelle Zeichenposition in s
i := 0; // Counter für Anzahl der in s vorhandenen Separatoren
while (i <= TokenAtPos) and (j <= Length(s)) do
begin
if s[j] = Separator then Inc(i)
else
if i = TokenAtPos then Result := Result + s[j];
Inc(j);
end;
end;
// Beispiel:
// (die hier verwendete Variable "Barcode" ist natürlich kein echter Barcode)
var
// beachte die Existenz einfacher Leerzeichen bei "3 45" und "IJ K"
Barcode: Ansistring = '012'#9'3'#32'45'#9'678'#9'9AB'#9'CDE'#9'FGH'#9'IJ'#32#32'K'#9'LMN';
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
n: integer;
begin
memo1.lines.Add(format('kompletter String: "%s"',[barcode]));
n := TokenCount(barcode, #9);
// Anzeige nur zwecks Kontrolle:
memo1.lines.add(format('Anzahl Tabs: %d / Anzahl Token: %d', [n,n+1]));
// Ausgabe der einzelnen Token des Barcodes:
for i := 0 to n do
with memo1.lines do
add(format('Barcode Substring %d = %s',[i,GetToken(Barcode, #9, i)]));
end;