ich habe eine OpenGL-Komponente, die von TWinControl erbt. Funktioniert auch prima. Das einzige Problem: Wenn sich irgendein Parent über dieser Komponente ändert, ändert sich auch das Handle von meiner Komponente und somit schlägt das zeichnen natürlich fehl. Kann ich das irgendwie abfangen?
Achja, wenn es irgendwo eine Anleitung gibt, wo steht was man noch abfangen sollte, um Probleme zu vermeiden, nur her damit .
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Ich kenn mich jetzt nicht so mit Delphi aus, aber das Parent ändert sich doch nicht "einfach so", oder? Vielleicht wäre es sinnvoll an der Stelle, wo es geändert wird, anzusetzen. Zum Beispiel mit einer Methode ChangeParent oder so ähnlich, die sich dan auch gleich um den Renderkontext (oder was hier auch immer das Handle braucht) kümmert. Statt
Code:
Component.Parent := NewParent;
könnte man dann
Code:
Component.ChangeParent(NewParent);
aufrufen.
Gruß mrtrain
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:45, insgesamt 1-mal geändert.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
mrtrain hat geschrieben:
Ich kenn mich jetzt nicht so mit Delphi aus, aber...
Ein solches Thema so anzufangen ist glaube nicht die beste Möglichkeit. Findest du nicht? Zu mal SunBlack keine Wahl hat. Es gibt nur eine Möglichkeit den Parent eines WinControls zu setzen. Warum sollte man auch 2 haben. Die vermutlich eh das Selbe machen müssen.
SunBlack: Ich wüsste zwar nicht warum man so etwas machen sollte. Weil es einfach nur in sehr sehr wenigen Konstellationen Sinn macht. Aber zum Überprüfen wann dein Fenster neu erstellt wurde solltest du die Methode CreateHandle überschreiben. Bzw auch DestroyHandle. Diese beiden Methoden sind Virtual und werden von der Komponente selbst aufgerufen um ein Handle zu erzeugen/freizugeben. Du musst mit inherited dafür sorgen, dass der entsprechende KomponentenCode dennoch ausgeführt wird. Weißt so aber bescheid wann deine Komponente erzeugt bzw neu erzeugt wurde und kannst eine entsprechende Behandlung davon einfließen lassen.
Eventuell erzeugst du auch direkt dort dann den DC/RC. Was aber bei OpenGL generell bescheuert ist, da du auch alle Daten neu laden/erstellen musst. Vielleicht würde es ja auch ausreichen, wenn du einen neuen DC erstellst und den RC dann an diesen Bindest. Natürlich den RC von dem anderen DC entbinden bevor du das Handle zerstören lässt. Bei dem neuen DC dann pixelformat setzen und dann den RC binden. Das könnte eventuell auch funktionieren. Da will ich meine Hand aber nicht für ins Feuer legen. Kann sein, dass es exotische Systeme gibt bei denen das nicht funktioniert.
CreateHandle und DestroyHandle klappen . Ich hatte es früher mit CreateWnd und DestroyWnd probiert, aber letzteres wird irgendwie nie aufgerufen und ersteres nur beim erzeugen.
Nunja, jetzt habe ich dafür ein neues Problem. Mal sehen ob ich die Ursache noch finde. Der Destructor von meienr Komponente wird zweimal aufgerufen, wenn ich zwischendurch den Button zum Parentwechseln geklickt habe. CloseHandle im Destructor etc. schlägt dann natürlich fehl. Nur der leere Delphi-Stack hilft mir da auch nicht weiter -.-
Durch die Zeile "SunFlow := TSunFlow.Create(self);" sagt man der Komponente in der Klammer (also "self"), dass sie, wenn sie zerstört wird, auch SunFlow zerstören soll.
Aus der Delphi-Hilfe:
Zitat:
Für per Programm (also nicht im Formular-Designer) erzeugte Komponenten rufen Sie Create auf und übergeben die übergeordnete Komponente im Parameter AOwner. Der Eigentümer entfernt die Komponente bei seiner Freigabe automatisch aus dem Speicher.
Also entweder du gibts da nil an oder lässt das manuelle Free weg.
Durch die Zeile "SunFlow := TSunFlow.Create(self);" sagt man der Komponente in der Klammer (also "self"), dass sie, wenn sie zerstört wird, auch SunFlow zerstören soll.
Autsch Daran habe ich gar nicht mehr gedacht. Danke
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.