Hallo zusammen, mein Problem hat nur indirekt was mit OpenGL zu tun, aber ich hoffe ich finde hier trotzdem Rat.
Also, kurz vorweg: Ich habe eine Klasse Polygon und eine Klasse Ebene. In meinem Polygon werden Daten wie, bspw. die Eckpunkte gespeichert und es verfügt über Funktionen zum Zeichnen seiner selbst. Meine Ebene besteht wiederum aus einer Liste von Polygonen, Attributen wie: Farbe und Höhe und einigen Funktionen. Jedes Polygon wird einer Ebene zugeordnet und erhält einen Zeiger auf seine Ebene, dies geschieht mit einem AddPoly Befehl der Ebene. Die Daten der Polygone und Ebenen lese ich aus einer Datei aus.
Code:
type
PEbene =^TEbene;
TPolygon =class
private
Parent : PEbene;
public
constructor Create;overload;
constructor Create(MyParent : PEbene);overload;
procedure Berechnen;
end;
TEbene =class
private
mName :String;
public
procedure AddPoly(MyPoly : TPolygon);
end;
implementation
constructor TPolygon.Create(MyParent : PEbene);
begin
...
Parent := PEbene;
...
end;
procedure Berechnen;
var s :String;
begin
// irgendwas tuen, bspw Namen auslesen
S := Parent^.mName; <- Hier tritt der Fehler auf
end;
procedure TEbene.AddPoly(MyPoly : TPolygon);
begin
MyPoly :=@Self; <- hier wird der Fehler meiner Meinung nach erzeugt
end;
Nun, mein Problem ist nun, dass... wer hätte es anders erwartet es nicht funktioniert^^. Aufgerufen wird das ganze ungefähr so:
Code:
procedure BeispielAufrufEins;
var Tmp : PEbene;
begin
Tmp :=@EineEbene;
NeuesPoly := TPolygon.Create(Tmp);
NeuesPoly.Berechne; <- Funktioniert
EineEbene.AddPoly(NeuesPoly);
end;
procedure BeispielAufrufZwei;
begin
EbeneVonOben[IndexVonObigenPoly].Berechne; <- Funktioniert nicht mehr!
end;
Nun es sieht wie folgt aus, ich rufe die beiden Prozeduren auf, in der ersten (hier wird das Einlesen realisiert) läuft alles noch wie es soll: die einzelnen Polygone greifen auf ihre Parents zurück und alle Funktionen sind glücklich. Springt er jedoch nach dem Einlesen in die nächste Prozedur, quittiert mir Delphi alles mit einem Zugriffsfehler.
Ich habe das ganze mal versucht mit dem Debugger nachzuvollziehen... dabei fiel mir auf, dass meine Ebenen die Werte/Speicherplätze §ADXXXX haben. Der Wert Tmp aus AufrufEins liefert auch einen solchen Zeigerwert zurück. Auch das Polygon hat dann den Parent $AXXXXXX womit die Berechnungen hier auch funktionieren. Wenn ich aber jetzt das Polygon meiner Ebene hinzufügen will, ist mir aufgefallen dass der Wert Self mir eine völlig andere Adresse meiner Ebene liefert was in etwas so ausschaut: $F5DXXXX. Folglich verweist der Parent des Polygons jetzt auf... ja was eigentlich(?) .. und somit schlägt der zweite BeispielAufruf mit einer Zugriffsverletzung fehl.
Nun steh ich vor der Frage, wie bekomme ich es hin, dass mein Parent auf die richtige Ebene zeigt. Eigentlich sollte Self doch das Objektes wiedergeben und @Self dann einen Zeiger darauf, oder irre ich hier? Ich muss beim Übergeben an die Ebene, den Parent des Polygons ändern, da es auch Polygone gibt, welche ohne Parent das Licht der Welt erblicken können.
Nun ich hoffe ich hab halbwegs verständlich mein Problem rübergebracht.. und vielleicht kennt ja jemand die Lösung :/
Hmmm, entweder habe ich dann hier gerade eine Denkblockade... aber, um in meinem Polygon auf die Attribute der Ebene (Parent) zugreifen zu können, muss ich doch auf diese "Zeigen". Da mir Delphi nicht erlaubt bereits in der Dekleration folgendes zu schreiben:
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Exakt. Was Schläfer beschreibt ist eine Forward-Declaration. Damit kannst du Delphi schon im Voraus sagen, dass TEbene später als Klasse deklariert wird. Der Umweg über den Pointer ist nicht schön und sollte bei Objekten/Klassen nur in besonderen Situationen verwandt werden.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.