Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 04, 2025 19:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TWinControl: Änderung des Handles
BeitragVerfasst: Di Aug 10, 2010 15:48 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hallo ihr,

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 ;).

Gruß
SunBlack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 10, 2010 16:51 
Offline
DGL Member

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:
  1. Component.Parent := NewParent;
könnte man dann
Code:
  1. Component.ChangeParent(NewParent);
aufrufen.

Gruß mrtrain


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:45, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 09:45 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 13:41 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Hey danke,

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 -.-
Code:
procedure TDemoForm.FormCreate(Sender: TObject);
begin
  SunFlow := TSunFlow.Create(self);
  SunFlow.Parent := self;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
begin
  SunFlow.Parent := Form2;
end;

procedure TDemoForm.FormDestroy(Sender: TObject);
begin
  SunFlow.Free;
end;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 19:16 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 11, 2010 19:22 
Offline
DGL Member

Registriert: Di Jan 24, 2006 18:46
Beiträge: 97
Schläfer hat geschrieben:
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 :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]