Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么忽略加载的方法?_Delphi - Fatal编程技术网

Delphi 为什么忽略加载的方法?

Delphi 为什么忽略加载的方法?,delphi,Delphi,我想知道为什么,但我不能简单地调试我的简单程序。已加载的方法被忽略,它永远不会执行。不知道为什么。看: TGridObj = class (TComponent) private FPen1:TPen; FBrush1:TBrush; FChange:TNotifyEvent; protected procedure Loaded; override; public constructor Create(AOwner: TComponent); override

我想知道为什么,但我不能简单地调试我的简单程序。已加载的方法被忽略,它永远不会执行。不知道为什么。看:

    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;
。 .


只有从表单资源(dfm文件)加载组件时,才会执行Thanx

onload

如果组件仅在运行时以代码创建,则不会执行

更新:


我建议设计组件,以便它们也可以在运行时创建和配置-这意味着我避免重写onload。优点是不需要包安装/组件注册

加载的
仅在组件的属性从表单文件流式传输时调用。因为您是在运行时创建它的,
load
不会被调用。这是故意的

您的代码无论如何都需要做一些工作,以允许在运行时修改
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;
现在不需要加载
或类似的东西。因为在访问
FChange
之前,您需要等待笔和画笔的
OnChange
事件实际触发

顺便说一句,在代码中为修改底层字段的
Pen1
Brush1
添加属性设置器是错误的。这会导致泄漏和各种各样的混乱。另外,请注意,将笔和画笔公开为公共属性会允许
TGridObj
的客户端更改
OnChange
事件。这颠覆了
TGridObj.OnChange

procedure TForm1.FormCreate(Sender: TObject);
begin
Grid:=TGridObj.Create(nil);
Grid.OnChange:=ev1.OnChange;
Form1.InsertComponent(Grid);
end;
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;