Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einzelne Objekte aus Array bewegen - EAccesViolation? (https://www.delphipraxis.net/81834-einzelne-objekte-aus-array-bewegen-eaccesviolation.html)

rawsoul 4. Dez 2006 17:19


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:
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;
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.

Jemand mit besseren Augen da? :P

Liebe Grüße,
Frank.

Hawkeye219 4. Dez 2006 18:29

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

rawsoul 4. Dez 2006 18:32

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
 
number ist global deklariert, und ihr wird - bevor der Timer enabled wird - ein Wert zugewiesen.

Delphi-Quellcode:
for number:=1 to high(enemy1) do
initialisiert sie doch sowieso?!?!

St.Pauli 4. Dez 2006 18:36

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
 
Edit: Entfernt - war falsch!

rawsoul 4. Dez 2006 18:39

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
 
Bei + 1 bricht das Programm schon beim createn der Images ab :(

Hawkeye219 4. Dez 2006 18:41

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
 
Zitat:

Zitat von rawsoul
number ist global deklariert, und ihr wird - bevor der Timer enabled wird - ein Wert zugewiesen.

Diese Information hast du uns bisher vorenthalten.

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

rawsoul 4. Dez 2006 18:53

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 :]

Hawkeye219 4. Dez 2006 19:08

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?
 
Zitat:

Zitat von rawsoul
Gibt es eine Möglichkeit, die Rechendauer des Timers zu minimieren?

Natürlich, nimm die langsamen Befehle raus...

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:
procedure TForm1.enemyTIMERTimer(Sender: TObject);
begin
  enemyTIMER.Enabled := False;
  :
  enemyTIMER.Enabled := True;
end;
Gruß Hawkeye

rawsoul 4. Dez 2006 19:14

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 04:40 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