Delphi-PRAXiS

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

hoika 30. Jul 2009 10:04

Re: Leerzeilen in Tstringlist
 
Hallo,

oder wie es so schön heisst

DRY

Don't repeat yourself


Heiko

gangs-taas 30. Jul 2009 10:19

Re: Leerzeilen in Tstringlist
 
oU man
ich bekomme das einfach nicht hin....

wieso geht das hier nicht ?
ich hab sogar extra noch einmal in den Crashkurs delphi geguckt und alles

aber es kommt nur mist raus


Delphi-Quellcode:
function TForm1.SpeicherHilfe(Var Memo: TMemo ; StringListe : TStringList): TStringList;
var
I : Integer ;
PrüfString : String;
begin
  For i := 0 to (Memo.Lines.Count-1) do
    begin
      Prüfstring := Memo1.Lines[i];
      if(Prüfstring = '') or (Prüfstring ='Serien Termine') then
        continue
      Else
        StringListe.Add(Memo.Lines[i]) ;
  end;
end;


procedure TForm1.SpeichernClick(Sender: TObject);
var
MoString, DiSTring, MiString, DoString, FrString, SaString, SoString :Tstringlist;
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');
  MoString := SpeicherHilfe( Memo1, MoString);
  DiString := SpeicherHilfe( Memo2, DiString);
  MiString := SpeicherHilfe( Memo3, MiString);
  DoString := SpeicherHilfe( Memo4, DoString);
  FrString := SpeicherHilfe( Memo5, FrString);
  SaString := SpeicherHilfe( Memo6, SaString);
  SoString := SpeicherHilfe( Memo7, SoString);
  Zwischenspeicher.Text := MoString.Text;
  Zwischenspeicher.Add(trim(DiString.Text));
  Zwischenspeicher.Add(trim(MiString.Text));
  Zwischenspeicher.Add(trim(DoString.Text));
  Zwischenspeicher.Add(trim(FrString.Text));
  Zwischenspeicher.Add(trim(SaString.Text));
  Zwischenspeicher.Add(trim(SoString.Text));
  Zwischenspeicher.SaveToFile(Textdatei);
end;

mkinzler 30. Jul 2009 10:23

Re: Leerzeilen in Tstringlist
 
Delphi-Quellcode:
  For i := 0 to Memo.Lines.Count-1 do
  begin
      Prüfstring := Memo1.Lines[i];
      if(Prüfstring <> '') and (Prüfstring <> 'Serien Termine') then
        StringListe.Add(Memo1.Lines[i]) ;
  end;
BTW. Das mit den Umlauten in Variablennamen ninmt er so? :gruebel:

gangs-taas 30. Jul 2009 10:27

Re: Leerzeilen in Tstringlist
 
ja das mit dne umlauten nimmst er
aber ich kanns ändern wenn es euch stört...


wenn ich das alles so mach :
bekommt meine Textdatei den Text :
Sonntag
Sonntag
Sonntag
Sonntag
Sonntag
Sonntag
Sonntag



aber warum ?

Delphi-Quellcode:
function TForm1.SpeicherHilfe(Var Memo: TMemo ; StringListe : TStringList): TStringList;
var
I : Integer ;
Pruefstring : String;
begin
For i := 0 to Memo.Lines.Count-1 do
  begin
      Pruefstring := Memo1.Lines[i];
      if(Pruefstring <> '') and (Pruefstring <> 'Serien Termine') then
        StringListe.Add(Memo1.Lines[i]) ;
  end;
end;


procedure TForm1.SpeichernClick(Sender: TObject);
var
MoString, DiSTring, MiString, DoString, FrString, SaString, SoString :Tstringlist;
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');
  MoString := SpeicherHilfe( Memo1, MoString);
  DiString := SpeicherHilfe( Memo2, DiString);
  MiString := SpeicherHilfe( Memo3, MiString);
  DoString := SpeicherHilfe( Memo4, DoString);
  FrString := SpeicherHilfe( Memo5, FrString);
  SaString := SpeicherHilfe( Memo6, SaString);
  SoString := SpeicherHilfe( Memo7, SoString);
  Zwischenspeicher.Text := MoString.Text;
  Zwischenspeicher.Add(trim(DiString.Text));
  Zwischenspeicher.Add(trim(MiString.Text));
  Zwischenspeicher.Add(trim(DoString.Text));
  Zwischenspeicher.Add(trim(FrString.Text));
  Zwischenspeicher.Add(trim(SaString.Text));
  Zwischenspeicher.Add(trim(SoString.Text));
  Zwischenspeicher.SaveToFile(Textdatei);
end;

nahpets 30. Jul 2009 10:36

Re: Leerzeilen in Tstringlist
 
Delphi-Quellcode:
function TForm1.SpeicherHilfe(Var Memo: TMemo ; StringListe : TStringList): TStringList;
var
I : Integer ;
Pruefstring : String;
begin
For i := 0 to Memo.Lines.Count-1 do
  begin
--> Fehler!!! muss Memo heißen -->     Pruefstring := Memo1.Lines[i];
      if(Pruefstring <> '') and (Pruefstring <> 'Serien Termine') then
--> Fehler!!! muss Memo heißen -->       StringListe.Add(Memo1.Lines[i]) ;
  end;
end;

gangs-taas 30. Jul 2009 10:42

Re: Leerzeilen in Tstringlist
 
aber selbst wenn ich das so mach wie du sagst bekomme ihc trotzdem in der endgültigen Textdatei nur
sonntag
sonntag
sonntag
ect.

hab das jetzt soo


Delphi-Quellcode:
function TForm1.SpeicherHilfe(Var Memo: TMemo ; StringListe : TStringList): TStringList;
var
I : Integer ;
Pruefstring : String;
begin
For i := 0 to Memo.Lines.Count-1 do
  begin
      Pruefstring := Memo.Lines[i];
      if(Pruefstring <> '') and (Pruefstring <> 'Serien Termine') then
        StringListe.Add(Memo.Lines[i]) ;
  end;
end;

Trotzdem nur sonntag ...

DeddyH 30. Jul 2009 10:45

Re: Leerzeilen in Tstringlist
 
Ich hab mal was stumpf heruntergetippt, schau mal, ob das so funktioniert.
Delphi-Quellcode:
procedure TForm1.SpeichernClick(Sender: TObject);
var sResult :Tstringlist;
   

    procedure StripLines(const Titel: string; const sLines: TStrings);
    const sIgnore = 'Serien Termine'
    var i : integer;
    begin
      sResult.Add(Titel);
      for i := 0 to sLines.Count - 1 do
        if (sLines[i] <> '') and (sLines[i] <> sIgnore) then
          sResult.Add(sLines[i]);
    end;
   
begin
  sResult := TStringlist.Create;
  try
    StripLines('Montag', Memo1.Lines);
    StripLines('Dienstag', Memo2.Lines);
    StripLines('Mittwoch', Memo3.Lines);
    StripLines('Donnerstag', Memo4.Lines);
    StripLines('Freitag', Memo5.Lines);
    StripLines('Samstag', Memo6.Lines);
    StripLines('Sonntag', Memo7.Lines);
    sResult.SaveToFile(Textdatei);
  finally
    sResult.Free;
  end;
end;

gangs-taas 30. Jul 2009 10:51

Re: Leerzeilen in Tstringlist
 
es klappt

ist gibt nur eins was mich stört

wenn ich irgendiwe


test123
Serien Termine
blub


eingebeen habe
sollte ja - so von der idee her - nur test123 gespeichert werden

er speichert aber

test123
blub



ps. ich wusste garnicht, dass man inerhalbt von Procedures weitere procedures anlegen kann :oops: :oops:

DeddyH 30. Jul 2009 10:53

Re: Leerzeilen in Tstringlist
 
Dann hab ich das falsch verstanden. OK, dann müsste das so gehen:
Delphi-Quellcode:
procedure StripLines(const Titel: string; const sLines: TStrings);
    const sIgnore = 'Serien Termine'
    var i : integer;
    begin
      sResult.Add(Titel);
      for i := 0 to sLines.Count - 1 do
        if (sLines[i] <> '') and (sLines[i] <> sIgnore) then
          sResult.Add(sLines[i])
        else
          break;
    end;

gangs-taas 30. Jul 2009 10:55

Re: Leerzeilen in Tstringlist
 
vielen dank


hehe doch mit break xD

DeddyH 30. Jul 2009 11:01

Re: Leerzeilen in Tstringlist
 
Das geht auch ohne break :zwinker:
Delphi-Quellcode:
procedure StripLines(const Titel: string; const sLines: TStrings);
    const sIgnore = 'Serien Termine'
    var i : integer;
    begin
      sResult.Add(Titel);
      i := 0;
      while (i < sLines.Count) and (sLines[i] <> '') and (sLines[i] <> sIgnore) do
        begin
          sResult.Add(sLines[i]);
          inc(i);
        end;
    end;

gangs-taas 30. Jul 2009 11:13

Re: Leerzeilen in Tstringlist
 
ich bleib bei dem was klappt ^^

danke


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