Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi String mit Leerzeichen verursacht Chaos??? (https://www.delphipraxis.net/134467-string-mit-leerzeichen-verursacht-chaos.html)

AlexII 22. Mai 2009 18:43


String mit Leerzeichen verursacht Chaos???
 
Hallo,

ich speichere wie folgt die Einträge einer ListBox in eine txt-Datei:

Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: Integer;
    s1,s2,s3,s4: String;
    List: TStringList;
begin
  List:=TStringList.Create;
  try
    for i:=0 to ListBox1.Count-1 do
    begin
    s1:=ListBox1.Items.Strings[i];
    s2:=ListBox2.Items.Strings[i];
    s3:=ListBox3.Items.Strings[i];
    s4:=ListBox4.Items.Strings[i];
    List.Add('=' + s1 + '=' + s2 + '=' + s3 + '=' + s4 + '=');
    end;
    List.SaveToFile(ExtractFilePath(ParamStr(0)) + '\Datei.txt');
 finally
    List.Free;
 end;
end;
Befindet sich allerdings in einem der Einträge der ListBox ein Leerzeichen wird das nächstfolgende Wort nicht mehr z.B. dem s1-String zugewiesen, sondern dem s2. Im s2 dem s3. :roteyes: Wer weiß woran es liegt? :gruebel:

mkinzler 22. Mai 2009 18:44

Re: String mit Leerzeichen verursacht Chaos???
 
Leerzeichen werden standardmässig als weiteres trennzeichen erkannt. mit
Delphi-Quellcode:
StringList.StrictDelimiter := True;
kann man das verhindern

AlexII 22. Mai 2009 18:47

Re: String mit Leerzeichen verursacht Chaos???
 
Bekomme die Fehlermeldung: Undefinierter Bezeichner: 'StrictDelimiter' :gruebel:

mkinzler 22. Mai 2009 18:48

Re: String mit Leerzeichen verursacht Chaos???
 
Dann scheinst du eine etwas alte Delphiversion zu haben

AlexII 22. Mai 2009 18:50

Re: String mit Leerzeichen verursacht Chaos???
 
Oh das stimmt, mit Delphi 2006 geht's. Und wie löse ich das Problem? Muss unbedingt bei Delphi 7PE bleiben. :gruebel:

Kann ich die Items der ListBox irgendwie anders abspeichern?

mkinzler 22. Mai 2009 18:54

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Oh das stimmt, mit Delphi 2006 geht's. Und wie löse ich das Problem? Muss unbedingt bei Delphi 7PE bleiben. Grübelnd...
Warum das?
Zitat:

Kann ich die Items der ListBox irgendwie anders abspeichern?
Ja manuell durchegehn und in eine Textdatei speichern

AlexII 22. Mai 2009 18:58

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat:

Zitat von mkinzler
Zitat:

Oh das stimmt, mit Delphi 2006 geht's. Und wie löse ich das Problem? Muss unbedingt bei Delphi 7PE bleiben. Grübelnd...
Warum das?

Weil ich mir keine andere Version leisten kann und Turbo Explorer lässt keine Komponenten installieren.




Zitat:

Zitat:

Kann ich die Items der ListBox irgendwie anders abspeichern?
Ja manuell durchegehn und in eine Textdatei speichern

Geht das auch wie oben in einer Schleife? :gruebel:

mkinzler 22. Mai 2009 18:59

Re: String mit Leerzeichen verursacht Chaos???
 
Ja

Klaus01 22. Mai 2009 19:00

Re: String mit Leerzeichen verursacht Chaos???
 
.. oder Du schaust Dir einmal explode und implode an.

Grüße
Klaus

Dax 22. Mai 2009 19:02

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von mkinzler
Ja

[OT]
Daniiieeeeel set das untere Limit für Beitragslängen mal auf mindestens zwanzig Zeichen *G*
[/OT]

AlexII 22. Mai 2009 19:03

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von Klaus01
.. oder Du schaust Dir einmal explode und implode an.

Danke dir, ist aber viel zu schwer und aufwendig. :roteyes:

AlexII 22. Mai 2009 19:03

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von Dax
Zitat:

Zitat von mkinzler
Ja

[OT]
Daniiieeeeel set das untere Limit für Beitragslängen mal auf mindestens zwanzig Zeichen *G*
[/OT]

Wie bitte? :gruebel:

mkinzler 22. Mai 2009 19:07

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von AlexII
Zitat:

Zitat von Dax
Zitat:

Zitat von mkinzler
Ja

[OT]
Daniiieeeeel set das untere Limit für Beitragslängen mal auf mindestens zwanzig Zeichen *G*
[/OT]

Was was? :gruebel:

Dax will das ich mich nicht so kurz fasse, sondern Antworten in Romanform verfasse. Zu diesem Zwecke soll Cheffe (Daniel) die Forensoftware so anpassen, das diese mich für meine kurzen Beiträge rügt und das Posten von zu kurzen Beiträgen verhindert.

Alsoe ien Anti-mkinzler Modifikation, welche er sich dann patentieren lassen kann. :stupid:

AlexII 22. Mai 2009 19:11

Re: String mit Leerzeichen verursacht Chaos???
 
mkinzler gib mir bitte nen Tipp wie ich das machen soll, bin schon zwei Tage dran und hab keine Kraft mehr :pale:
Hab mit "ValueFrom Index" versucht, aber da wird immer das erste Zeichen des Strings abgeschnitten. :wall:

mkinzler 22. Mai 2009 19:15

Re: String mit Leerzeichen verursacht Chaos???
 
So sollte es gehen:
Delphi-Quellcode:
...
var
  tf: textFile;
...
  AssignFile( tf, ExtractFilePath(ParamStr(0)) + '\Datei.txt');
  Reswrite( tf);
  for i:=0 to ListBox1.Count-1 do
  begin
    s1:=ListBox1.Items.Strings[i];
    s2:=ListBox2.Items.Strings[i];
    s3:=ListBox3.Items.Strings[i];
    s4:=ListBox4.Items.Strings[i];
    WriteLn( tf, '=' + s1 + '=' + s2 + '=' + s3 + '=' + s4 + '=');
  end;
...
getippt und nicht getestet

AlexII 22. Mai 2009 19:22

Re: String mit Leerzeichen verursacht Chaos???
 
Aber ich will doch die ListBox.Items in eine txt-Datei speichern. Die Datei.txt hat ja hier nix zu suchen, erst ganz unten wird sie erstellt. :gruebel:

mkinzler 22. Mai 2009 19:24

Re: String mit Leerzeichen verursacht Chaos???
 
Dann sollte es mit ListBox1.Items.SavetoFile() gehen

Satty67 22. Mai 2009 19:28

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von AlexII
Aber ich will doch die ListBox.Items in eine txt-Datei speichern. Die Datei.txt hat ja hier nix zu suchen, erst ganz unten wird sie erstellt. :gruebel:

Den Code von mkinzler überhaupt probiert?

Er muss ja zeilenweise speichern, und nicht erst alles am Ende, weil er keine StringList als Puffer nimmt.

AlexII 22. Mai 2009 19:34

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Er muss ja zeilenweise speichern, und nicht erst alles am Ende, weil er keine StringList als Puffer nimmt.
Ja habe ich, die .txt ist danach immer leer.

mkinzler 22. Mai 2009 19:36

Re: String mit Leerzeichen verursacht Chaos???
 
Schlieest du die Datei auch (
Delphi-Quellcode:
CloseFile( tf);
)?

AlexII 22. Mai 2009 19:38

Re: String mit Leerzeichen verursacht Chaos???
 
Ich hab das Problem wo anders gefunden, die Strings werden doch richtig und mit Leerzeichen gespeichert, geladen werden sie falsch und ich dachte sie wurden falsch abgespeichert, verzeiht. Hier werden die Strings mit den Leerzeichen durcheinander gebracht:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
    List : TStringList;
    List2: TStringList;
begin
  List:=TStringList.Create;
  List2:=TStringList.Create;
  List2.Delimiter:='=';
  try
    List.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Datei.txt');
    for i:=0 to List.Count-1 do
    begin
    List2.DelimitedText:=List[i];

    ListBox1.Items.Insert(i, List2[1]);
    ListBox2.Items.Insert(i, List2[2]);
    ListBox3.Items.Insert(i, List2[3]);
    ListBox4.Items.Insert(i, List2[4]);
    end;
  finally
    List.Free;
    List2.Free;
  end;
end;

mkinzler 22. Mai 2009 19:41

Re: String mit Leerzeichen verursacht Chaos???
 
In diesem Fall könntest du die Leerzeichen durch ein anderes Zeichen (welches im text natürlich nicht vorkommen darf) ersetzen. Später durch die Einträge durchgehen und zurückersetzen

AlexII 22. Mai 2009 19:42

Re: String mit Leerzeichen verursacht Chaos???
 
Das hatte ich auch vor :-D aber ich gucke mal, vllt beseitige ich das Problem anders.

mkinzler 22. Mai 2009 19:49

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von AlexII
Das hatte ich auch vor :-D aber ich gucke mal, vllt beseitige ich das Problem anders.

Sollte eigentlich kein großes Problem darstellen

Klaus01 22. Mai 2009 19:49

Re: String mit Leerzeichen verursacht Chaos???
 
Hallo,

ich hatte mal für einen anderen Thread das explode
so umgebaut das es eine StringList zurückgibt.

Delphi-Quellcode:
// Explode trennt S in die durch Separator getrennten Elemente auf. Wenn Limit
// > 0 ist, so werden max. Limit Elemente getrennt, wobei im letzen Element
// die Restzeichenkette steht.

function Explode(const Separator, S: string; Limit: Integer = 0): TStringList;
var
  SepLen: Integer;
  F, P: PChar;
  Index: Integer;
begin
  result := TStringList.Create;
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    Result.add(S);
    Exit;
  end;
  SepLen := Length(Separator);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then
      P := StrEnd(F);
    result.Add(copy(AnsiString(F),0,P-F));
    inc(index,1);
    if P^ <> #0 then Inc(P, SepLen);
  end;

end;

Damit würde Dein Code dann so ausschauen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
    List : TStringList;
    List2: TStringList;
begin
  List:=TStringList.Create;
  try
    List.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Datei.txt');
    for i:=0 to List.Count-1 do
      begin
        List2:=explode('=',List[i]);

        ListBox1.Items.Insert(i, List2[1]);
        ListBox2.Items.Insert(i, List2[2]);
        ListBox3.Items.Insert(i, List2[3]);
        ListBox4.Items.Insert(i, List2[4]);
        List2.free;
      end;
  finally
    List.Free;
 
  end;
end;
Grüße
Klaus

AlexII 22. Mai 2009 19:53

Re: String mit Leerzeichen verursacht Chaos???
 
Wow es klappt, aber wieso wird die List2 in der Schleife freigegeben, ist das richtig so? :gruebel:

Klaus01 22. Mai 2009 19:55

Re: String mit Leerzeichen verursacht Chaos???
 
Zitat:

Zitat von AlexII
Wow es klappt, aber wieso wird die List2 in der Schleife freigegeben, ist das richtig so? :gruebel:

ja, denn explode erstellt eine StringList Instanz und diese wird List2 übergeben.

Grüße
Klaus

AlexII 22. Mai 2009 19:57

Re: String mit Leerzeichen verursacht Chaos???
 
Ah... jah... ok, danke dir :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:13 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