Ich habe bereits für ein Projekt einen OpenGL rendering context auf ein TPanel gesetzt. Jetzt will ich eine eigene Komponente schreiben. Hier das Grundgerüst (sollte mit dem Delphi-OpenGL-Header gecopypastet laufen):
destructor TPanelOpenGL.Destroy; begin if DC<>0 then begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(HandleTemp, DC); end; Inherited; end;
procedure TPanelOpenGL.IdleHandler(Sender: TObject; var Done: Boolean); begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; //Todo: Render SwapBuffers(DC); Done:=false; end;
procedure TPanelOpenGL.Loaded; begin inherited; HandleTemp:=Handle; DC:= GetDC(Handle); if not InitOpenGL then raise Exception.Create('Fehler beim Laden von OpenGL');; RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0); ActivateRenderingContext(DC, RC); Application.OnIdle := IdleHandler; glClearColor(0,0,0,0); Resize; end;
procedure TPanelOpenGL.Resize; begin inherited; if DC<>0 then begin glMatrixMode(GL_PROJECTION); glLoadIdentity; glViewport(0, 0, Width, Height); glOrtho(0,Width,0,Height,0,1); end; end;
end.
Soweit funktioniert auch alles (sollte im obigen Fall das Panel schwarz zeichnen). Nun schmiert Delphi selber aber total häufig ab, wenn ich die Komponente zum testen auf ein Form setze und das Programm ausführe. Und das in Delphi 2010 und Delphi XE. Bitte helft mir
Grüße
EDIT: Fehlermeldungen gibt es verschiedene. Ich kann den Fehler leider nicht reproduzieren. Ein Meldung ist z.B.:
Wenn du erreignisse nutzt wie z.b. OnResize dann musst du immer darauf achten, das kein GL code verwendet wird, wenn die Komponente im Design oder Zerstörungsmodus ist. Genaugenommen darfst du keinen Code verwenden der zur Laufzeit benutzt wird, z.b. laden von Resourcen oder son kram.
ComponentState ist das zauberwort hier. Einfach mal googlen.
Cool. Danke für die fixe Antwort. Aber überprüfe ich nicht mit DC<>0, ob ein OpenGL-DC besteht. Das DC erzeuge ich ja in Loaded, was ja erst zur runtime läuft, oder lieg ich da falsch?
Mit dem ComponentState klingt interessant. Ab welchem ComponentState darf denn erst OpenGL-Code folgen?
destructor TPanelOpenGL.Destroy; begin if DC<>0 then begin DeactivateRenderingContext; DestroyRenderingContext(RC); ReleaseDC(HandleTemp, DC); end; Inherited; end;
procedure TPanelOpenGL.IdleHandler(Sender: TObject; var Done: Boolean); begin StartTime:= GetTickCount; glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity; //Todo: Render SwapBuffers(DC); DrawTime:= GetTickCount - StartTime; Inc(TimeCount, DrawTime); Inc(FrameCount); if TimeCount >= 1000 then begin FPS:= FrameCount; TimeCount:= TimeCount - 1000; FrameCount:= 0; end; Done:=false; end;
procedure TPanelOpenGL.Loaded; var r, g, b: Single; begin inherited; HandleTemp:=Handle; DC:= GetDC(Handle); if not InitOpenGL then raise Exception.Create('Fehler beim Laden von OpenGL');; RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0); ActivateRenderingContext(DC, RC); Application.OnIdle := IdleHandler; glClearColor(0,0,0,0); Resize; end;
procedure TPanelOpenGL.Resize; begin inherited; {if DC<>0 then begin glMatrixMode(GL_PROJECTION); glLoadIdentity; glViewport(0, 0, Width, Height); glOrtho(0,Width,0,Height,0,1); end;} end;
end.
Leider ist Delphi immer noch am abstürzen. Jetzt kam wieder eine Fehlermeldung, die auch schon vorher kam:
EDIT: Ach ja. Nach erscheinen des Fehlers, kommt ein Dialog mit der Fehlermeldung (mit "Details" und "Senden"). Die Buttons lassen sich dort nicht mehr der Maus anklicken, sondern nur mit der Tastatur aktivieren.
Wenn ich nach auftreten des Fehlers Delphi neustarte und die Komponente deinstalliere kommt eine "Delphi privileged instruction"
Ok, ich habe jetzt nach und nach versucht die Fehlerquelle einzugrenzen. Also wenn ich das OnIdle event weglasse, läuft alles stabil. Aber wie kriege ich jetzt aus der Komponente heraus das OnIdle Event der Anwendung, ohne das Delphi daurend abstürzt?
Also schon mit
Code:
procedure TPanelOpenGL.IdleHandler(Sender: TObject; var Done: Boolean); begin Done:=false; end;
Mitglieder in diesem Forum: Bing [Bot] und 10 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.