一个控件设计的基本问题(100分)

  • 主题发起人 主题发起人 一个过客
  • 开始时间 开始时间

一个过客

Unregistered / Unconfirmed
GUEST, unregistred user!
假如我设计一个控件TCompABC,他有一个Active属性,有一个OnActive事件,
我希望当用户设置Active:=true的时候,激活OnActive事件,代码如下:

procedure TCompABC.SetActive(Value:boolean);
begin
if FActive<>Value then
begin
FActive:=value;
if FActive then
if assigned(FOnActive) then FOnActive(self); //问题所在
end;
end;

这段代码看上去没什么问题,但是,当我设计form的时候,我把一个TCompABC控件
拖曳到form上,然后在属性编辑器里面设置Active为true,然后编写了OnActive的代码。
按F9执行的时候并没有执行到我的OnActive代码,跟踪结果显示当控件创建的时候,
该控件的FOnActive属性并没有assigned,或者至少是当Active属性被赋值的时候,
FOnActive还没有被赋值,所以。。。

那么我怎样才能实现我的功能呢?
 
[8D]1.Create时,FOnActive := nil; FActive := False;
2.property OnActive: TNotifyEvent read FOnActive write FOnActive;
property Active: Boolean read FActive write SetActive default False;
Active的发布应在OnActive之后.
 
在控件设计期写的事件程序运行期无效,本人也碰到此问题,我感觉delphi编译后重新赋了地址

 
没用,你自己试一试就知道了
 
property Active ..
放在published部分的最后
 
是否试验过? 排列先后顺序是没用的。
 
试过了,正如我说的。
但改过再编译之后要关掉d,再打开d,才有效.
unit test1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TTest1 = class(TComponent)
private
{ Private declarations }
FActive: Boolean;
FOnActive: TNotifyEvent;
procedure SetActive(Value: Boolean);
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property OnActive: TNotifyEvent read FOnActive write FOnActive;
property Active: Boolean read FActive write SetActive default False;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('test', [TTest1]);
end;

constructor TTest1.Create(AOwner: TComponent);
begin
inherited;
FOnActive := nil;
FActive := False;
end;

procedure TTest1.SetActive(Value: Boolean);
begin
if FActive <> Value then begin
FActive := Value;
if FActive then
if Assigned(FOnActive) then
FOnActive(Self);
end;
end;

end.
 
>>要关掉d,再打开d

d --> delphi ???
 
明白了。原来关键是要把控件包重新编译一遍。
 
接受答案了.
 
后退
顶部