为 TPanel 增加 OnPaint 事件

有时候,我们需要少量修改或增加已有控件的行为或属性,但又不想新写个控件注册到组件面板上或动态创建来用,可以通过同名控件派生来实现。

以下这个简单的例子,为 TPanel 增加了 OnPaint 事件:

 

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type // 以相同类名派生一个子类 TPanel = class(ExtCtrls.TPanel) private FOnPaint: TNotifyEvent; protected // 重载一个方法 procedure Paint; override; public // 新定义一个事件 property OnPaint: TNotifyEvent read FOnPaint write FOnPaint; end; TForm1 = class(TForm) pnl1: TPanel; procedure FormCreate(Sender: TObject); private { Private declarations } procedure OnPnlPaint(Sender: TObject); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TPanel } procedure TPanel.Paint; begin inherited; if Assigned(FOnPaint) then FOnPaint(Self); end; procedure TForm1.FormCreate(Sender: TObject); begin // 新增加的事件只能在运行期动态关联 pnl1.OnPaint := OnPnlPaint; end; procedure TForm1.OnPnlPaint(Sender: TObject); begin // 这一句是可以执行到的 pnl1.Canvas.TextOut(10, 10, 'Test'); end; end.

你可能感兴趣的:(windows,Class,Forms)