AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Lange Strings (> 255 zerlegen und in Stringliste übernehmen
Thema durchsuchen
Ansicht
Themen-Optionen

Lange Strings (> 255 zerlegen und in Stringliste übernehmen

Ein Thema von Helmutf · begonnen am 14. Mär 2006 · letzter Beitrag vom 15. Mär 2006
Antwort Antwort
Helmutf

Registriert seit: 8. Mär 2006
Ort: NÖ.
25 Beiträge
 
Delphi 6 Enterprise
 
#1

Lange Strings (> 255 zerlegen und in Stringliste überneh

  Alt 14. Mär 2006, 16:08
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 ...
Gruss Helmut
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

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

  Alt 14. Mär 2006, 16:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

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

  Alt 14. Mär 2006, 18:25
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:
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).
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Helmutf

Registriert seit: 8. Mär 2006
Ort: NÖ.
25 Beiträge
 
Delphi 6 Enterprise
 
#4

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

  Alt 14. Mär 2006, 18:42
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.
Gruss Helmut
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#5

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

  Alt 14. Mär 2006, 18:46
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...)
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#6

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

  Alt 14. Mär 2006, 21:56
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);
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

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

  Alt 15. Mär 2006, 06:16
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 ...
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#8

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

  Alt 15. Mär 2006, 07:01
Hallo marabu,

, schon gebunkert.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 15. Mär 2006, 10:45
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.
H := copy(H,t+1,255); // Reststring Oder ganz einfach, warum Copy, wenn ein Delete eh besser wärde
(also einfach die Zeile durch folgende erstetzt und fertsch)
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz