小
小毛毛
Unregistered / Unconfirmed
GUEST, unregistred user!
如下一个简单的控件,设置Active为True之后,自动执行DoWork过程.
DoWork过程里面用100除以一个属性Param,如果Param为0会引发异常。
如果使用默认值都没有问题,如果在Design状态设置好Param=2,并且
Active=True,也不会有问题,但是运行的时候,会引发异常,跟踪了
一下,是因为Active属性的write方法SetActive发生的时候,还没有轮到
Param属性的write方法执行,于是Param还等于默认值0,所以产生异常,
那么我该怎样写这个控件代码,可以在设计的时候就能指定Active=true
呢? 是不是和ComponentState有关?
多谢了!
unit TestVcl;
interface
uses
Windows, SysUtils, Classes, Dialogs;
type
TTestVcl = class(TComponent)
private
FActive:boolean;
FParam:integer;
procedure SetActive(value:boolean);
procedure SetParam(value:integer);
public
constructor Create(AOwner: TComponent); override;
procedure DoWork;
published
property Active:boolean read FActive write SetActive;
property Param: integer read FParam write SetParam;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Freeware', [TTestVcl]);
end;
constructor TTestVcl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FActive:=false;
FParam:=0;
end;
procedure TTestVcl.DoWork;
begin
showmessage('Work result is:'+inttostr(100 div param));
end;
procedure TTestVcl.SetActive(value:boolean);
begin
if FActive<>value then
begin
FActive:=value;
if FActive then DoWork;
end;
end;
procedure TTestVcl.SetParam(value:integer);
begin
if FParam<>value then
FParam:=value;
end;
end.
DoWork过程里面用100除以一个属性Param,如果Param为0会引发异常。
如果使用默认值都没有问题,如果在Design状态设置好Param=2,并且
Active=True,也不会有问题,但是运行的时候,会引发异常,跟踪了
一下,是因为Active属性的write方法SetActive发生的时候,还没有轮到
Param属性的write方法执行,于是Param还等于默认值0,所以产生异常,
那么我该怎样写这个控件代码,可以在设计的时候就能指定Active=true
呢? 是不是和ComponentState有关?
多谢了!
unit TestVcl;
interface
uses
Windows, SysUtils, Classes, Dialogs;
type
TTestVcl = class(TComponent)
private
FActive:boolean;
FParam:integer;
procedure SetActive(value:boolean);
procedure SetParam(value:integer);
public
constructor Create(AOwner: TComponent); override;
procedure DoWork;
published
property Active:boolean read FActive write SetActive;
property Param: integer read FParam write SetParam;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Freeware', [TTestVcl]);
end;
constructor TTestVcl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FActive:=false;
FParam:=0;
end;
procedure TTestVcl.DoWork;
begin
showmessage('Work result is:'+inttostr(100 div param));
end;
procedure TTestVcl.SetActive(value:boolean);
begin
if FActive<>value then
begin
FActive:=value;
if FActive then DoWork;
end;
end;
procedure TTestVcl.SetParam(value:integer);
begin
if FParam<>value then
FParam:=value;
end;
end.