我有一个由我公司开发的组件,并希望删除一个不再需要的已发布属性,并且与组件的工作方式冲突。
有没有办法删除属性,并且不会导致在运行时或设计时的属性未找到的错误,使用组件的表单加载?
即有没有办法使Delphi默认删除组件属性?
解决方法
根据属性,最简单的方法是离开属性,但将其标记为已弃用,只需将读/写位指向一个从未使用的字段。
或者,您可以覆盖DefineProperties并调用Filer.DefineProperty(‘PropertyName’,ReadProc);其中PropertyName是您删除的属性,ReadProc是一个调用各种TReader Read *函数的函数。这具有的优点是属性不在你的界面了。
property Center: TPoint read FPoint write SetPoint;
以下是您将添加到您的组件中:
TMyComponent = class... private procedure SkipReadPoint(Reader: TReader); protected procedure DefineProperties(Filer: TFiler); override; end; procedure TMyComponent.DefineProperties(Filer: TFiler); begin inherited; Filer.DefineProperty('Center',SkipReadPoint,nil,False); end; procedure TMyComponent.SkipReadPoint(Reader: TReader); begin Reader.ReadListBegin; Reader.ReadInteger; Reader.ReadInteger; Reader.ReadListEnd; end;
跳过类似布尔或整数的简单类型更容易,因为您只需调用ReadBoolean或ReadInteger即可,而不会影响ReadList函数。
在我们的例子中,我们有很多类似的属性(CLX兼容性),所以我们有这样的全局“虚拟”函数:
procedure DummyReadBool(Self: Pointer; Reader: TReader); begin Reader.ReadBoolean; end; const SkipReadBool: TMethod = (Code: @DummyReadBool; Data: nil);
然后DefineProperty调用如下所示:
Filer.DefineProperty('PropName',TReaderProc(SkipReadBool),False);
这样每个类都不必具有重复的Skip *功能。