![]() |
Einzelne Objekte aus Array bewegen - EAccesViolation?
N'abend!
Immer noch das gleiche Programm, diesmal aber ein neuer Fehler ;) Ich möchte per Timer die in Arrays createten Images bewegen.
Delphi-Quellcode:
Diese Prozedur sollte eine bestimmte Anzahl von Images createn, und danach diese in meiner Form bewegen. Sobald ich die Prozedur aufrufe, habe ich wieder eine EAccessViolation.
procedure TForm1.enemyTIMERTimer(Sender: TObject);
begin enemys createn if number<> stage*2 then begin repeat begin Setlength(enemy1, high(enemy1)+2); enemy1[number]:=timage.create(self); with enemy1[number] do begin parent:=self; left:=-1*raster; picture.loadfromfile('gfx\enemy.bmp'); transparent:=false; autosize:=true; top:=2*raster+random(64); end; number:=number+1 end until number=stage*2 end; for number:=1 to high(enemy1) do begin enemy1[number].left:=enemy1[number].left+3 end; end; Jemand mit besseren Augen da? :P Liebe Grüße, Frank. |
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Vielleicht hilft es ja für den Anfang, die Variable number vor der REPEAT-Schleife geeignet zu initialisieren. Ihr Wert ist nach der FOR-Schleife undefiniert.
Gruß Hawkeye |
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
number ist global deklariert, und ihr wird - bevor der Timer enabled wird - ein Wert zugewiesen.
Delphi-Quellcode:
initialisiert sie doch sowieso?!?!
for number:=1 to high(enemy1) do
|
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Edit: Entfernt - war falsch!
|
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Bei + 1 bricht das Programm schon beim createn der Images ab :(
|
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Zitat:
Hast du einmal überprüft, ob die Timerprozedur erneut aufgerufen wird, bevor der erste Aufruf beendet wurde? Schließlich verwendest du in ihr Befehle, deren Laufzeit nicht vorhergesagt werden kann (LoadFromFile). Falls dieser Fall eintritt, zerbricht die Konstruktion - nicht zuletzt wegen der globalen Variablen. Gruß Hawkeye |
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
@St.Pauli
Lass das doch ruhig drin, dann weiß der nächste, der mal im Board sucht, dass es !nicht! daran liegt ;) Wunderbar Hawkeye219, genau das war's! Ich bin davon ausgegangen, dass der Timer erst wieder erneut ausgeführt werden kann, falls dieser seine "Aufgaben" erledigt hat. Gibt es eine Möglichkeit, die Rechendauer des Timers zu minimieren? Ich habe es gerade versucht, indem ich den Part, in dem die Images created werden, in eine Funktion stecke und vor dem Timer aufrufe, jedoch meckert die Funktion, self (vom parent) sei unbekannt... // Ok, hab's nun doch geschafft. Danke für die zügige Hilfe :] |
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Zitat:
Vielleicht ist es schneller, die Datei "enemy.bmp" nur ein einziges Mal (z.B. bei Programmstart) in eine Master-Bitmap zu laden und diese in der Timerprozedur auf die neu erzeugten TImage-Controls zu malen. Zudem solltest du den Timer zu Beginn der Timerprozedur deaktivieren und ihn bei Bedarf am Ende wieder aktivieren. Auf diese Weise verhinderst du zumindest einen doppelten Aufruf:
Delphi-Quellcode:
Gruß Hawkeye
procedure TForm1.enemyTIMERTimer(Sender: TObject);
begin enemyTIMER.Enabled := False; : enemyTIMER.Enabled := True; end; |
Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
Das mit dem Timer deaktivieren muss ich mir merken, kann ich sicherlich nochmal gebrauchen...
Habe es nun so gelöst, dass vor dem Aufruf des Timers die Images created werden, und erst danach deren Bewegung simuliert wird. Funktioniert bestens. Einen großen Knutscher an euch ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 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