Delphi XE2中的类助手和类拦截器
我有一段代码如下所示:
接口部分: 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
再次,这是设计的.虽然编译器允许您在帮助程序中定义虚方法,但它没有任何效果.为了触发TCustomEditHelper.OrganizerChanged,TCustomEditHelper需要成为目标对象的主动帮助器. 问题3
那是因为你没有实例化截获的TEdit.如果您实例化正确的类,您定义的拦截器类,该方法将触发. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |