d32coder
asked on
TPanel.Canvas?
I know how to draw on the canvas of a form but is it possible to do the same with a Panel (or Tabsheet)?
if so, give a short example please.
if so, give a short example please.
listening
I mean: "You can make and INSTALL a new..."
All TControl descendants have Canvas property which is protected by default, although in some cases the descendant classes do promote its visibility to public.
To access a protected property of a class, you can use an old trick:
type
THackPanel = class(TPanel);
with THackPanel(Panel1).Canvas do
...
in this example, Panel1 is a 'normal' TPanel. The typecast allows you to access its protected properties.
HTH
TOndrej
To access a protected property of a class, you can use an old trick:
type
THackPanel = class(TPanel);
with THackPanel(Panel1).Canvas do
...
in this example, Panel1 is a 'normal' TPanel. The typecast allows you to access its protected properties.
HTH
TOndrej
Useful tip, TOndrej! But if you want to paint on panel's canvas, you should also override its Paint procedure, or...?
Useful tip, TOndrej! But if you want to paint on panel's canvas, you should also override its Paint procedure, or...?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I can see your point.
Do you know why protected properties become accessible when you define a new type like:
type
THackPanel = class(TPanel);
If you want those protected properties to stay protected (I mean not accessible), is the only way to redeclare them as protected?
Do you know why protected properties become accessible when you define a new type like:
type
THackPanel = class(TPanel);
If you want those protected properties to stay protected (I mean not accessible), is the only way to redeclare them as protected?
> Do you know why protected properties become accessible
> when you define a new type like:
>
> type
> THackPanel = class(TPanel);
The statement above declares a new descendant class.
By definition, a protected property is visible to the class in which it is declared and to all descendant classes; plus also to any code within the same unit after the declaration.
> If you want those protected properties to stay protected
> (I mean not accessible), is the only way to redeclare
> them as protected?
No need to do anything, see above.
In the example above, we have not changed visibility of any properties.
Our trick was to typecast Panel (an instance of TPanel) to THackPanel which is technically incorrect (Panel1 is _not_ THackPanel) but safe (because THackPanel does not introduce any changes) which allowed us to access the protected Canvas.
> when you define a new type like:
>
> type
> THackPanel = class(TPanel);
The statement above declares a new descendant class.
By definition, a protected property is visible to the class in which it is declared and to all descendant classes; plus also to any code within the same unit after the declaration.
> If you want those protected properties to stay protected
> (I mean not accessible), is the only way to redeclare
> them as protected?
No need to do anything, see above.
In the example above, we have not changed visibility of any properties.
Our trick was to typecast Panel (an instance of TPanel) to THackPanel which is technically incorrect (Panel1 is _not_ THackPanel) but safe (because THackPanel does not introduce any changes) which allowed us to access the protected Canvas.
Thanks for the information. That trick is pretty useful.
unit paintpanel;
interface
uses
ExtCtrls, Classes;
type
TPaintPanel = class(TPanel)
private
FOnPaint: TNotifyEvent;
protected
procedure Paint; override;
public
property Canvas;
published
property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
end;
procedure Register;
implementation
{ Register component }
procedure Register;
begin
RegisterComponents('Sample
end;
{ TPaintPanel }
procedure TPaintPanel.Paint;
begin
inherited Paint;
if Assigned(FOnPaint) then FOnPaint(Self);
end;
end.