想写一个TMyPanel,继承自TPanel,增加一个属性OnColorChange便于用户在mypanel颜色改变的时候自定义事件,该怎么定义这个属性呢?VCl的源码没有看明白,哪位大师指点以下,或是推荐本书学习一下,谢谢。

解决方案 »

  1.   

    没测试,也许有错误TMyPanel = class(TPanel)
    private
      FOnColorChange: TNotifyEvent;
      procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
    published
      property OnColorChange: TNotifyEvent read FOnColorChange write FOnColorChange;
    end;
    procedure TMyPanle.CMColorChanged(var Message: TMessage);
    begin
      if Assigned(FOnColorChange) then
        FOnColorChange(Self);
      inherited;
    end;
      

  2.   

    上面的过程实现中TMyPanle写错了,应改为TMyPanel。下面是完整的的测试:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;type
      TMyPanel = class(TPanel)
      private
        FOnColorChange: TNotifyEvent;
        procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;
      published
        property OnColorChange: TNotifyEvent read FOnColorChange write FOnColorChange;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        FPanel: TMyPanel;
        procedure ColorChange(Sender: TObject);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TMyPanel.CMColorChanged(var Message: TMessage);
    begin
      if Assigned(FOnColorChange) then
        FOnColorChange(Self);
      inherited;
    end;procedure TForm1.ColorChange(Sender: TObject);
    begin
      ShowMessage('Ok');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      FPanel := TMyPanel.Create(Self);
      FPanel.Parent := Self;
      FPanel.OnColorChange := ColorChange;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      if FPanel.Color <> clRed then
        FPanel.Color := clRed
      else
        FPanel.Color := clWhite;
    end;end.