【发布时间】:2012-12-10 17:49:24
【问题描述】:
我有一段代码如下所示:
接口部分:
TControlOrganizer = class(TComponent) // a kind of List of TControl
private
FList : TList; //Handling list of TControl
..............
end;
TControlHelperAdd = class // Just for separating value entered by user and value produced by code
private
FOrganizer : TControlOrganizer;
FOrigValue : String;
FUserValue : String;
end;
TControlHelper = class helper for TControl //Basic helper for TControl
private
class var
FAddProp : TControlHelperAdd;
protected
procedure SetOrganizer(Value : TControlOrganizer);
function getOrganizer:TControlOrganizer;
public
class Constructor doinit;
class Destructor deinit;
procedure OrganizerChanged;virtual;
published
Property Organizer:TControlOrganizer read getOrganizer write setOrganizer; //Problem No.1
end;
//Helper for CustomEdit inherited from TControlHelper
TCustomEditHelper = class helper(TControlHelper) for TCustomEdit
protected
procedure OrganizerChanged;override;
end;
//TEdit : interceptor
TEdit= class(StdCtrls.TEdit)
protected
procedure Change;override; //problem No.3
end;
实现部分:
{TControlHelper}
class Constructor TControlHelper.doinit;
begin
FAddProp :=TControlHelperAdd.Create;
end;
class Destructor TControlHelper.deinit;
begin
FreeAndNil(FAddProp);
end;
procedure TControlHelper.OrganizerChanged;
begin
end;
procedure TControlHelper.SetOrganizer(Value : TControlOrganizer);
begin
if FAddProp.FOrganizer<>value then begin
if assigned(FAddProp.FOrganizer) then begin
FAddProp.FOrganizer.remove(self);
end;
FAddProp.FOrganizer:=value;
if assigned(FAddProp.FOrganizer) then begin
FAddProp.FOrganizer.Add(self);
end;
OrganizerChanged; //Problem No.2
end;
end;
function TControlHelper.getOrganizer:TControlOrganizer;
begin
result:=FAddProp.FOrganizer;
end;
{TCustomEditHelper}
procedure TCustomEditHelper.OrganizerChanged; //problem No.2
begin
if assigned(FAddProp) then begin
if assigned(Organizer) then begin
FAddProp.FOrigValue:=Text;
FAddProp.FUserValue:=Text;
end;
end;
end;
{TEdit = Interceptor}
procedure TEdit.Change; //Problem No.3
begin
inherited Change;
FAddProp.FUserValue:=Text;
end;
我发现了 3 个我自己无法解决的问题。
问题 1: 已发布的属性属性未显示在对象检查器中。我想我犯了一个错误,在这里忘记了一些东西。
问题 2: 如上所示,来自类助手的重写方法没有触发(没有工作)。
问题 3: 如上所示,拦截器类中的重写方法没有触发(不起作用)。
谁能帮我找出问题所在? 感谢您的帮助,并为我糟糕的英语感到抱歉。
【问题讨论】:
-
抱歉不太清楚。问题 1:已发布的属性没有出现在检查员身上。问题2:这是否意味着助手不允许继承,尤其是覆盖方法?问题 3:这是否意味着我更喜欢创建从 TEdit 派生的新类而不是实例化拦截器?
-
您知道吗,FAddProp 对于所有相关实例都是全局唯一的,而不是每个实例唯一的,因为它是一个类字段?在这个用例中似乎没用
-
谢谢。你说的对。 FAddProp 是一个全局单位。我发现一些文档来自 delphi.about.com,以便更好地使用拦截器而不是帮助器。
-
在使用拦截器之前,我会考虑适配器,因为副作用较少
标签: delphi delphi-xe2