一个特简单的控件制作问题!(100分)

  • 主题发起人 主题发起人 小毛毛
  • 开始时间 开始时间

小毛毛

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.
 
把Param和Active的声明换一下位置,不知道有没有用。可以试一下。
 
是不是你在设计期将Active设置为True了?在TFileStream.ReadComponent时,是按属性名字来读的。

你可以这样写:

procedure TTestVcl.SetActive(value:boolean);
begin
if FActive<>value then
begin
FActive:=value;
if (FActive and (Fparam<>0)) then DoWork;
end;
end;
procedure TTestVcl.SetParam(value:integer);
begin
if FParam<>value then
FParam:=value;
if (FActive and (Fparam<>0)) then DoWork;
end;
end.
 
初始化的时候为什么要设置为 0 呢?明明知道 FParam 不能为 0 的:
constructor TTestVcl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FActive:=false;
FParam:=0; // 改为 1 就好了
end;
 
要么把params的值初始化为非0,或者Active初始化为False.
 
基本赞成djdsz的说法,不过我觉得是不是把Dowork过程集中在setActive过程中调用规范一些,
,可以在该过程中用一个捕捉异常的语句,发出一个message来告之params的值仍为0,需重新设置。
 
多人接受答案了。
 
后退
顶部