我想知道为什么,但我不能简单地调试我的简单程序.忽略加载的方法,它永远不会被执行.不知道为什么.看:
TGridObj = class (TComponent)
private
FPen1:TPen;
FBrush1:TBrush;
FChange:TNotifyEvent;
protected
procedure Loaded; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnChange:TNotifyEvent read FChange write FChange;
property Pen1:TPen read FPen1 write FPen1;
property Brush1:TBrush read FBrush1 write FBrush1;
end;
Run Code Online (Sandbox Code Playgroud)
...
constructor TGridObj.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPen1:=TPen.Create;
FPen1.OnChange:=FChange;
FBrush1:=TBrush.Create;
FBrush1.OnChange:=FChange;
end;
destructor TGridObj.destroy;
begin
FPen1.Free;
FBrush1.Free;
inherited;
end;
procedure TGridObj.Loaded();
begin
inherited Loaded;
ShowMessage(''); // this is never executed;
FPen1.OnChange:=FChange;
FBrush1.OnChange:=FChange;
end;
Run Code Online (Sandbox Code Playgroud)
..
procedure TForm1.FormCreate(Sender: TObject);
begin
Grid:=TGridObj.Create(nil);
Grid.OnChange:=ev1.OnChange;
Form1.InsertComponent(Grid);
end;
Run Code Online (Sandbox Code Playgroud)
感谢名单
Loaded仅在从表单文件流式传输组件的属性时调用.由于您是在运行时创建它,因此Loaded不会被调用.这是设计的.
无论如何,您的代码需要一些工作才能OnChange在运行时修改事件并将更改过滤到笔和画笔.我这样做:
TGridObj = class (TComponent)
private
FPen1: TPen;
FBrush1: TBrush;
FChange: TNotifyEvent;
procedure DoChange(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property OnChange: TNotifyEvent read FChange write FChange;
property Pen1: TPen read FPen1;
property Brush1: TBrush read FBrush1;
end;
constructor TGridObj.Create(AOwner: TComponent);
begin
inherited;
FPen1 := TPen.Create;
FPen1.OnChange := DoChange;
FBrush1 := TBrush.Create;
FBrush1.OnChange := DoChange;
end;
destructor TGridObj.Destroy;
begin
FBrush1.Free;
FPen1.Free;
inherited;
end;
procedure TGridObj.DoChange(Sender: TObject);
begin
if Assigned(FChange) then
FChange(Sender);
end;
Run Code Online (Sandbox Code Playgroud)
现在没有必要Loaded或类似的东西了.因为你等到OnChange钢笔和刷子的事件在访问之前实际开火FChange.
顺便说一下,在你的代码中添加属性设置器Pen1并Brush1修改底层字段是错误的.这会导致泄漏和各种混乱.此外,请注意,将笔和画笔公开为公共属性允许客户TGridObj更改OnChange事件.那颠覆了TGridObj.OnChange.