我想获取Panel的Caption变化情况,就像Edit的chang事件发生一样
我想做一个功能,就是当panel的Caption变化的时候,能够获取Caption的内容,我的想法是模仿Edit的OnChange事件,当Edit的内容变化的时候,就发生这个事件,就是另外做一个Panel控件,增加一个OnChange事件,跟踪Edit的OnChange源码有些地方不明白,不知道什么地发生了Text变化内容的判断,也看不到对消息的处理方法,请大家指点一二,或者有什么别的方法判断Panel的Caption变化了
- Delphi(Pascal) code
第一步:TCustomEdit = class(TWinControl)protectedprocedure Change; dynamic;procedure TCustomEdit.Change;begin inherited Changed; if Assigned(FOnChange) then FOnChange(Self);end;第二步:procedure TControl.Changed;begin Perform(CM_CHANGED, 0, Longint(Self)); //这里的self是edit1 还是 TControl?end;第三步:function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;var Message: TMessage;begin Message.Msg := Msg; Message.WParam := WParam; Message.LParam := LParam; Message.Result := 0; if Self <> nil then WindowProc(Message);//为什么要在这里进行判断? Result := Message.Result;end;第四步:不知道怎么跟踪了,看了一下WindowProc是一个处理过程类属性找到的一个CMchanged处理的方法在TWinControlprocedure TWinControl.CMChanged(var Message: TMessage);begin if FParent <> nil then FParent.WindowProc(Message);end;应该不属于第四步吧,因为TWinControl是从TControl继承过来的
[解决办法]
提供一个setCaption的方法,外部只能通过它去修改caption
然后在setCaption里触发OnChange事件
[解决办法]
提供一个setCaption的方法,外部只能通过它去修改caption
然后在setCaption里触发OnChange事件
支持二楼的做法,这样比较简单易用。
[解决办法]
一个类的实例可以有很多个,但它们都是同一级的
一个类的基类可以有好几个,它们都不是同一级的
self是实例的指针,都是同一级的,但是不同个,也就是属性的具体值会不同
基类的属性,子类好像无法再定义一个同名的属性——准确度80%
方法倒是可以重载或覆盖——准确度80%
一般是 Tfatherclass(self).samefun(...)——准确度50%
常用的是一个保留字:inherited 来指代——准确度60%
[解决办法]
如果只是处理个别TPanel对象,可以直接在from中写代码:
- Delphi(Pascal) code
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;type TPanel = class(ExtCtrls.TPanel) private FOnChange: TNotifyEvent; procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; public property OnChange:TNotifyEvent read FOnChange write FOnChange; end; TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } procedure PanelTextChange(Sender: TObject); public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{ TPanel }procedure TPanel.CMTextChanged(var Message: TMessage);begin if Assigned(FOnChange) then // 这里激发事件,也可直接在这里写处理代码 FOnChange(Self); inherited;end;{ TForm1 }procedure TForm1.PanelTextChange(Sender: TObject);begin ShowMessage(Panel1.Caption);end;procedure TForm1.FormCreate(Sender: TObject);begin Panel1.OnChange := PanelTextChange;end;procedure TForm1.Button1Click(Sender: TObject);begin Panel1.Caption := '1234567890';end;end.