AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Einzelne Objekte aus Array bewegen - EAccesViolation?
Thema durchsuchen
Ansicht
Themen-Optionen

Einzelne Objekte aus Array bewegen - EAccesViolation?

Ein Thema von rawsoul · begonnen am 4. Dez 2006 · letzter Beitrag vom 4. Dez 2006
Antwort Antwort
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#1

Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 18:19
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?

Liebe Grüße,
Frank.
Frank Dumont
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:29
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
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:32
number ist global deklariert, und ihr wird - bevor der Timer enabled wird - ein Wert zugewiesen.

for number:=1 to high(enemy1) do initialisiert sie doch sowieso?!?!
Frank Dumont
  Mit Zitat antworten Zitat
Benutzerbild von St.Pauli
St.Pauli

Registriert seit: 26. Dez 2004
351 Beiträge
 
Delphi 7 Personal
 
#4

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:36
Edit: Entfernt - war falsch!
Gruß St.Pauli
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:39
Bei + 1 bricht das Programm schon beim createn der Images ab
Frank Dumont
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:41
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
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 19:53
@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 :]
Frank Dumont
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 20:08
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
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Einzelne Objekte aus Array bewegen - EAccesViolation?

  Alt 4. Dez 2006, 20:14
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
Frank Dumont
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 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