Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Opengl - Ratlos - (https://www.delphipraxis.net/101388-opengl-ratlos.html)

Mr.borland 12. Okt 2007 10:17


Opengl - Ratlos -
 
hallo,

vieleicht könnt ihr mir helfen. ich programiere in Delphi 2006 und habe folgendes rätzelhaftes problem.

also, ich habe eine formular (FormOpenGl.pas und dfm) auf dem zwei panels sind. auf dem einen ist meine 3d navigations komponenten und auf dem anderen mein OpenGl zeichen fenster. so weit so gut; nun beim aufruf dieses formulars von meiner Hauptformular passiert was ich mir nicht erklären kann.

1. es funktioniert wenn das formular automatisch erzeugt wurde. dies hat aber dann den nachteil, das zwei fenster offen sind; das Hauptformular und das Openglformular.
hier mein auf ruf:

Delphi-Quellcode:
   // das Formular wird automatisch erzeugt
   FormOpenGl.Show;

2. das formular ist in der Liste der Verfügbaren Formulare; :wall: und es funktioniert nicht
hier mein auf ruf:
Delphi-Quellcode:
  FormOpenGl := TFormOpenGl.Create(self);
  FormOpenGl.Parent := Self;
  FormOpenGl.Align := alClient;
  FormOpenGl.Visible := true;
beim debugen sind alle parameter in beiden fällen identisch. doch im Fall 2 wird nicht gezeichnet abwohl die funktionen wie im fall 1 auch durchlaufen werden.

rcPointer : HGLRC; // Rendering Context
dcPointer : HDC; // Device Context
die wichtigsten zwei variablen ... haben nach der initialisierung auch in beiden fällen die gleichen werte.
was mache ich falsch, habe ich ein irgend eine einstellung übersehen ???

please help me.
thanks.

DP-Maintenance 12. Okt 2007 10:30

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Multimedia" verschoben.
Das ist kein Beitrag für die Code-Library.

sakura 12. Okt 2007 10:40

Re: Opengl - Ratlos -
 
Wer ist "Self" ? Versuche mal Application als Owner zu übergeben.

...:cat:...

Phoenix 12. Okt 2007 10:42

Re: Opengl - Ratlos -
 
...und nicht als Parent des Forms zu setzen...

Sidorion 12. Okt 2007 10:59

Re: Opengl - Ratlos -
 
.. und nicht den Header von Borland benutzen, sondern den hier :stupid:

Mr.borland 12. Okt 2007 11:20

Re: Opengl - Ratlos -
 
"self" ist mein Hautformular; also übergibt das Hauptformular ein zeiger auf sich selber... ?!

...habe es probiert mit "application" mit "nil" als übergabe parameter; es funktioniert nicht

Mr.borland 12. Okt 2007 11:22

Re: Opengl - Ratlos -
 
... auch habe ich es mit dlgOpengl.pas probiert und es funktioniert auch nicht.
zum verzweifeln ist das.

Sidorion 12. Okt 2007 12:29

Re: Opengl - Ratlos -
 
Wann erstellst Du im GLFenster den Rendering Context? Hier ist es nämlich unbedingt wichtig, dass die Komponente, auf der er erstellt wird bereits ein Windowshandle hat. Bei RC auf Formularen spielt das eine untergeordnete Rolle, weil diese ihr Handle im Konstruktor kriegen. Panels hingegen kriegen den erst, wenn sie das erste mal sichtbar werden. Probier mal folgendes: Mach Dir einen Nachfolger vom TCustomPanel und überschreib dort die Methode CreateWnd. In dieser überschriebenen legst Du dann den RC an.
Nachtrag: Im DGLSDK gibt es auch ein Template mit RC auf einem Panel. Schau Dir das doch auch mal an.

Gandalfus 12. Okt 2007 13:06

Re: Opengl - Ratlos -
 
CreateNew

Mr.borland 12. Okt 2007 13:18

Re: Opengl - Ratlos -
 
Zitat:

Wann erstellst Du im GLFenster den Rendering Context? Hier ist es nämlich unbedingt wichtig, dass die Komponente, auf der er erstellt wird bereits ein Windowshandle hat. Bei RC auf Formularen spielt das eine untergeordnete Rolle, weil diese ihr Handle im Konstruktor kriegen. Panels hingegen kriegen den erst, wenn sie das erste mal sichtbar werden. Probier mal folgendes: Mach Dir einen Nachfolger vom TCustomPanel und überschreib dort die Methode CreateWnd. In dieser überschriebenen legst Du dann den RC an.
Nachtrag: Im DGLSDK gibt es auch ein Template mit RC auf einem Panel. Schau Dir das doch auch mal an.

Du hast recht. genau das ist der Fehler. ich habe mein Rendering Context naturlich im OnCreate des GLFensters gesetzt .. mit der hoffnung ich mach ja nichts falsch. Nun, ich habe eine Methode die OnShow des GLFensters aufgerufen wird für die Initialisierung der Opengl Rendering Context.
ist nicht das eleganteste aber es funktioniert. :-D Danke.

Vielleicht ein ergänzung: es macht kein unterschied ob man ein Panel oder das Formular selbst als Rendering Context benutzt.der fehler tritt in deiden fällen auf. das ist mir aufgefallen.


danke Sidorion, danke an alle.

Sidorion 12. Okt 2007 15:05

Re: Opengl - Ratlos -
 
OnShow ist genau der falsche Ort dafür, da diese Methode jedesmal gerufen wird, wenn das Formular sichtbar wird. Du willst aber sicher nur einen RC. Entweder Du merkst Dir in einem Boolen, ob das Fenster schonmal sichtbar war, oder du machst das im CreateWnd;

Mr.borland 12. Okt 2007 15:09

Re: Opengl - Ratlos -
 
... aber wenn ich das fenster schließe mache ich folgendes

Delphi-Quellcode:
// Release OpenGL when window closes
procedure TFormOpenGl.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(0,0);
  wglDeleteContext(rcPointer);
  releasedc(GlPanel.Handle,dcPointer);
end;
das heißt ich muss jedesmal einen Rendering Context definieren. oder nicht??!

OregonGhost 12. Okt 2007 15:16

Re: Opengl - Ratlos -
 
OnShow korrespondiert doch aber mit OnHide, während FormDestroy mit FormCreate korrespondiert. Oder so.

Mr.borland 12. Okt 2007 15:44

Re: Opengl - Ratlos -
 
Zitat:

OnShow korrespondiert doch aber mit OnHide, während FormDestroy mit FormCreate korrespondiert. Oder so.
das stimmt. jedoch ist in meine Anwendung nur eine formuar mit der Hauptformular sichtbar verknüpft.

wenn ich das fenter brauche, mache ich im Hauptformular folgendes:
Delphi-Quellcode:
FormOpenGl := TFormOpenGl.Create(self);
  FormOpenGl.Parent := Self;
  FormOpenGl.Align := alClient;
  FormOpenGl.Visible := true;
das formular wird wenn es nicht mehr benötigt wird zerstört.
Delphi-Quellcode:
      if FormOpenGl <> Nil then begin
    FormOpenGl.Visible := false;
    FormOpenGl.Close();
     FormOpenGl.Free();
    FormOpenGl := Nil;
   end;
somit gibt es keine konflikte, meine ich zumindest??!

Apollonius 12. Okt 2007 16:01

Re: Opengl - Ratlos -
 
Zitat:

Zitat von Sidorion
OnShow ist genau der falsche Ort dafür, da diese Methode jedesmal gerufen wird, wenn das Formular sichtbar wird.

Also musst du nur dein Fenster minimieren und wieder hervorholen und du hast einen zweiten Rendering Context und wahrscheinlich ein Speicherleck.

Mr.borland 12. Okt 2007 16:37

Re: Opengl - Ratlos -
 
Zitat:

Also musst du nur dein Fenster minimieren und wieder hervorholen und du hast einen zweiten Rendering Context und wahrscheinlich ein Speicherleck.
... dafür habe ich BorderStyle:=bsNone; gesetzt

des heißt der user kann zwar das Hautformular schließen und somit das programm beenden aber nicht das OpenGlFormular.

in meine Anwendung ist nur eine formular gleichzeitig mit der Hauptformular sichtbar verknüpft!!!

Lossy eX 12. Okt 2007 16:53

Re: Opengl - Ratlos -
 
Zitat:

Zitat von Apollonius
Zitat:

Zitat von Sidorion
OnShow ist genau der falsche Ort dafür, da diese Methode jedesmal gerufen wird, wenn das Formular sichtbar wird.

Also musst du nur dein Fenster minimieren und wieder hervorholen und du hast einen zweiten Rendering Context und wahrscheinlich ein Speicherleck.

Das stimmt aber nicht. OnShow wird immer dann aufgerufen wenn das Fenster sichtbar wird (Show / ShowModal). Ja das Stimmt. Aber wenn es minimiert wird dann ist es minimiert. Das Fenster ist trotzdem noch sichtbar.

Ich benutze bei mir eigentlich ausschließlich OnShow und OnClose und hatte damit bisher noch nie Probleme. OnHide wird nämlich nicht aufgerufen, wenn das Fenster geschlossen wird. Klar wenn dann noch einmal OnShow aufgerufen wird dann muss man das entweder per Flag abfangen oder man hat einen zusätzlichen Kontext. Aber .Hide steht normal nur im Code weswegen man darüber eigentlich eine ganz gute Kontrolle haben sollte. Und wenn das Fenster geschlossen wird dann wird OnClose aufgerufen.

Apollonius 12. Okt 2007 17:01

Re: Opengl - Ratlos -
 
Da tritt mich doch ein... Sorry, du hast recht. OnShow wird wirklich nicht beim Hervorholen auferufen. Ich hatte das irgendwie anders in Erinnerung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz