Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Also zu 1. nur ganz kurz. Ich bastel grad ne klasse. Die besitzt ein Feld vom Typ TColor. TColor find ich recht praktisch, da man da recht einfach Farbwerte ablegen kann (Und außerdem dürften das viele vom Internet her kennen). So, wie kann ich jetzt auf die einzelnen Farbwerte in diesem Feld (kein Array!) der Klasse zugreifen? (EDH und DSLibrary schweigen sich dazu aus.)
zu 2.: Wie gesagt arbeite ich gerade paar Klassen aus. Eigentlich sollen das mal OpenGL-Komponenten werden. Diese Klassen haben eine Paint- procedur (public). In der Hauptunit wird beim Zeichnen eine procedure aus der "KlassenmanagementUnit" aufgerufen, welche dafür sorgt, dass alle gesetzten Komponenten auch gezeichnet werden. Im Grunde genommen ruft diese procedure die Paintmethoden der Klassen auf.
(Anmerkung: Die Management Unit ist nicht(!) die Unit, wo die Klassen definiert wurden. Die Management-Unit ist quasi User-Kram. Die Klassen sind in einer anderen Unit deklariert)
Als ich nun einen Testdurchlauf gestartet habe, kam eine "EAccessViolation" in der Paintmethode (der Klasse).
Die Paintmethode besteht nur aus einem glBegin(GL_QUADS)...glEnd(); Block. Ich vermute, dass die Paintmethode keinen zugriff auf die Zeichenfläche bekommt. Was muss ich machen, dass gezeichnet wird?
Flash
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also zu deinem Ersten Problem. Da poste ich dir einen Schnippsel aus meinen OpenGLKomponenten.
Code:
glColor3ub(Color and $FF, Color and $FF00 shr 8, Color and $FF0000 shr 16);
Das TColor ist in folgendem Format gespeichert. $00FFFFFF Extrahieren kannst du es mit Hilfe von einem simplen AND und die richtige Position bekommst du mittels shr (Shift Right). Da wird um die angegeben Bits gedreht. Somit landet der gewünscht Wert wieder im letzten Byte. Das ganz geht zwar auch rechnerrisch aber das ist auch nicht wesentlich einfacher dafür aber rechenintensiver.
Zu deinem zweiten Problem. Normalerweise ist es OpenGL egal von wo aus gezeichnet wird. Solange ein aktiver Context gesetzt wurde. Aber für mich sieht es so aus als greifst du auch eine andere OpenGL implementation zu. Also, dass aus deiner Klasse auf eine andere OpenGL unit zugreifst oder dieser nicht richtig geladen wurde. Gehe mal in den Debugger und und setze eine Haltepunkt vor die OpenGL Befehle. Und in der Liste mit den überwachten Ausdrücken fügst du mal "@glBegin" hinzu. wenn dort Nil steht dann wurde die Methode nicht richtig geladen. Wenn dort ne Adresse steht ($628C114A oder so) dann solltest du dir mal anschauen auf was du beim Renden zugreifst. Wenn das nämlich nicht richtig initialisiert wurde dann gibt das dort halt auch nen Fehler. Schau dir einfach mal im Debugger all das an auf was du zugreifst.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
zu 1.: Könntest Du mal bisl mehr Code posten? Ich weiß was du tust, ich weis aber noch net wirklich wie du tust... Eventuell hast du ne Funktionierende Funktion ColorToRGB oder sowas??? (Da könnt ich mich dann mal bisl vertiefen)
zu 2.: Ich habs getestet und es ist ... verdammt... NIL!
(Das hat bestimmt was mit SOS's Kathedrale zu tun... da fließt bestimmt auch der NIL vorbei... ) Aber jetzt mal schluss mit dem Blödsinn. 8)
Du hast gesagt die Methode wird nicht richtig aufgerufen... Wie wird eine Methode denn richtig aufgerufen? Die Methode ist als Public deklariert und im Implementationsteil (Der Klassenunit) natürlich auch definiert.
In der Managerunit wird sie über MeineKlasse.Paint aufgerufen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Okay. Dann versuche ich mal ein wenig Licht ins Dunkel zu bringen.
1:
Ich erkläre dir noch mal genau die Befehle.
SHR Shiftet die Bits nach rechts. Alles was rechts rausläuft ist verlohren.
Aus follgendem Bitmuster wird mit shr 4
01100110 shr 4 = 00000110
AND Ist ein logisches AND (Bitweise).
01100110 AND 00001111 = 00000110
Eigentlich ganz logisch so weit, oder?
Du wirst übrigens lachen. Der Source die ich depostet habe ist alles. Da existiert sonst nur noch das Funktionsgerüst. Aber hier noch mal ein wenig was anders aufgebaut.
Code:
procedure ColorToRGB(Color: TColor; var Red, Green, Blue: Byte);
begin
Red := Color and $FF;
Green := Color and $FF00 shr 8;
Blue := Color and $FF0000 shr 16;
end;
Ich hatte ja auch schon gesagt wie ein TColor aufgebaut ist. Mit Hilfe von dem and extrahiere ich mir das passende Byte und mit shr verschiebe ich es so weit, dass es sich in den letzten Byte des Integeres befindet. Alles natürlich Auf Hexadezimalbasis. Weil einfacher zu lesen. Also das $FF00.
2:
Ich gehe mal davon aus, dass du OpenGL richtig initialisiert hast sonst würdest du schon vorher probleme bekommen.
Überprüfe von daher also einmal ob du in ALLEN QUELLEN die du verwendest EIN UND DIE SELBE OpenGL Implementation benutzt. Ein kurzes Beispiel dazu. Zur Initialisierung von OpenGL verwendest du die dglOpenGL.pas zum Zeichnen deiner klassen verwendets du aber die OPengl12.pas von Mike Lischke. Was passiert da? Die dglOpenGL wird initialisiert und lädt sich alle Methoden in die dafür vorgesehen Variablen (Funktionspointer). Wenn du jetzt auf die OpenGL12.pas von Mike zugreifst sind dessen Funktionspointer alle noch nicht zugewiesen und somit bekommst du diesen Fehler. Wenn du aus deinen klassen aber auf die richtige zugreifst passiert überhaupt nichts.
Selbes Problem kann auch bei fremden Loadern (jeglicher Art) auftreten. Von daher mal ein Hinweis an alle die das lesen. Wenn ihr neue OpenGL Units zieht und sie benutzen wollt. Überprüft erst einmal ob der Loader die selbe OpenGL implementation wie ihr verwendet. In der Regel kann man die Units ohne große Probleme austauschen. Einfach oben in den uses die Alte löschen und die Neue einsetzen.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja deine Vermutung war richtig... Ich hatte das VCL-Template1.2 verwendet und in meiner anderen Unit DGLOpenGL.pas . Obs dann funktioniert, kann ich erst dann testen, wenn ich den neuen DGLSDK hab. Hab meinen alten deinstalliert und... (rest siehe FEEDBACK-FORUM.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
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.