Hab mir die neue Version noch nicht angeschaut, aber statt .Destroy sollte man lieber FreeAndNil() verwenden.
Und ein private-Sichtbarkeitsabschnitt wäre für Sachen wie FreeGL von Vorteil.
Ich hab die AV gefunden: In der TransparentList ist an Position 1 (bei mir) ein schon aus dem Speicher genommenes Objekt, welches fälschlicherweise von Assigned als existent erachtet wird. Jetzt nur noch schauen, wo das Objekt gelöscht wird.
Bernhard
ADD: AV entgültig gefunden: Bei mir wurde ein GLLicht erstellt. Dieses wurde zu der genannten Liste hinzugefügt. Leider wurde dieses Licht vorher bei den Lichtern aus dem Speicher genommen und ist somit nicht mehr da. Dann soll es allerdings wieder aus dem Speicher genommen werden und dann knallt der nächste Zugriff (das war bei mir die Abfrage nach dem Klassenname).
ADD2: Was mir noch auffällt: Meine Objekte sind alle DOPPELT in der Liste, sie werden also auch 2x gezeichnet. Was machen die da doppelt drin?
ADD3: Warum die alle doppelt drin sind? - Das liegt an den Konstuktoren: In GLQuader (Beispiel) wird das Material gesetzt. Dann wird über inherited der Konstruktor von GLObject aufgerufen und dort gleich nochmal das Material gesetzt. -> macht 2 Listeneinträge, von denen einer zu viel ist.
ADD4: Ich habe mal eine geänderte Version hochgeladen (für Delphi ohne Umlaute). Alles, was ich geändert habe, habe ich mit "Änderung" versehen. Teilweise stehen auch die Gründe direkt dabei.
Bernhard Iliacos intra muros peccatur et extra!
Geändert von rollstuhlfahrer (27. Mai 2011 um 12:49 Uhr)
Grund: geänderte Datei angehängt
@rollstuhlfahrer: Vielen Dank für die Änderungen, die meisten davon sind sinnvoll und teilweise bügeln sie auch Fehler aus, die sich eingeschlichen haben als ich größere Sachen an der Unit verändert habe (z.B. bei GLSurface die noch deklarierte BitMap etc.).
Jetzt weiß ich auch warum das bei mir mit der virtuellen Methode nicht funktioniert hat, weil ich das abstract vergessen hatte...
Nur bei einer Änderung bin ich der Meinung das sie überflüssig ist, nämlich bei der Prozedur FreeGL, dort hast du folgendes hinzugefügt:
Das ist eine Sicherung gegen mehrfaches aufrufen, woher die Aufrufe auch immer kommen mögen. Ich finde sie sinnvoll, weil dadurch Fehler eliminietr werden, bevor sie auftreten. Alternativ könnte man auch eine Exception werfen, um dem Programierer zu sagen, dass diese Prozedur doch bitte nur 1x aufgerufen werden sollte.
Die Prozedur muss ja in der aktuellen Version gar nicht mehr vom Programmierer aufgerufen werden, das übernimmt ja die Unit selber...aber ich lass es einfach mal drin, schadet ja auf der anderen Seite auch niemandem.
Hi,
Vielleicht kann ich auch meine Frage in einem separaten Thread aufmachen, aber es passt zu diesem Thema. Ich weiss auch, dass der letzte Beitrag ein Weilchen her ist. Ich bin mit der Klasse Easy3DGL beschäftigt. Auf dem Beispielprogramm von dem Sonnensystem aufbauend, erweitere ich Planeten um Planeten. Den Asteriodengürtel habe ich soweit auch eingebaut. Allerdings dabei, ist die Texture vom Jupiter nicht mehr sichtbar. Der Pfad zur Datei ist korrekt (auch wenn er momentan relativ ist, dies ändere ich später). Ich hänge euch mal einen Screenshot rein. Die roten Planeten sind Jupiter und Neptun, die im Speicher sind, aber nicht gezeichnet werden.
procedure TForm1.FormCreate(Sender: TObject); var i : integer; begin
Width := Screen.Width;
Height := Screen.Height;
Top := 0;
Left := 0;
InitForm(self);
Erde := GLKugel.Create(7,0,0,0.5, 'textures/earth.jpg');
Erde.SelfRotate(-70,0,0);
Mond := GLKugel.Create(8.5,0,0,0.2, 'textures/moon.jpg');
Mars := GLKugel.Create(10,0,0,0.4,'textures/mars.jpg');
for i:= 1 to ASTERIODENANZAHL do begin
Asteroidenguertel[i] := GLKugel.Create(15,0,0,0.1,'textures/asteriod.jpg');
Asteroidenguertel[i].Rotate(0,i,0); end;