Возможно с TPanel пример не совсем корректный, но в общем случае он правильный, например для TButton.
Канвой обладают все графические компоненты (наследники от TGraphicControl), но не все оконные компоненты. Те компоненты, которые наследуются от TCustomControl, имеют канву, к таким компонентам относится и панель.
Код:
TCustomControl = class(TWinControl)
private
FCanvas: TCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
{ TCustomControl }
constructor TCustomControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TCustomControl.Destroy;
begin
FCanvas.Free;
inherited Destroy;
end;
А вот к примеру кнопки (TButton) канвы не имеют (они наследуются от TButtonControl), и тогда описанный выше способ будет очень кстати.
Зачем кнопке канва, это уже другой вопрос (просто поверьте, бывают случаи когда она необходима).