Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Leere MemoLines herausfiltern (https://www.delphipraxis.net/172002-leere-memolines-herausfiltern.html)

b0urb0nkid 6. Dez 2012 15:42

Delphi-Version: XE2

Leere MemoLines herausfiltern
 
Moin Moin,
Ich schreibe gerade an einem Programm, welches mit einer selbsterstellten Config.txt arbeiten soll.
Diese lasse ich auslesen und splitte den Inhalt in verschiedene Memos auf.
Nun sind in den Memos am Ende immer Leerzeichen, welche ich herausfiltern wollte, da ich sonnst beim Einlesen wieder Probleme hab.
Mein Ansatz war:
Delphi-Quellcode:
procedure TFEinstellungen.BSpeichernClick(Sender: TObject);
var
  List: TStrings;
  i : integer;
  k : integer;
begin
  List := TStringList.Create;
  try
    List.Add('#Pfad der Vorlage');
    List.Add(EVor.Text);
    List.Add('#Pfad des neuen Ordners');
    List.Add(ENeu.Text);
    for i := 0 to MAnfangsDatum.Lines.Count-1 do
      if List[i] <> '' then
        List.Add(MAnfangsDatum.Lines[i]);
    for k := 0 to MEndDatum.Lines.Count-1 do
      if List[k] <> '' then
        List.Add(MEndDatum.Lines[k]);
    List.SaveToFile('*Beispielpfad*');
  finally
    List.Free;
  end;
  ShowMessage('Ihre Konfiguration wurde gespiechert.');
  Close;
end;
jedoch sind in der Config.txt trotz
Delphi-Quellcode:
if List[i] <> '' then
noch Leerzeichen.

Ich hoffe ihr könnt mir helfen
Gruß Hendrik

Bummi 6. Dez 2012 15:46

AW: Leere MemoLines herausfiltern
 
Delphi-Quellcode:
if TRIM(MAnfangsDatum.Lines[i]) <> '' then

'' ist eine komplett leere Zeile
' ' ist eine Zeile mit einem Leerzeichen
' ' ist eine Zeile mit zwei Leerzeichen
etc ....

b0urb0nkid 6. Dez 2012 15:54

AW: Leere MemoLines herausfiltern
 
Vielen Dank Bummi!
Es haut jetzt hin mit ' ', wobei ich nicht ganz verstehe, warum eine eigentlich komplett leere Zeile (also nur Enter gedrückt) erst bei ' ' gelöscht wird und nicht bei ''.

Gruß Hendrik

p80286 6. Dez 2012 16:09

AW: Leere MemoLines herausfiltern
 
Zitat:

Zitat von b0urb0nkid (Beitrag 1194567)
Delphi-Quellcode:
    for i := 0 to MAnfangsDatum.Lines.Count-1 do
      if List[i] <> '' then
        List.Add(MAnfangsDatum.Lines[i]);

Dir ist schon klar, daß Du Dich da auf ganz dünnem Eis bewegst?
i wird durch MAnfangsDatum.Lines.Count bestimmt und it i greifst Du auf List zu. Das kann ganz schnell zu unerwünschten Reaktionen führen.

gruß
K-H

shmia 6. Dez 2012 16:12

AW: Leere MemoLines herausfiltern
 
Delphi-Quellcode:
{**************************************************************************
 * NAME:   RemoveEmptyStrings
 * DESC:   lösche leere Zeilen aus StringListe
 * RESULT: Anzahl der Löschungen
 *************************************************************************}
function RemoveEmptyStrings(list : TStrings):Integer;
var
   i : Integer;
begin
   Assert(Assigned(list));
   Result := 0;
   for i := list.Count-1 downto 0 do
   begin
      if TrimRight(list[i]) = '' then
      begin
         list.Delete(i);
         Inc(Result);
      end;
   end;
end;
Die Funktion löscht rückwärts; hat also den Bug, den mein Vorposter angesprochen hat nicht.

b0urb0nkid 6. Dez 2012 16:36

AW: Leere MemoLines herausfiltern
 
Vielen Dank K-H!
Hatte ich vorher gar nicht bemerkt, was ich da für ein Mist zusammengeschrieben habe.

Popov 6. Dez 2012 17:11

AW: Leere MemoLines herausfiltern
 
Ich spiele jetzt mal himitsu und gebe dir den Tipp:
Delphi-Quellcode:
      if Length(TrimRight(list[i])) = 0 then
      ...
Auf 0 kann besser geprüft werden als auf ''.

shmia 6. Dez 2012 17:37

AW: Leere MemoLines herausfiltern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Popov (Beitrag 1194580)
Auf 0 kann besser geprüft werden als auf ''.

Irrtum, der Stringvergleich auf '' ist effizienter als Length(s)=0.
Delphi-Quellcode:
var
   s : string;
begin
   s := Trim(' ');
   if s = '' then  // rot markiert, 1 X86-Befehl
      ShowMessage('1');
   if Length(s) = 0 then // grün markiert, 3 X86-Befehle
      ShowMessage('2');

Popov 6. Dez 2012 17:53

AW: Leere MemoLines herausfiltern
 
Willst du behaupten, dass himitsu nicht die Wahrheit sagt?

shmia 6. Dez 2012 18:07

AW: Leere MemoLines herausfiltern
 
Zitat:

Zitat von Popov (Beitrag 1194585)
Willst du behaupten, dass himitsu nicht die Wahrheit sagt?

Ähh ... natürlich nicht.
Die 3 Assemblerbefehle sind insgesamt viel schneller als der eine lausige Cmp-Befehl.
Ausserdem brauchen die 3 Befehle auch weniger Platz im RAM.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr.
Seite 1 von 2  1 2      

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