In fact... I've just tried it... dglOpenGL on BDS 2006, and making the changes I suggested seems to work.

Here's the unit I ended up with....

[pascal]
unit unitOpenGLTemplateForm;

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)
protected
fTargetHandle : THandle;

fDC : HDC;
fRC : HGLRC;

procedure Execute; override;

procedure init;
procedure deinit;
public
destructor Destroy; override;

procedure Draw;

property targetHandle:THandle read fTargetHandle write fTargetHandle;

end;

var
dglForm: TdglForm;

OpenGLRender: TOpenGLRender;
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
init;

while not terminated do
begin
Draw;
sleep(1);
end;

deinit;
end;

procedure TOpenGLRender.deinit;
begin
DeactivateRenderingContext; // Deactivate RenderContext
wglDeleteContext(fRC); //Delete RenderContext
ReleaseDC(fTargetHandle, fDC);
end;

procedure TOpenGLRender.Init;
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

fDC := GetDC(fTargetHandle);
// Create RenderContext (32 Bit Pixel, 24 Bit DepthBuffer, Doublebuffering)
fRC := CreateRenderingContext(fDC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
// Activate RenderContext
ActivateRenderingContext(fDC, fRC);

// 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(fDC);
end;



procedure TdglForm.FormCreate(Sender: TObject);
begin
DecimalSeparator:='.'; //always use . as decimal seperator
OpenGLRender := TOpenGLRender.Create(true);
OpenGLRender.targetHandle:=self.handle;
OpenGLRender.Resume;
end;

procedure TdglForm.FormDestroy(Sender: TObject);
begin
OpenGLRender.Terminate;
OpenGLRender.WaitFor;
OpenGLRender.Free;
end;

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

end.
[/pascal]