Access violation bei TStringList.Create - warum?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Access violation bei TStringList.Create - warum?

Beitrag von Jay »

Hallo!

Habe ein Problem mit folgendem Codeschnipsel (noch nicht sehr weit fortgeschritten), den ich für einen Parser benötige:

Code: Alles auswählen

function EntferneNichtBenoetigtes(s: TStringList): TStringList;
var i: Word;
    TmpStrList: TStringList;
    TmpStr: String;
begin
  TRY
    TmpStrList:=TStringList.Create;
    for i:=0 to s.Count-1 do begin
      TmpStr:=trim(s.Strings[i]);
      if TmpStr[1]<>'#' then
        TmpStrList.Add(TmpStr);
    end;
  FINALLY
    Result:=TmpStrList;
    TmpStrList.Free;
  END;
end;
Kann leider keinen Fehler entdecken ...
Ich weiß nur, dass er beim Ausführen dieses Codes "Access violation" anzeigt.

Gruß
Jay

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Das ist gleich mehreres falsch.

Erstens: Zugriff auf TmpStr[1] gibt einen Fehler, wenn der String leer ist.
Zweitens: Du machst TmpStrList.Free was aber eigentlich dein Resultat ist.
Das muss schiefgehen.

Mach's viel einfacher:

Code: Alles auswählen

procedure EntferneNichtBenoetigtes(input, output: TStringList);
var i: integer;
    TmpStr: String;
begin
   for i:=0 to input.Count-1 do begin
     TmpStr:=trim(input.Strings[i]);
     if (Length(TmpStr)>0) and (TmpStr[1]<>'#') then output.Add(TmpStr);
    end;
end;

Code: Alles auswählen

...
b:=TStringList.Create;
EntferneNichtBenoetigtes(a,b);
Memo1.Text:=b.text; //Beispiel
b.free;
...

Jay
Beiträge: 65
Registriert: Sa 29. Dez 2007, 02:21
OS, Lazarus, FPC: Linux, 0.9.30.4 Beta, FPC 2.6.0
CPU-Target: 32Bit
Kontaktdaten:

Beitrag von Jay »

Hi,

danke, habs jetz geschnallt :)
Hab vorher noch nicht so ausgiebig mit Stringlisten gearbeitet.

Antworten