Autor Beitrag
sintec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Do 28.06.07 15:21 
Hallo leutz,

ich habe folgendes Problem:

In meinem Programm lade ich eine Textdatei in eine TStringlist,die möglicherweise Leerzeilen und Leerzeichen enthalten kann.
Die TStringlist möchte ich von den Leerzeilen und Leerzeichen, die am ende einer Zeile sind bereinigen (nur die Leerzeichen die am ende einer Zeile sind möchte ich weg haben, nicht die dazwischen sind)
Habe schon vieles ausprobiert doch es kommt ständig zu Programmabstürzen.

Hier sind zwei meiner mehreren Versuche:

Variante 1:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
index.LoadFromFile(dlg_openindexfile.FileName);

  i:=0;
  while (i<=index.Count-1do
  begin
    datei := index[i];
    if (datei[length(datei)] = ' 'then
    begin
      datei := copy(datei,0,Length(datei)-1);
      index[i] := datei;
    end
    else
      if datei = '' then
      begin
        index.Delete(i);
      end
      else
        inc(i);
  end;


Variante 2:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
for I := 0 to index.Count - 1 do
  begin
    if index[i] <> '' then
    begin
      datei := index[i];
      while (datei[length(datei)] = ' 'and (index[i] <> '')do
      begin
        datei := copy(datei,0,Length(datei)-1);
        index[i] := datei;
      end;
    end;
  end;

  i := 0;
  while (i<=index.Count-1do
  begin
    if index[i] = '' then
    begin
      index.Delete(i);
    end
    else
      inc(i);
  end;


bei Variante 2 funktionierte die zweite Hälfte, die die TStringlist von Leerzeilen befreite.

Bekomme bei beiden Variante eine Fehlermeldung "Zugriffsverletzung bei Adresse ******"

Kann mir jemand bitte helfen?
Marco D.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2750

Windows Vista
Delphi 7, Delphi 2005 PE, PHP 4 + 5 (Notepad++), Java (Eclipse), XML, XML Schema, ABAP, ABAP OO
BeitragVerfasst: Do 28.06.07 15:27 
Man sollte in einer Schleife, welche die Liste von vorne durchläuft, nie Einträge entfernen, dann kommt es in der Regel zu Zugriffsverletzungen. Lass die Schleife von hinten durch die Liste laufen:
ausblenden Delphi-Quelltext
1:
2:
for i := index.count - 1 to 0 do
begin...

_________________
Pascal keeps your hand tied. C gives you enough rope to hang yourself. C++ gives you enough rope to shoot yourself in the foot
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Do 28.06.07 15:28 
Guck mal nach
ausblenden Delphi-Quelltext
1:
Trim();					

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
FiceGoesDelphi
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 485

Win XP Prof
Delphi 2006
BeitragVerfasst: Do 28.06.07 15:28 
Such mal in der OH nach "trim" ;)

EDIT: Das war höchstens 1 Sekunde @ chrisw *gg* ;)

_________________
<(^^<) <(^^)> (>^^)>
===================
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Do 28.06.07 15:34 
@FiceGoesDelphi
Du hälst dich zu lange mit den Smilies auf :!:

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
sintec Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133



BeitragVerfasst: Fr 29.06.07 08:25 
Welche Variante wäre besser/schneller/effektiver und wo soll ich Trim() benutzen?

EDIT:

So wie es aussieht klappt es so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
i := 0;
  while (i<=index.Count-1do
  begin
    if trim(index[i]) = '' then
    begin
      index.Delete(i);
    end
    else
      inc(i);
  end;

  for I := 0 to index.Count - 1 do
  begin
    if index[i] <> '' then
    begin
      datei := index[i];
      while (datei[length(datei)] = ' 'and (index[i] <> '')do
      begin
        datei := copy(datei,0,Length(datei)-1);
        index[i] := datei;
      end;
    end;
  end;


Vielen Dank an alle die geholfen haben.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 29.06.07 10:42 
Hallo,

das dürfte schneller sein, es wird nur wenig auf sL[i] zugriffen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  i := sL.Count-1;
  while i >= 0 do
    begin
    s := sL[i];
    x := Length(s);
    if Trim(s) = '' then
      sL.Delete(i)
      else
        begin
        while s[x] = ' ' do
          dec(x);
        if x <> Length(s) then
          begin
          SetLength(s,x);
          sL[i] := s;
          end;
        dec(i);
        end;
    end;
bin mir aber sicher das das noch verbesserbar ist. :wink:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )