Einzelnen Beitrag anzeigen

TheAn00bis

Registriert seit: 7. Jun 2004
386 Beiträge
 
#8

Re: erstes Element aus dynamischem Array löschen

  Alt 3. Sep 2005, 15:34
Danke!

Kommen zwar immer noch ständig die besagten Fehlermeldungen, aber das wird dann wohl woanders dran liegen.

Ich kann das Programm ja mal kurz erklären:

20Ampeln (können auch nur 2 sein, je nach belieben) sind auf dem Bildschrim, die alle zufalls geschaltet sind und die schalten endlos vor sich hin (also rot, grün, gelb).

Immer wenn eine Ampel grün ist, muss der Benutzer auf einen Knopf im der Main-Form klicken und dann wird die Reaktionszeit in eine Listbox geschrieben.

Was das Programm macht sollte geklärt sein, jetzt das Wie?:

Jede Ampel ist vollkommen selbstständig und sendet nur einen Befehl and die Main-Form, damit sich diese die Zeit merkt. Und dies tut sie, in dem sie das Array "Zeiten" um 1vergrößert und in das letzte Element den aktuellen gettickcount schreibt.

Klickt der Benutzer dann auf den Knopf, so wird immer das erste Element aus dem Arry vom aktuellen gettickcount subtrahiert. Das Ergebnis kommt in die Listbox.

Ich habe das ganze gerade mit nur einer Ampel ausprobiert, manchmal klappt alles einwandfrei, dann lasse ich die Ampel 5mal durchlaufen und klicke immer bei grün auf den Button und die Zeiten werden eingetragen, doch dann irgendwann kommt "Exception EInvalidPointer in module...". Es tritt immer vollkommen zufällig auf. Selbst bei nur einer Ampel. Ich hab keine Ahnung was das sein kann.

Hier mal die wichtigsten Proceduren:

Delphi-Quellcode:
procedure TMain.loesche;
var i,l: Integer;
begin
for i := 0 to high(zeiten) do
  zeiten [i] := zeiten[i +1];

l:=length(zeiten);
setlength(zeiten,l-1);
end;

procedure TMain.Button1Click(Sender: TObject); //Button der die Ampeln erstellt
begin
inc(i);
Ampel:= TAmpel.Create(Main,('Ampel'+inttostr(i)),i);
TAmpel(FindComponent('Ampel'+inttostr(i))).ein;
end;

procedure TMain.istGruen; //wird von den Ampeln aufgerufen, sobald sie grün sind
var s:integer;
begin
s:=length(zeiten);
setlength(zeiten,s+1);
zeiten[s+1]:=gettickcount;
gruen:=true;
end;

procedure TMain.Button2Click(Sender: TObject); {muss vom User geklickt werden, wenn eine Ampel auf grün schaltet}
var zeit:integer;
begin
if gruen then begin
zeit:=(gettickcount-zeiten[1]);
Listbox1.items.Add(inttostr(zeit)+'ms');
loesche;
gruen:=false;
end;
Wäre toll, wenn sich das jemand anschauen könnte.
  Mit Zitat antworten Zitat