Einzelnen Beitrag anzeigen

hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

StringList - Listenindex überschreitet das Maximum

  Alt 17. Nov 2006, 14:50
'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
inde deus abest
  Mit Zitat antworten Zitat