【发布时间】:2017-01-22 17:32:20
【问题描述】:
我有一个自定义控件:
type
TContosoFrobber = class(TCustomControl)
private
end;
在内部,我的组件创建了一个控件:
type
TContosoFrobber = class(TCustomControl)
private
FMyDateTimePicker: TDateTimePicker;
public
constructor Create(AOwner : TComponent); override;
property DateTimePicker: TDateTimePicker read FMyDateTimePicker;
end;
constructor TContosoFrobber.Create(AOwner: TComponent);
begin
inherted Create(AOwner);
FMyControl := TMyDateTimePicker.Create(AOwner);
end;
其中 TMyDateTimePicker 是 TDateTimePicker
的简单后代TMyDateTimePicker = class(TDateTimePicker)
protected
end;
所以总结一下我做了什么:
- 声明一个私有变量
TDateTimePicker - 将其公开为
TDateTimePicker类型的公共(即非已发布)属性 - 通过多态,控件实际上是
TDateTimePicker的后代
这一切都奏效了——直到我最近重新安装了 Delphi XE6(在 Windows 10 上)。
DFM
这就是为什么我无法理解为什么我在设计时遇到错误:
找不到类 TMyDateTimePicker
为什么它试图找到那个类?实现细节中的那个类;它不是为流媒体发布的。流媒体系统甚至是如何尝试创建它的!?所以我检查了 DFM:
object cfBeachBall: TContosoFrobber
Left = 445
Top = 25
Width = 101
Height = 22
...snip...
object TMyDateTimePicker
Left = 0
Top = 0
Width = 101
Height = 22
Date = 37306.581535243100000000
Time = 37306.581535243100000000
TabOrder = 0
TabStop = False
end
end
为什么TInternalDateTimePicker 会出现在 dfm 中:
- 资产公开,未发布
如何阻止表单流系统在 dfm 中放置未发布的属性?
更糟糕的是错误的 IDE
它不仅有时包含它不应该包含的属性。有时它包含不应两次的属性:
object cfPlasticBag: TContosoFrobber
Left = 445
Top = 25
Width = 101
Height = 22
...snip...
object TMyDateTimePicker
Left = 0
Top = 0
Width = 101
Height = 22
Date = 37306.581535243100000000
Time = 37306.581535243100000000
TabOrder = 0
TabStop = False
end
object TMyDateTimePicker
Left = 0
Top = 0
Width = 101
Height = 22
Date = 37306.581535243100000000
Time = 37306.581535243100000000
TabOrder = 0
TabStop = False
end
end
- 如何阻止 dfm 包含未发布的属性?
- 如何阻止 dfm 包含它两次?
破解解决方法
我知道可怕的 hack:告诉 DFM 它不应该让任何企业知道的控制:
initialization
RegisterClass(TMyDateTimePicker);
finalization
UnRegisterClass(TMyDateTimePicker);
end.
现在 dfm 包含一个它不知道的控件。每当我保存表单时,它都会包含对不应包含的内容的引用。最糟糕的是:我证实这是对TMyDateTimePicker 的错误信念。
为什么Delphi XE6 在重装之前没有这样做?也许我需要安装长期以来不受支持的 Delphi 版本的最新更新?
已知错误?
【问题讨论】:
-
尽量不要设置所有者。创建时将
nil作为其所有者传递。 (当然,在这种情况下你也必须明确地释放它)。
标签: delphi delphi-xe6 dfm