Gibt es nur vorne Tabulatoren?
Wenn nicht, dann zehlt das falsch, da du dann ja am ersten anderen Zeichen aufhören müsstest, mit dem Zählen.
Hab ich schon geschrieben.
Zitat:
Und das Zerlegen:
...
* TStringList.DelimitedText
wieso mit Kanonen auf Spatzen? Geht doch so.
Delphi-Quellcode:
Procedure TTreeNodeDescriptor.FromString (aString : String);
const
TAB = #009;
var
captionFound,
valueDelimiterFound: Boolean;
c : char;
Function _AddToText(c : Char);
begin
if (c=':') and captionFound then
valueDelimiterFound := true
else if valueDelimiterFound then
Value := Value + c
else
Caption:=Caption + c;
end;
Begin
Level := 0;
Value := '';
Caption := '';
valueDelimiterFound := False;
captionFound := False;
for c in aString do
if captionFound or (c <> TAB) then
_AddToText(c)
else
inc(Level)
end;
So müsste es (ungetestet) gehen, damit nur <TAB> Zeichen am Anfang gezählt werden: Sobald das erste nicht-TAB Zeichen gefunden wird, wird das Zählen beendet. Das Zerlegen des Textes in Caption und Value solle aber auch mit Pos und Splitstring gehen. Aber ich dachte mir: Wenn man schon in einer For-Schleife ist, um die TAB-Zeichen vorne zu zählen, kann man auch gleich durchrennen. Na ja. Man kanns auch sein lassen
Delphi-Quellcode:
Procedure TTreeNodeDescriptor.FromString (aString : String);
const
TAB = #009;
var
function GetLevel (Const aString : String) : Integer;
begin
for result := 1 to Length(aString) do if aString[Result] <> TAB then exit;
result := 0;
end;
Begin
Level := 0;
Value := '';
Caption := '';
valueDelimiterFound := False;
captionFound := False;
Level := GetLevel(aString);
if Level>0 then Delete(astring,1,Level);
p := Pos(':', aString);
if p=0 then Caption := aString
else begin
Caption := substring(aString,1,p-1);
Value := substring(astring,p+1,maxint);
end
end;
Ungetestet (hab kein Delphi)