![]() |
Problem mit Globalen und OOP
Hallo
ich hab wohl ein ganz grundlegendes Problem: eine Variable EDir eine Zufallszahl von 0 bis 5 sein.
Delphi-Quellcode:
So nun is Edir in der Klasse TEnemy unter Public als Integer definiert:
randomize;
Edir := random(5);
Delphi-Quellcode:
Wenn ich es so mache kriege ich eine Fehlermeldung und das Programm hängt sich auf.
TEnemy = Class(TImageSpriteEx)
private public EDir : Integer; Wenn ich Edir jedoch unter den Globalen Variablen dekliniere funktioniert alles einwandfrei. Für mich ergibt das keinen Sinn. Ist das ein Überlegungs oder ein Programmierfehler? Vllt kann mir ja jemand helfen. Danke schonmal |
Re: Warum funktioniert das nicht?
Zeig doch mal die komplette Methode, wo Du EDir zuweist.
|
Re: Warum funktioniert das nicht?
Zitat:
1. Dein Threadtitel ist wenig bis gar nicht aussagekräftig und sagt nichts über das Problem aus. 2. "kriege ich eine Fehlermeldung" ist keine hinreichend genau Fehlermeldung. |
Re: Warum funktioniert das nicht?
Delphi-Quellcode:
wird per Timer aufgerufen :
Procedure TEnemy.randDir;
begin randomize; Edir := random(5); Form1.Timer2.Interval := random(2000)+1000; end;
Delphi-Quellcode:
Fehlermeldung:
procedure TForm1.Timer2Timer(Sender: TObject);
begin Enemy.Randdir; end; Im Projekt TRPG1.exe ist eine Exeption der Klasse $C00000005 mit der Meldung 'access violation at 0x00486716 :write of adress 0x00000c0 aufgetreten. Wenn ich dann auf Anhalten klicke kommt : Ausführungspunkt nicht verfügbar. |
Re: Warum funktioniert das nicht?
setze mal einen Breakpoint an die Stelle
Delphi-Quellcode:
und gehe im Einzelschritt durch. Wo knallt es und mit welcher genauen Fehlermeldung?
Enemy.Randdir;
|
Re: Warum funktioniert das nicht?
1. Randomize sollte einmalig aufgerufen werden.
2. Wieso greifst Du in einer Klassenmethode auf eine Instanz einer anderen Klasse (hier Form1) zu? Das gehört dort IMO nicht hin. |
Re: Warum funktioniert das nicht?
Delphi-Quellcode:
Und nicht vergessen, Enemy erst mal über Create zu erzeugen.
var
Enemy : TEnemy; randomize; Enemy.Edir := random(6); //wenns von 0..5 sein soll ...oups, zu spät ;) |
Re: Warum funktioniert das nicht?
Also Enemy:TEnemy hab ich unter Tform1 Public dekliniert.
Tenemy.create ist ca 3 sek vor dem ersten Aufruf der Methode schon ausgefürht worden. Gut das mit dem Timerintervall ändern kommmt da nicht hin. Ändert aber nichts am Problem. Und ist von 0 bis 4 sry. |
Re: Warum funktioniert das nicht?
Hallo,
wohl aber nicht als
Delphi-Quellcode:
oder ?
Enemy:= TEnemy.Create;
Heiko |
Re: Warum funktioniert das nicht?
nein
so:
Delphi-Quellcode:
Ä ich denke das ist nicht Falsch, aber wo kann ich Enemy := TEnemy.Create einbaunen das braucht ja nen Tsprite.
constructor TEnemy.Create(AParent: TSprite);
begin inherited Create(AParent); EDir := 2; animspeed := 15; Alpha := 255; randomdir := 0; randtime := 0; Color := RGB(255,255,255); z := 0; end; |
Re: Warum funktioniert das nicht?
Aua. Du hast den Constructor gepostet.
Aber der muss ja aufgerufen werden: enemy:=Tenemy.create(AOwner); es genuegt nicht, wenn die Klasse einen Construktor hat. Die Instanz muss mit dem Konstruktor initialisiewrt werden. Mach Dich mal ueber grundlegendes OOP schlau. [Edit:] Wo einbauen? Am besten, bevor Du das erste mal darauf zugreifst ... |
Re: Warum funktioniert das nicht?
Ja kann sein das ich zu wenig Ahnung von OOP hab^^.
Ich werd mich mal drüber informiern. Danke. |
Re: Warum funktioniert das nicht?
Ok gut warum das Enemy := Tenemy.create aufgerufen werden muss( und wo) hab ich jetzt geblickt.
Aber AOwner ist ein undefinierter bezeichner. Ist AOwener nur eine Bezeichnung für irgendwas anders oder hab ich wieder falsch programmiert? |
Re: Warum funktioniert das nicht?
Wo steht denn AOwner? Du hast den Konstruktor doch selbst definiert, also musst Du hier auch einen TSprite übergeben.
|
Re: Warum funktioniert das nicht?
AOwner steht für die Klasse / Instanz, der das Objekt "gehören" soll.
So wie's ausschaut arbeitest du mit Andorra2D. Dazu sollte es doch hier im Forum einen riesen Thread geben und bei dem Paket sind auch Demos bei. Weiß es grad nicht aus dem Kopf, aber "AOwner" von TImageSpriteEx war ... :gruebel: ... kA ... :mrgreen: :wall: |
Re: Warum funktioniert das nicht?
Ich habs mit AdSpriteEngine probiert. Hat geklappt.
Danke! |
Re: Warum funktioniert das nicht?
@fishbrain: bitte ändere den Titel des Threads - Luckie hat schon ganz am Anfang darauf hingewiesen - so dass dieser aussagekräftig ist. Danke!
...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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