Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Leerzeilen in Tstringlist (https://www.delphipraxis.net/137861-leerzeilen-tstringlist.html)

gangs-taas 29. Jul 2009 23:31


Leerzeilen in Tstringlist
 
hey,
ich habe eine Problem.
Ich habe mherere Memofelder und möchte diese in einer Textdatei speichern.
Nun sollen aber keine Leerzeilen in die datei und wenn in dem memoFelder 'Serien Termine' steht sollen alle Zeilen ab dieser Zeile auch NICHT gespeichert werden.

Ich dachte ich mach das so :


aber es sind sowohl leerzeilen in meiner textdatei und die Sachen die in den Memofelder mal drin standen sind hinterher irg. in der Textdatei nicht drin...

wordrann könnte das liegen ?!

hoffe ihr könnt mir (schon wieder :oops: :oops: ) Helfen

lg

Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var
MoString, DiSTring, MiString, DoString, FrString, SaString, SoString :Tstringlist;
PrüfString : String;
i : integeR ;
ZeilenZähler : Integer ;
begin
ZeilenZähler := 0 ;
  MoString := Tstringlist.Create;
  DiSTring := Tstringlist.Create;
  MiString := Tstringlist.Create;
  DoString := Tstringlist.Create;
  FrString := Tstringlist.Create;
  SaString := Tstringlist.Create;
  SoString := Tstringlist.Create;
  MoString.Add('Montag');
  DiString.Add('Dienstag');
  MiString.Add('Mittwoch');
  DoString.Add('Donnerstag');
  FrString.Add('Freitag');
  SaString.Add('Samstag');
  SoString.Add('Sonntag');
  For i := 0 to (Memo1.Lines.Count) do
  begin
    Prüfstring := Memo1.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      MoString.Add(Memo1.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo2.Lines.Count) do
  begin
    Prüfstring := Memo2.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      DiString.Add(Memo2.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo3.Lines.Count) do
  begin
    Prüfstring := Memo3.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      MiString.Add(Memo3.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo4.Lines.Count) do
  begin
    Prüfstring := Memo4.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      DoString.Add(Memo4.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo5.Lines.Count) do
  begin
    Prüfstring := Memo5.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      FrString.Add(Memo5.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo6.Lines.Count) do
  begin
    Prüfstring := Memo6.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      SaString.Add(Memo6.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  For i := 0 to (Memo7.Lines.Count) do
  begin
    Prüfstring := Memo7.Lines[ZeilenZähler];
    if(Prüfstring = #13#10) or (Prüfstring ='Serien Termine') then
    begin
      break;
      ZeilenZähler := 0;
    end
    Else
      SoString.Add(Memo7.Lines[ZeilenZähler]) ;
      Inc(ZeilenZähler);
  end;
  Zwischenspeicher.Text := MoString.Text;
  Zwischenspeicher.Add(DiString.Text);
  Zwischenspeicher.Add(MiString.text);
  Zwischenspeicher.Add(DoString.Text);
  Zwischenspeicher.Add(FrString.Text);
  Zwischenspeicher.Add(SaString.Text);
  Zwischenspeicher.Add(SoString.Text);
  Zwischenspeicher.SaveToFile(Textdatei);
end;
ps. ich hab mir sogar mühe gegeben es zu formatieren ^^

BUG 29. Jul 2009 23:49

Re: Leerzeilen in Tstringlist
 
Erster Eindruck:
  • benutze i statt zeilenzaehler in den Schleifen (dann musst du dich nicht mehr um das zurücksetzen kümmern)
  • die Schleifen dürfen nur bis Memo.Lines.Count-1 gehen
  • in deinen if-then-Anweisungen brichst du du bei beiden Bedingungen die Schleife komplett ab (break, bei der Leerzeile wäre continue von Nöten (oder du kannst dann auch einfach Garnichts tuen))
  • nach break oder continue werden keine weiteren Anweisungen in dem Schleifendurchlauf durchgeführt (zeilenzaehler wird nie zurückgesetzt)
  • bei einer Leerzeile ist [i]Memo.Lines = ''

MfG,
Bug

gangs-taas 30. Jul 2009 09:17

Re: Leerzeilen in Tstringlist
 
okay
ich versuchs ^^
hoffentlich klappt das ^^

gangs-taas 30. Jul 2009 09:35

Re: Leerzeilen in Tstringlist
 
ich hab das jetzt so geändert wie ich dachte, dass du es meisnt.

Trotzdem hatte ich noch leerzeilen in der Textdatei drin.
Also habe ich gedacht ich baue noch eine Prüf-For-Schleife ein ...
aber selbst das bringt nichts ....

im mom siehst so aus :
(und es sind immernoch leerzeilen in der textdatei *grummel*)

Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var
MoString, DiSTring, MiString, DoString, FrString, SaString, SoString :Tstringlist;
PrüfString : String;
i : integeR ;
begin
  MoString := Tstringlist.Create;
  DiSTring := Tstringlist.Create;
  MiString := Tstringlist.Create;
  DoString := Tstringlist.Create;
  FrString := Tstringlist.Create;
  SaString := Tstringlist.Create;
  SoString := Tstringlist.Create;
  MoString.Add('Montag');
  DiString.Add('Dienstag');
  MiString.Add('Mittwoch');
  DoString.Add('Donnerstag');
  FrString.Add('Freitag');
  SaString.Add('Samstag');
  SoString.Add('Sonntag');
  For i := 0 to (Memo1.Lines.Count-1) do
  begin
    Prüfstring := Memo1.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      MoString.Add(Memo1.Lines[i]) ;
  end;
  For i := 0 to (Memo2.Lines.Count-1) do
  begin
    Prüfstring := Memo2.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      DiString.Add(Memo2.Lines[i]) ;
  end;
  For i := 0 to (Memo3.Lines.Count-1) do
  begin
    Prüfstring := Memo3.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      MiString.Add(Memo3.Lines[i]) ;
  end;
  For i := 0 to (Memo4.Lines.Count-1) do
  begin
    Prüfstring := Memo4.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      DoString.Add(Memo4.Lines[i]) ;
  end;
  For i := 0 to (Memo5.Lines.Count-1) do
  begin
    Prüfstring := Memo5.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      FrString.Add(Memo5.Lines[i]) ;
  end;
  For i := 0 to (Memo6.Lines.Count-1) do
  begin
    Prüfstring := Memo6.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      SaString.Add(Memo6.Lines[i]) ;
  end;
  For i := 0 to (Memo7.Lines.Count-1) do
  begin
    Prüfstring := Memo7.Lines[i];
    if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
    continue
    Else
      SoString.Add(Memo7.Lines[i]) ;
  end;
  Zwischenspeicher.Text := MoString.Text;
  Zwischenspeicher.Add(DiString.Text);
  Zwischenspeicher.Add(MiString.text);
  Zwischenspeicher.Add(DoString.Text);
  Zwischenspeicher.Add(FrString.Text);
  Zwischenspeicher.Add(SaString.Text);
  Zwischenspeicher.Add(SoString.Text);
  For i:= 0 To Zwischenspeicher.Count -1 do  // das hier
  begin                                      // ist
    If(Zwischenspeicher[i] = '') Then        // jetzt
      Zwischenspeicher.Delete(i);            // neu
  end;
  Zwischenspeicher.SaveToFile(Textdatei);
end;

DeddyH 30. Jul 2009 09:40

Re: Leerzeilen in Tstringlist
 
Ich habe mir nicht alles in allen Einzelheiten angeschaut, aber beim Löschen musst Du die Schleife rückwärts laufen lassen.
Delphi-Quellcode:
For i:= Zwischenspeicher.Count -1 downto 0 do  // das hier
  begin                                      // ist
    If(Zwischenspeicher[i] = '') Then        // jetzt
      Zwischenspeicher.Delete(i);            // neu
  end;

gangs-taas 30. Jul 2009 09:44

Re: Leerzeilen in Tstringlist
 
nach dem speichern sieht der inhalt meiner textdatei aber immer noch so aus :
Montag
Dienstag

Mittwoch

Donnerstag

Freitag

Samstag

Sonntag




also klappt es immer noch nicht ....


nur (komischerweise) nach Montag ist keine Leerzeile )

DeddyH 30. Jul 2009 09:47

Re: Leerzeilen in Tstringlist
 
Und so?
Delphi-Quellcode:
Zwischenspeicher.Add(trim(DiString.Text)); // das Gleiche für die anderen Listen
Übrigens machst Du zig mal quasi dasselbe, das würde ich in eine Funktion auslagern.

gangs-taas 30. Jul 2009 09:52

Re: Leerzeilen in Tstringlist
 
Jetzt klappt es

danke


aber wenn ich das in eine Funktion auslager müsste ich doc hjedesmal übergeben, an welches Memo und Welche TStringlist.
dann ist das doch auch umständlich odeR ?

DeddyH 30. Jul 2009 09:55

Re: Leerzeilen in Tstringlist
 
Finde ich nicht. Außerdem kannst Du dann sicher sein, dass Du immer exakt dasselbe machst und nicht mittendrin irgendwo eine Zeile vergisst oder sowas.

nahpets 30. Jul 2009 10:02

Re: Leerzeilen in Tstringlist
 
Hallo,

auch wenn schon eine Lösung da ist, mal ein anderer Ansatz: (bin halt mal wieder langsamer als DeddyH :cry: )

Zuerst alle Leerzeilen löschen und dann alles hinter 'Serien Termine' löschen.
Dazu nehmen wir eine Funktion, um das alles nicht mehrfach implementieren zu müssen.

Delphi-Quellcode:
function MachLeerWeg(Eingabe : TStrings) : String;
begin
  // Damit sind alle Leerzeilen weg.
  for i := Eingabe.Count - 1 DownTo 0 do if Eingabe[i] = '' then Eingabe.Delete(i);
  // Nun prüfen, ob die Zeichenfolge 'Serien Termine' vorhanden ist:
  if Pos('Serien Termine',Eingabe.Text) > 0 then begin
    repeat
      Eingabe.Delete(Eingabe.Count - 1);
    until Eingabe[Eingabe.Count - 1] = 'Serien Termine';
  end;
  if (Eingabe.Count > 0) and (Eingabe[Eingabe.Count - 1]) = 'Serien Termine' then begin
    Eingabe.Delete(Eingabe.Count - 1);
  end;
  Result := Eingabe.Text;
end;
Im Programm dann so aufrufen:
Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
begin
  Zwischenspeicher.Clear;
  Zwischenspeicher.Add('Montag');
  Zwischenspeicher.Add(MachLeerWeg(Memo1.Lines));
  Zwischenspeicher.Add('Dienstag');
  Zwischenspeicher.Add(MachLeerWeg(Memo2.Lines));
  Zwischenspeicher.Add('Mittwoch');
  Zwischenspeicher.Add(MachLeerWeg(Memo3.Lines));
  Zwischenspeicher.Add('Donnerstag');
  Zwischenspeicher.Add(MachLeerWeg(Memo4.Lines));
  Zwischenspeicher.Add('Freitag');
  Zwischenspeicher.Add(MachLeerWeg(Memo5.Lines));
  Zwischenspeicher.Add('Samstag');
  Zwischenspeicher.Add(MachLeerWeg(Memo6.Lines));
  Zwischenspeicher.Add('Sonntag');
  Zwischenspeicher.Add(MachLeerWeg(Memo7.Lines));
  Zwischenspeicher.SaveToFile(Textdatei);
end;
(Das ist jetzt nur so hingedaddelt und nicht getestet.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.
Seite 1 von 3  1 23      

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