![]() |
AW: String auf Tabulatoren prüfen
Zitat:
Zitat:
Delphi-Quellcode:
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 ;-)
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;
Delphi-Quellcode:
Ungetestet (hab kein Delphi)
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; |
AW: String auf Tabulatoren prüfen
Zitat:
Gut, man kann auch einen Ferrari nehmen (Position suchen und alles zusammen machen). Selbst eine TStringList erzeugen (jedes Mal und nichtmal über ein globales Singleton) und verwenden, erzeugt weniger Speicheroperationen (Get/Free/Realloc), als das da, mit der For-Schleife. Gerade in Delphi 7 (ohne FastMM) ist dieses Einzelzeichenstringzusammensetzzeugs die totale Bremse. (zum Glück haben wir seit 2006 standardmäßig ein eigebautes InPlaceRealloc vom Pierre drin, welches solchen Code getwas verbessert, solange die Codeoptimierung aus dem Caption:=Caption+c ein Insert(Caption,C,1) hinbekommt).
Delphi-Quellcode:
Gut, man kann das jetzt noch extrem optimieren, indem man die Trims selber berechnet und bei den Copy sofort anwendet, bzw. zum Ausrechnen des Level heranzieht, ohne die String-Zwischenvariable, aber man kann es damit (im Normalfall) auch übertreiben.
(*procedure TTreeNodeDescriptor.FromString(Value: string);
var i: Integer; begin i := Pos(':', Value); Caption := Trim(Copy(Value, 1, i - 1)); Value := Trim(Copy(Value, i + 1)); Level := Length(Value) - Length(TrimLeft(Value)); end;*) procedure TTreeNodeDescriptor.FromString(Value: string); var i: Integer; S: string; begin i := Pos(':', Value); S := LeftStr(Value, i - 1); Caption := TrimLeft(S); Value := TrimLeft(Copy(Value, i + 1)); Level := Length(S) - Length(Caption); end; |
AW: String auf Tabulatoren prüfen
Zitat:
Hier mal dein Code kommentiert.
Delphi-Quellcode:
Du rennst 5 mal durch den String bzw. setzt zu einer Schleife an. Wozu?
procedure TTreeNodeDescriptor.FromString(Value: string);
var i: Integer; S: string; begin i := Pos(':', Value); --- 1. mal laufen S := LeftStr(Value, i - 1); --- 2. mal laufen und kopieren Caption := TrimLeft(S); --- 3. mal laufen und kopieren Value := TrimLeft(Copy(Value, i + 1)); --- 4. mal laufen und kopieren Level := Length(S) - Length(Caption); end; Also, ich meine, wir reden hier ziemlich abgehoben über Codeästhetik und ob man eher Makros (Trim,Copy,LeftStr,Pos) nimmt, oder alles per Hand macht. Rein performancetechnisch würde ich annehmen, das ein einmaliges Durchlaufen am schnellsten ist. Von der Lesbarkeit würde ich die Makro-Variante wohl vorziehen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz