Delphi 2005 win32
DGLOpenGL
TThread
-------------------------------------------------------------------------------------

I am trying to use opengl from an thread. Unfortunately all i get is a black screen. All code seems to execute. Thanks for your help in advance.

Code:
unit OpenGLTemplateForm;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, DglOpenGL;

type
  TDGLForm = class(TForm)
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

   TOpenGLRender = class(TThread)
   public
      destructor Destroy; override;
      procedure Init(aHandle: cardinal);
      procedure Draw;
      procedure Stop;
      procedure Execute; override;
   end;

var
  DGLForm: TDGLForm;
  OpenGLRender: TOpenGLRender;
  DC:HDC;
  RC:HGLRC;
  angle: integer;


implementation

{$R *.DFM}

function getNormal(p1,p2,p3:TGLArrayf3):TGLArrayf3;
var a,b:TGLArrayf3;
begin
 a[0]:=p2[0]-p1[0]; a[1]:=p2[1]-p1[1]; a[2]:=p2[2]-p1[2];
 b[0]:=p3[0]-p1[0]; b[1]:=p3[1]-p1[1]; b[2]:=p3[2]-p1[2];
 result[0]:=a[1]*b[2]-a[2]*b[1];
 result[1]:=a[2]*b[0]-a[0]*b[2];
 result[2]:=a[0]*b[1]-a[1]*b[0];
end;

//TOpenGLRender

destructor TOpenGLRender.Destroy;
begin
  inherited;
end;

procedure TOpenGLRender.Execute;
begin
  while not terminated do
  begin
    Draw;
    sleep(1);
  end;
end;

procedure TOpenGLRender.Init(aHandle: cardinal);
const
  light0_position:TGLArrayf4=( -8.0, 8.0, -16.0, 0.0);
  ambient:  TGLArrayf4=( 0.3, 0.3, 0.3, 0.3);
begin

  InitOpenGL; // Initialize DglOpenGL

  DC := GetDC(aHandle);
  // Create RenderContext (32 Bit Pixel, 24 Bit DepthBuffer, Doublebuffering)
  RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  // Activate RenderContext
  ActivateRenderingContext(DC, RC);

  // set viewing projection
  glMatrixMode(GL_PROJECTION);
  glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0);

  // position viewer
  glMatrixMode(GL_MODELVIEW);

  // Active DepthBuffer
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LESS);

  // Set lighting
  glEnable(GL_LIGHTING);
  glLightfv(GL_LIGHT0, GL_POSITION, @light0_position);
  glLightfv(GL_LIGHT0, GL_AMBIENT, @ambient);
  glEnable(GL_LIGHT0);

  // Set clear background color
  glClearColor(0,0,0,0);
end;

procedure TOpenGLRender.Draw;
const
  D=1.5;
  H1=D/1.732;
  H2=D*1.732-H1; // D/H = tg(30) = 1/sqrt(3)
  HY=3.0;
  //vertexes
  a1:TGLArrayf3=(-D, 0, -H1);
  a2:TGLArrayf3=(D, 0, -H1);
  a3:TGLArrayf3=(0, 0, H2);
  a4:TGLArrayf3=(0, HY, 0);
var
  n1, n2, n3, n4: TGLArrayf3;   //normals
begin
  angle:=angle+1;
  n1 := getNormal(a1,a3,a2);
  n2 := getNormal(a1,a2,a4);
  n3 := getNormal(a2,a3,a4);
  n4 := getNormal(a3,a1,a4);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_NORMALIZE);
  glShadeModel(GL_FLAT);
  glCullFace(GL_BACK);
  glLoadIdentity;
  glTranslatef(0.0, 0.0, -12.0);
  glRotatef(angle, 0.0, 1.0, 0.0);
  glBegin(GL_TRIANGLES);
    glNormal3fv(@n1);
    glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a3);
    glNormal3fv(@n2);
    glVertex3fv(@a1); glVertex3fv(@a2); glVertex3fv(@a4);
    glNormal3fv(@n3);
    glVertex3fv(@a2); glVertex3fv(@a3); glVertex3fv(@a4);
    glNormal3fv(@n4);
    glVertex3fv(@a3); glVertex3fv(@a1); glVertex3fv(@a4);
  glEnd;
  SwapBuffers(DC);
end;

procedure TOpenGLRender.Stop;
begin
end;

//TDGLForm

procedure TDGLForm.FormCreate(Sender: TObject);
begin
  DecimalSeparator:='.'; //always use . as decimal seperator
  OpenGLRender := TOpenGLRender.Create(true);
  OpenGLRender.Init(Handle);
  OpenGLRender.Resume;
end;

procedure TDGLForm.FormDestroy(Sender: TObject);
begin
  OpenGLRender.Suspend;
  OpenGLRender.Free;
  DeactivateRenderingContext; // Deactivate RenderContext
  wglDeleteContext(RC); //Delete RenderContext
  ReleaseDC(Handle, DC);
end;

procedure TDGLForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    #27 : Close;
  end;
end;

end.