Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lange Strings (> 255 zerlegen und in Stringliste übernehmen (https://www.delphipraxis.net/65281-lange-strings-255-zerlegen-und-stringliste-uebernehmen.html)

Helmutf 14. Mär 2006 16:08


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 ...

Der_Unwissende 14. Mär 2006 16:12

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:
var s : TStringList;
begin
  s := TStringList.Create;
  s.Delimiter := ';'
  s.DelimitedText := DeinText;
end;
Danach sollte s so gefüllt sein, wie du es gerne hättest

Gruß Der Unwissende

Flocke 14. Mär 2006 18:25

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:
H := copy(H,t+1,255); // Reststring
Nun rate mal, was die 255 als dritter Parameter bewirkt ... (und was passiert, wenn du sie durch Length(H) ersetzt).

Helmutf 14. Mär 2006 18:42

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.

glkgereon 14. Mär 2006 18:46

Re: Lange Strings (> 255 zerlegen und in Stringliste übe
 
Zitat:

Zitat von Helmutf
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.

sorry, aber das ist afaik unsinn.

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...)

Lannes 14. Mär 2006 21:56

Re: Lange Strings (> 255 zerlegen und in Stringliste übe
 
Hallo,

für Delphi kleiner Version 6:
Delphi-Quellcode:
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;
der Aufruf:
Delphi-Quellcode:
s := 'shfjkshf;khsjfdhks;xjbipuf;v dfv ;sfhao;dhf;sahhsv';
SplittToList(s,';',Memo1.Lines);

marabu 15. Mär 2006 06:16

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:
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;
Freundliche Grüße vom marabu

Edit: default delimiter muss #13 sein ...

Lannes 15. Mär 2006 07:01

Re: Lange Strings (> 255 zerlegen und in Stringliste übe
 
Hallo marabu,

:thumb: , schon gebunkert.

himitsu 15. Mär 2006 10:45

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:
H := copy(H,t+1,255); // Reststring
Oder ganz einfach, warum Copy, wenn ein Delete eh besser wärde :zwinker:
(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:
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;
Oder mal ohne den String zu verändern ...
Delphi-Quellcode:
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;
Ich weiß, PosEx gibt's noch nicht, aber in der CodeLib hab'sch dafür ja den Ersatz hinterlegt ;)


Oder ganz einfach:
wenn dir der Code von Der_Unwissende nicht gefällt:
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