Der Index der Liste überschreitet das Maximum (0)
-
Hallo zusammen, eine dumme Frage:
Ich habe eine App, in der ich zwei Stringlisten verwalte.
MyClass::MyClass():TForm() { Values = new TStringList; Keywords = new TStringList; Values->Add ("Irgendwas 1") ... Values->Add ("Irgendwas 10") Keywords->Add ("Irgendwas anderes 1") ... Keywords->Add ("Irgendwas anderes 10")Das hat ungefähr 1000x funktioniert, dann kam auf einmal o.g. Fehlernmeldung.
Jetzt setze ich zuerstmal Capacity beider Listen auf einen Wert > 0 und dann geht es.MyClass::MyClass():TForm() { Values = new TStringList; Keywords = new TStringList; Values.Capacity = 20; Keywords.Capacity = 20; Values->Add ("Irgendwas 1") ... Values->Add ("Irgendwas 10") Keywords->Add ("Irgendwas anderes 1") ... Keywords->Add ("Irgendwas anderes 10")Meine Frage: Weiß jemand warum das so ist? Ich denke, .Add() erhöht .Capacity automatisch. Den Fehler sollte es dann doch gar nicht geben.
Was ist mein Denkfehler?
Vielen Dank + Gruß
Thomas
-
Eigentlich sollte das funktionieren. Ich verwende gerne und intensiv TStringList-Obejkte mit bis zu etlichen tausend Objekten und habe einen solchen Fehler noch nicht gehabt. Ich denke der Fehler liegt an einer anderen Stelle. Welche Zeile wird Dir beim Fehler angezeigt? Schon mal mit dem Debugger durchgegangen?
Values.Capacity = 20; Keywords.Capacity = 20;Das ist allerdings komplett falsch und kann nicht funktionieren. Dabei solltest Du bereits einen Compiler-Fehler bekommen (E2294).
-
Dieser Fehelr tritt normalerweise dann auf, wenn man versucht auf eine leere Liste zuzugreifen. Hast du die Liste zwischendurch mal gelöscht?
-
Danke für die Antworten bis hierhin.
Ich benutze den Builder nur gelegentlich. Möglicherweise mache ich deshalb einen Fehler:
Ich greife auf die StringListe in der OnShow-Routine des Haupt-Formulars zu. Ist es möglich, dass bei Aufruf von OnShow des Haupt-Fomulars noch nicht die Konstruktoren aller weiteren (automatisch erstellten) Dialoge durchlaufen sind?
@Joe_M: Ja, ich benutze den Debugger. Die Exception wird beim ersten Aufruf von Keywords.Add() geworfen. Im Konstruktor ist das der erste Zugriff auf "Keywords" nach dem new TStringList. Es sei denn s.o.
Danke Euch nochmals
Gruß
Tahsmo
-
In der OnShow ist der Konstruktor des Forms bereits abgearbeitet.
Ich vermute, Du greifst auf eine nicht initialisierte TStringList, respektive nicht gefüllte TStringList zu. Vielleicht hast Du irgendwo einen Logikfehler drin und greifst auf eine andere StringList zu, als Du wolltest.Ich würde gern mal den Konstruktor des Forms und die OnShow sehen.
[EDIT:] Keywords.Add kann nicht funktionieren! Eine TStringList MUSS mit new erzeugt werden, erog Keywords->Add
-
Sorry, ich hab' mich doch wohl etwas zu knapp ausgedrückt.
Also ich erzeuge die Instanzen natürlich zuerst mit new. Und der erste Zugriff danach ist ein Add(). Und das wiederum sollte ja auf eine leere Liste erlaubt sein.
Der Konstruktor macht nichts anderes, als ich im ersten Beitrag angegeben habe. Nur die Strings heißen anders und es sind jeweils 10. Einfacher geht's nicht. Zerstört (Clear()) und gelöscht werden beide Listen in OnDestroy. Das dürfte eigentlich auch sicher sein.
Ich glaube aber, du hast trotzdem recht. Ich werde jetzt noch mal daran gehen, die Reihenfolge der Konstruktion und Benutzung zu überprüfen. Es wird schon so sein, dass ich da noch was nicht im Überblick habe.
Danke + Gruß +
einen schönen Abend wünscht
Tahsmo