Another thought... I've just read the help on TGraphicControl...

Your definition for your TShape (Mine was the standard VCL one) is based on TGraphicControl so to draw the shape, you should override the TGraphicControls PAINT method.

[pascal]
TShape = class(TGraphicControl)
public
procedure paint; override;
end;

...

procedure TShape.paint;
begin
// Setup the BRUSH and PEN properties of self.canvas here

self.canvas.RoundRect(100,100,150,150,170,200);
end;

[/pascal]

If you don't override the paint method, when the control receives the WM_PAINT message it won't draw anything and so it will be invisible. But, this will still suffer from flicker etc.