Announcement

Collapse
No announcement yet.

Problem mit TStringList

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit TStringList

    Hi,<p>
    da in meinem Programm Probleme mit TStringList auftreten, habe ich ein Mini-Programm geschrieben, um zu testen, ob der Fehler<br>
    dort ebenfalls auftritt.<p>
    <pre>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    type
    TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    var
    sl: TStringlist;
    begin
    try
    sl := TStringlist.Create;
    sl.Add('Test');
    finally
    sl.Free;
    end;
    end;

    end.
    </pre><p>
    Nun zu meinem Problem:<br>
    Ich debugge das Programm zeilenweise ab "sl := TStringlist.Create;" und überwache dabei "sl". Vor dem TStringlist.Create steht<br>
    bei sl[0] "Zugriffsverletzung bei 00700465 und Zugriff auf 00700465", was ja noch einleuchtet, da sl noch nicht existiert.<br>
    Nach dem Create steht bei sl[0] "Delphi-Exception EStringListError bei $3CEF969". Erwartet hätte ich "nil".<br>
    Nach Add steht korrekt "Test" dort, und nach Free wieder die erste Meldung.<br>
    Trace ich das Programm weiter und führe das "end." nach Application.Run aus, bekomme ich eine Fehlermeldung "EAccessViolation".<br>
    Starte ich das Programm direkt danach ein weiteres Mal, kommt manchmal, aber nicht immer, eine Schutzverletzung.<br>
    Kann mir jemand dieses Verhalten erklären und mir sagen, was ich falsch mache? Danke im voraus.<p>
    Grüße, Reimund

  • #2
    Hallo,

    wenn man das folgende Beispiel mit aktivierten <b>Debug-DCUs</b> (Projektoptionen | Compiler | Debuggen) zeilenweise untersucht, wird deutlich, dass Delphi beim Zugriff über sl[0] die TStringList-Methode <b>Get</b> aufruft. Daher ist klar, dass Delphi eine Exception auslöst (<i>Index überschreitet das Maximum</i>):
    <pre>
    procedure TForm1.Button2Click(Sender: TObject);
    var
    sl: TStringlist;
    sTest : String;
    begin
    try
    sl := TStringlist.Create;
    sTest := sl[0]; // = TStringList.Get(Index: Integer)
    finally
    sl.Free;
    end;
    end;
    </pre&gt

    Comment


    • #3
      Hallo Andreas,<p>
      ich hab das mit sTest := sl[0] mal ausprobiert und dabei festgestellt, daß der Fehler "EAccessViolation" nicht bei TStringlist.Get auftritt. Sorry, daß ich jetzt so blöd frage, aber wie hat dann TStringlist.Get mit meinem Problem zu tun? Und wieso überschreitet der Index das Maximum? Der Index ist doch 0. Oder kapier ich da irgendwas überhaupt nicht? :-(<p>
      Grüße, Reimun

      Comment


      • #4
        Hi

        Wenn Du im Debugview mit StringList[0] versuchst den 1. Eintrag einer LEEREN StringList auszulesen, wird der DebugView eine Exception anzeigen. Nun, eine LEERE StringListe hat Count := 0 Elemente, das LETZTE Element einer LEEREN StringList hat den Index := Count -1 also Index := -1 und 0 > -1, das Maximum für Index in einer leeren Stringliste ist also -1. Damit unterschreitet Index -1 aber den minimalen Index von 0. Kurz gesagt man kann KEIN Element einer leeren Liste abfragen das die liste leer ist, es wird IMMER eine Exception erzeugt.

        Gruß Hage

        Comment


        • #5
          Hi Hagen,<p>
          schon lange nichts mehr voneinander gehört...<br>
          Danke, ich glaub, ich habs verstanden. Die EAccessViolation, die ich bekomme, wenn das Programm ohne Debugger läuft,<br>
          kommt eigentlich gar nicht von der Stringliste. Der Debugger hat mich aufgrund meiner - in dieser Situation fehlerhaften - Abfrage<br>
          sl[0] in die Irre geführt. Werd mich jetzt gleich auf die Suche nach dem eigentlichen Bug machen. Nochmals Danke.<p>
          cu, Reimun

          Comment

          Working...
          X