Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi StringList - Listenindex überschreitet das Maximum (https://www.delphipraxis.net/80923-stringlist-listenindex-ueberschreitet-das-maximum.html)

hirnstroem 17. Nov 2006 14:50


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:
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;
Der Fehler muss also in folgender Funktion zu finden sein:

Delphi-Quellcode:
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;
In dieser Funktion wird eine Stringliste nach einer Antwort auf eine Anfrage durchsucht, wird diese Antwort gefunden, wird sie gelöscht.

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

Sidorion 17. Nov 2006 14:57

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.

Muetze1 17. Nov 2006 14:59

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.

hirnstroem 17. Nov 2006 15:00

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