Ungültige Zeigeroperation
Hallo, ich habe ein Spiel geschrieben. Bestandteil davon ist es, dass Sterne durch den Bildschirm "fliegen", von rechts nach links.
Dafür verwende ich einen Timer mit dem Namen "Move" Hier der Quellcode des Timers:
Delphi-Quellcode:
Die Sterne werden auf einem TImage dargestellt, Name: Raum
procedure TForm1.MoveTimer(Sender: TObject);
var i,Y,X,S,X1,X2,Y1,Y2:integer; begin //Neue Positionen der Sterne bestimmen for i:=0 to Length(Sterne) do begin Sterne[i].x:=Sterne[i].x-Speed[i]; if Sterne[i].x<0 then begin //Neuen Stern generieren, wenn der alte aus dem Bildschirm ist Y:=Random(Succ((Screen.height-20)-20))+20; X:=Screen.width+20; S:=Random(Succ(5-2))+2; Sterne[i].x:=X; Sterne[i].y:=Y; Speed[i]:=S; end; end; //Sterne neu zeichnen with Raum.Canvas do begin Brush.color:=clblack; FillRect(Rect(0,0,Screen.width,Screen.height)); Brush.color:=$00A4FFFF; for i:=0 to Length(Sterne) do begin //Nur um die Übersicht nicht zu verlieren: X1:=Sterne[i].x; Y1:=Sterne[i].y; X2:=Sterne[i].x+Speed[i]; Y2:=Sterne[i].y+Speed[i]; //Stern zeichnen Ellipse(X1,Y1,X2,Y2); end; end; end; Um die Sternpositionen und ihre Geschwindigkeit zu speichern, werden sie in FormCreate zufällig generiert und in zwei Arrays gespeichert: Sterne: Array of TPoint; Speed: Array of Integer; Je nach Geschwindigkeit wird auch die Größe erstellt (Schnelle Sterne sind nah und deshalb größer). Bis gerade hat alles geklappt, doch jetzt bekomme ich BEIM SCHLIEßEN des Programms eine Fehlermeldung: Invalid Pointer in Project1.exe in ... Ungültige Zeigeroperation Der Timer läuft jedoch einwandfrei durch. Wenn ich den Timer jedoch aus dem Programm rausnehme, indem ich ihn nicht aktiviere, kommt keine Fehlermeldung. Wo liegt das Problem? Liebe Grüße! |
Re: Ungültige Zeigeroperation
Wird der Timer vor dem Schliessen der Anwendung denn gestoppt oder läuft er dann gerade noch?
|
Re: Ungültige Zeigeroperation
Er läuft noch, ich kann mal ein OnClose Ereognis einbauen...
Edit: Keine Wirkung... Hat vorher auch alles so geklappt. Wenn ich den Timer aus lasse und dann sofort schließe passiert nichts, wenn ich den Timer aktiviere passiert dieser Fehler... Ohne das irgendeine andere Prozedur ausgelöst wurde (Außer FormCreate, dort liegt der Fehler auch nicht). |
Re: Ungültige Zeigeroperation
Zitat:
Delphi-Quellcode:
[edit] Oder noch besser
for i:=0 to Length(Sterne) -1 do
Delphi-Quellcode:
[/edit]
for i:=Low(Sterne) to High(Sterne) do
|
Re: Ungültige Zeigeroperation
Stimmt, daran hats gelegen.
Gibt es denn irgendeinen Grund, warum das vorher nicht passiert ist? |
Re: Ungültige Zeigeroperation
Keine Ahnung, muss wohl Zufall gewesen sein, denn eigentlich sollte es an der Stelle immer zur Exception kommen (es sei denn, die Schleife würde gar nicht für alle Elemente durchlaufen).
|
Re: Ungültige Zeigeroperation
Wenn hinter dem Array zufällig noch genug Speicherplatz für das "zusätzliche" Feld war, dann konnte da auch drauf zugegriffen und damit gearbeitet werden.
Und wenn zusätzlich dieser Speicherbereich entweder nicht verwendet oder nur zufälig zu dieser Zeit keine relevanten Daten enthielt, dann wurde durch den Zugriff außerhalb des Arrays auch nichts zerschossen. Tipp: Schalte zukünftig wärend der Entwicklung mal die Bereichsprüfung ein (siehe Projektoptionen), dann wäre dieser Indexfehler schon eher aufgefallen. |
Re: Ungültige Zeigeroperation
Projektoptionen gehen bei mir nicht... Hab Vista und immer wenn ich dadrauf klicke, kommen zwei Zugriffsverletzungen.
|
Re: Ungültige Zeigeroperation
Dann Starte doch Delphi als Admin uns sell es ein.
|
Re: Ungültige Zeigeroperation
Funktioniert leider auch nicht, hab schon alles probiert...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz