加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi XE2中的类助手和类拦截器

发布时间:2020-12-15 09:40:38 所属栏目:大数据 来源:网络整理
导读:我有一段代码如下所示: 接口部分: TControlOrganizer = class(TComponent) // a kind of List of TControlprivate FList : TList; //Handling list of TControl ..............end;TControlHelperAdd = class // Just for separating value entered by use
我有一段代码如下所示:

接口部分:

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:
已发布的属性属性未显示在Object Inspector中.我想我犯了一个错误,忘掉了这里的一些东西.

问题2:
如上所示,来自类助手的重写方法没有触发(不起作用).

问题3:
来自拦截器类的重写方法如上所示没有触发(不起作用).

有人可以帮我找出问题吗?
感谢您的帮助,抱歉我的英语不好.

解决方法

问题1

A published property in a helper does not show up in the Object Inspector.

那就对了.在助手中声明的属性永远不会出现在对象检查器中.

问题2

Virtual methods have no effect in class helpers.

再次,这是设计的.虽然编译器允许您在帮助程序中定义虚方法,但它没有任何效果.为了触发TCustomEditHelper.OrganizerChanged,TCustomEditHelper需要成为目标对象的主动帮助器.

问题3

The Change method for my intercepted TEdit class does not fire.

那是因为你没有实例化截获的TEdit.如果您实例化正确的类,您定义的拦截器类,该方法将触发.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读