![]() |
Lange Strings (> 255 zerlegen und in Stringliste überneh
Hallo,
Ich möchte lange Strings (grösser als 255 Bytes) übernehmen und in einer normalen Stringliste ablegen. Die Lösung die ich habe, funktioniert nur mit kurzen Strings. Da bei langen Strings alles anders funktioniert, Speicherzuweisung, Befehle - kann jemand das auf die Schnelle umschreiben ?
Delphi-Quellcode:
function Zerlege( SText:String ) : TStrings;
const Trz = ';'; var t:Integer; H,S:String; begin Result := TStringList.Create; // Ziel,Source H := SText; // H = Workstring // Baue Stringliste auf while length(H) > 0 do begin t := Pos(TrZ,H); if t > 0 then begin S := copy(H,1,t-1); // Teilstring H := copy(H,t+1,255); // Reststring Result.Add(S); end else begin Result.Add(H); // Rest H := ''; // Ende end; end; end; // Aufruf OvcListBox_Search.Items.Assign( Zerlege( Reg.ReadString('Search Path'))); // Reg.ReadString liefert den String // Zerlege zerlegt ihn an Hand von Trennzeichen // OvcListBox_Search (ListBox) übernimmt die schon zerlegte Liste // Ausgangsbasis: // Item1;Item2;Item3;Item4 usw. // Zielbasis: // Item1 // Item2 // Item3 usw. // Obige Prozedur funktioniert nur mit kurzen Strings. // Aber wir haben lange Strings, mehrere tausend Zeichen lang ... |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
hi,
schau dir einfach mal die TStrings und dort Delimiter und DelimitedText an, die machen eigentlich schon das was du gerne hättest.
Delphi-Quellcode:
Danach sollte s so gefüllt sein, wie du es gerne hättest
var s : TStringList;
begin s := TStringList.Create; s.Delimiter := ';' s.DelimitedText := DeinText; end; Gruß Der Unwissende |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Der_Unwissende hat dir die Lösung ja schon genannt, aber die Ursache dafür, dass es nicht mit langen Strings funktioniert, hätte dir auch auffallen können:
Delphi-Quellcode:
Nun rate mal, was die 255 als dritter Parameter bewirkt ... (und was passiert, wenn du sie durch Length(H) ersetzt).
H := copy(H,t+1,255); // Reststring
|
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Hallo,
Kurze Strings sind jedenfalls nicht länger als 255 Bytes, egal was man dort hinschreibt. Dies ist immer ein Standardwert, welcher sicherstellen soll, dass der copy-Befehl die maximal mögliche Länge dieses Stringtyps erfasst. Ich habe nicht gesagt, dass es nicht funktioniert, ich habe es gewußt. Lange Strings werden mit ganz anderen Befehlen behandelt, außerdem muss man Speicher reservieren usw. Zu der Stringliste: diesen Listentyp gibt es leider erst ab Delphi 6 (gerade erfahren). Ich muss die ganze Sache in Delphi 5 zu Fuss lösen, denn die dort implementierte Liste kann das nicht. |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Zitat:
ich nutze immer normale Strings, und auch wenn die länger als 255 Zeichen sind muss ich werder Speicher reservieren oder irgendwelche besonderen Methoden nutzen. Das macht die sog. "CompilerMagic" :) (und wenn du soweit runtergehst muss auch für einen ShortString speicher reserviert werden...) |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Hallo,
für Delphi kleiner Version 6:
Delphi-Quellcode:
der Aufruf:
procedure SplittToList(var s: String;Delimiter: Char;sStrings: TStrings);
var z : Integer; sStream : TStringStream; begin for z := 1 to Length(s) do if s[z] = Delimiter then s[z] := #13; sStream := TStringStream.Create(s); try sStrings.LoadFromStream(sStream); finally sStream.Free; end; end;
Delphi-Quellcode:
s := 'shfjkshf;khsjfdhks;xjbipuf;v dfv ;sfhao;dhf;sahhsv';
SplittToList(s,';',Memo1.Lines); |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Hallo Lannes,
die Ausnutzung des internen Parsers mit dem Delimiter #13 ist clever, aber ohne StringStream finde ich es eleganter:
Delphi-Quellcode:
Freundliche Grüße vom marabu
function BreakLines(line: String; s: TStrings; delimiter: Char = #13): Integer;
var i: Integer; begin if delimiter <> #13 then for i := 1 to Length(line) do if line[i] = delimiter then line[i] := #13; s.Text := line; Result := s.Count; end; Edit: default delimiter muss #13 sein ... |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Hallo marabu,
:thumb: , schon gebunkert. |
Re: Lange Strings (> 255 zerlegen und in Stringliste übe
Also, da es in dem ersten Code eh keine ShortStrings gab, hätten eine kleine Änderung alles gelöst.
In dieser Zeile entweder die 255 entfernen, also durch Length(H) - t, oder da Copy eh die Länge nochmal überprüft/anpasst auch Length(H), oder einfach nur MaxInt.
Delphi-Quellcode:
Oder ganz einfach, warum Copy, wenn ein Delete eh besser wärde :zwinker:
H := copy(H,t+1,255); // Reststring
(also einfach die Zeile durch folgende erstetzt und fertsch)
Delphi-Quellcode:
Delete(H, 1, t); // Reststring
PS: da SText eh nicht als const/var definiert ist, kann ja auch gleich damit gearbeitet werden, dezu war S eh nicht nätig, also wie gefällt dir dann das?
Delphi-Quellcode:
Oder mal ohne den String zu verändern ...
function Zerlege(SText: String): TStrings;
var t: Integer; begin Result := TStringList.Create; // Baue Stringliste auf while length(SText) > 0 do begin t := Pos(';' , SText); if t > 0 then begin Result.Add(Copy(SText, 1, t - 1)); Delete(SText, 1, t); end else Result.Add(SText); end; end;
Delphi-Quellcode:
Ich weiß, PosEx gibt's noch nicht, aber in der CodeLib hab'sch dafür ja den Ersatz hinterlegt ;)
function Zerlege(const SText: String): TStrings;
var t, t2: Integer; begin Result := TStringList.Create; // Baue Stringliste auf t := 1; while length(SText) > 0 do begin t2 := PosEx(';' , SText, t + 1); if t2 = 0 then t2 := length(SText) + 1; Result.Add(Copy(SText, t + 1, t2 - t - 1)); t := t2; end; end; Oder ganz einfach: wenn dir ![]()
Delphi-Quellcode:
function Zerlege(const SText: String): TStrings;
begin Result := TStringList.Create; Result.Lines.Text := StringReplace(SText, ';', #13#10, [rfReplaceAll]); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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