![]() |
StringList - Listenindex überschreitet das Maximum
'loha Folks,
Beiträge zu diesem Thema gibt es viele, weitergeholfen hat mir bisher aber leider keiner. Das Problem ist, dass zur Laufzeit einer Applikation sporadisch Fehlermeldungen generiert werden und zwar meistens dann, wenn mehrere Benutzer gleichzeitig dieselbe Funktion auf verschiedenen Geräten anwenden. Die Fehlermeldung teilt folgendes mit: Erste Gelegenheit für Exception bei $77E7E592. Exception-Klasse EStringListError mit Meldung 'Listenindex überschreitet das Maximum (0)'. Prozess FACTS.exe (1580) In dieser Meldung variiert der Listenindex wiederum. Viel mehr kann ich dazu nicht sagen...deshalb -> Code:
Delphi-Quellcode:
Der Fehler muss also in folgender Funktion zu finden sein:
function TCANCommunication.TryToGetAnswer(Data: String): Boolean;
var Time: Cardinal; begin Time := GetTickCount; while Time + WaitForAnswerInterval > GetTickCount do begin if CANCommunication.CheckIfAnswerAvailable(Data) = True then //<- hierhin schickt mit der Debugger im Fehlerfall begin Result := True; Exit; end else Result := False; end; end;
Delphi-Quellcode:
In dieser Funktion wird eine Stringliste nach einer Antwort auf eine Anfrage durchsucht, wird diese Antwort gefunden, wird sie gelöscht.
function TCANCommunication.CheckIfAnswerAvailable(CANMessage: string): Boolean;
var Request, RequestUserID: String; i: Integer; begin Request := IntToStr(HexStrToInt(CANMessage) + 1); RequestUserID := Copy(CANMessage, 0, 0); i := InputBuffer.Data.IndexOf(Request); if (i > -1) and (i <= InputBuffer.Data.Count) then begin try InputBuffer.User.Delete(i); InputBuffer.Data.Delete(i); InputBuffer.Time.Delete(i); Result := True; except Result := False; end; end else Result := False; // no StringList entry (answer) did match with the request end; Der zu löschende Index wird durch die Funktion IndexOf() bestimmt. Danach wird geprüft ob dieser Index grösser als -1 ist und ob er zudem nicht grösser ist, als die Anzahl aller Einträge. Zusätzlich wird das löschen noch in einem try except Block verpackt. [Edit]Ok, das try except verhindert das auftreten der Fehlermeldung, wenn die Ausführbare Datei direkt, also einfach ausserhalb der Entwicklungsumgebund...grml, einfach dann wenn sie nicht mit F9 gestartet wird. Unschön ist das ganze trozdem[/Edit] Trotz alledem taucht diese Fehlermeldung auf. Weiss jemand Rat? Grüsse hirnstroem |
Re: StringList - Listenindex überschreitet das Maximum
Probier mal die zweite Funktion gegen Reintranz zu sichern.
Dies geht mit einer CriticalSection. Diese muss aber midestens 'Modulglobal' sein, also als Variable im implementation-Abschnitt definieren, im initialization Creieren und im finalization zerstören. jetzt kannst Du als erste Anweisung MyCriticalSection.Enter machen und als letzte MyCriticalSection.leave. Solche Fehler kommen vor, wenn während der Abarbeitung der Funktion die Funktion nochmals aufgerufen wird. |
Re: StringList - Listenindex überschreitet das Maximum
1. IndexOf() liefert entweder -1 oder einen gültigen Index. Daher wäre die Abfrage zum oberen Ende hinfällig.
2. Die Abfrage zum oberen Ende (die hinfällig ist), ist falsch definiert. Es darf nicht <= heissen, weil du dann Count selbst mit als gültig ansiehst, aber dies ist es nicht. Anzahl und höchster Index sind was anderes bei 0-basierender Indizierung. /EDIT: CriticalSection sollte die reentranz sicherstellen. |
Re: StringList - Listenindex überschreitet das Maximum
Dankeschön, das werde ich versuchen...am Montag.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz