改变控件的对象类型属性,"动作"了什么?(100分)

  • 主题发起人 主题发起人 baoling
  • 开始时间 开始时间
B

baoling

Unregistered / Unconfirmed
GUEST, unregistred user!
我在学习写控件,发现一个问题,请教各位大侠:
不太好说明,只好劳烦大侠看两个例子:
先看整型属性
type
TMYpanel = class(TCustomPanel)
private
FABC: integer;
procedure SetFABC(value: integer);
protected
procedure myrun; //
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ABC: integer read FABC write SetFABC; //自定义的整型属性

end;
.....
.....
procedure TMypanel.SetFABC(value: integer);
begin
Fabc:=value;
myrun;
end;

//如果对Tmypanel对象实例属性赋值
如: mypanel1.ABC:=100 则会调用myrun的过程

***************************************************************************

type
TDClass = class(TPersistent) //自定义的对象类型
private
FDA, FDB: integer;
protected
public
procedure Assign(source: TPersistent); override;
published
property DA: integer read FDA write FDA;
property DB: integer read FDA write FDB;
end;

type
TMYpanel = class(TCustomPanel)
private
FABC: TDClass;
procedure SetFABC(value: TDClass);
protected
procedure myrun; //
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ABC: TDClass read FABC write SetFABC; //自定义的对象类型的属性

end;
.....

procedure TDClass.Assign(source: TPersistent);//①
begin
if source is TDClass then
begin
FDA := TDClass(source).DA;
FDB := TDClass(source).DB;
end;
end;
.....
procedure TMypanel.SetFABC(value: TDClass); //②
begin
if Assigned(value) then
begin
Fabc.Assign(Value);
myrun;
end;
end;


//问题:
如果对Tmypanel对象实例属性赋值:
mypanel1.ABC.DA:=100 不会调用myrun的过程,① ②都没有被调用,
我的myrun应该放在哪里?我的意图是只要属性变了就要'动作'MYrun



 
当然不会调用,只有这样操作时才会调用2:mypanel1.ABC := ***
 
你在改变TDClass的属性,自然不会调用过程1和2,将Myrun放在TDClass里
property DA: integer read FDA write SetDA;
的SetDA中才可以捕获属性DA的改动

如果你一定要调用TMyPanel中的myrun可以在TDClass中写一个方法指针,在TMyPanel中给方法
赋值,在TDClass中捕获属性改动并调用方法指针即可
 
to xianjun :这个我知道,可我的程序要求象 mypanel1.ABC.DA:=100 这样赋值就能引起
"动作",我该如何做?
 
OpuBF, 老师:
"如果你一定要调用TMyPanel中的myrun可以在TDClass中写一个方法指针,在TMyPanel中给方法
赋值,在TDClass中捕获属性改动并调用方法指针即可"
这个方法指针怎样的写法?求求您,给个例子吧,谢谢!!!!
 
老师不敢当,互相帮助,互相学习 :)

将MyRun的函数定义抽象出来作为自定义方法声明,如MyRun声明为
MyRun(Param1: Type1; Param2: Type2) 则这样定义
TMyRunEvent = procedure ((Param1: Type1; Param2: Type2) of Object;
实际声明要看你的方法了

在TDClass中声明方法指针

type
TDClass = class(TPersistent) //自定义的对象类型
private
FDA, FDB: integer;
protected
public
procedure Assign(source: TPersistent); override;
published
property DA: integer read FDA write SetDA;
property DB: integer read FDA write SetDB;
property OnMyRun: TMyRunEvent read FOnMyRun write FOnMyRun;
end;

在SetDA等属性设置事件中就可以调用FOnMyRun方法了
procedure TDClass.SetDA(Value: Integer);
begin
FDA := Value;
if Assigned(FOnMyRun) then
FOnMyRun(Param1, Param2);
end;

在TMyPanelCreate时为方法指针赋值

type
TMYpanel = class(TCustomPanel)
private
FABC: TDClass;
procedure SetFABC(value: TDClass);
protected
procedure myrun(Param1: Type1; Param2: Type2); //
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property ABC: TDClass read FABC write SetFABC; //自定义的对象类型的属性

end;

procedure TMyPanel.Create(AOwner: TComponent);
begin
......
FABC := TDClass.Create;
FABC.OnMyRun := MyRun;
......
end;
 
接受答案了.
 
后退
顶部