您可以从delphi组件中删除已发布的属性,并且不会在使用该组件的表单上导致错误?

前端之家收集整理的这篇文章主要介绍了您可以从delphi组件中删除已发布的属性,并且不会在使用该组件的表单上导致错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个由我公司开发的组件,并希望删除一个不再需要的已发布属性,并且与组件的工作方式冲突。

有没有办法删除属性,并且不会导致在运行时或设计时的属性未找到的错误,使用组件的表单加载?
即有没有办法使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 *功能

猜你在找的Delphi相关文章