gpt4 book ai didi

delphi - 如何告诉Delphi不要在DFM中包含未发布的属性?

转载 作者:行者123 更新时间:2023-12-03 14:57:29 26 4
gpt4 key购买 nike

我有一个自定义控件:

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;

其中TMyDateTimePickerTDateTimePicker的简单后代

TMyDateTimePicker = class(TDateTimePicker)
protected
end;

总结一下我所做的事情:

  • 声明 TDateTimePicker 的私有(private)变量
  • 将其公开为 TDateTimePicker 类型的公共(public)(即非发布)属性
  • 通过多态性,该控件实际上是 TDateTimePicker后代

这一切都有效 - 直到我最近重新安装了 Delphi XE6(在 Windows 10 上)。

DFM

这就是为什么我无法理解为什么我在设计时收到错误:

Class TMyDateTimePicker not found

为什么要尝试找到该类?该类的实现细节;它不发布用于流式传输。流媒体系统是如何尝试创建它的!?所以我检查了 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中:

  • 该属性是公共(public),而非发布

如何阻止表单流系统将未发布的属性放入 dfm 中?

更糟糕的是有 bug 的 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 将其包含两次

黑客解决方法

我知道可怕的黑客:告诉 DFM 它不应该知道的控制:

initialization
RegisterClass(TMyDateTimePicker);

finalization
UnRegisterClass(TMyDateTimePicker);

end.

现在 dfm 包含一个它不知道的控件。每当我保存表单时,它都会包含对不应该包含的内容的引用。最糟糕的是:我验证了它对 TMyDateTimePicker 的错误信念。

为什么Delphi XE6在重新安装之前没有这样做?也许我需要安装长期不受支持的 Delphi 版本的最新更新?

已知错误?

enter image description here

最佳答案

问题是您将错误的Owner分配给TDateTimePicker。您正在分配 TContosoFrobber 的所有者,而不是 TContosoFrobber 本身:

constructor TContosoFrobber.Create(AOwner: TComponent);
begin
inherted Create(AOwner);
FMyControl := TMyDateTimePicker.Create(Self); // <-- not AOwner!
end;

或者:正如 Jerry Doge 提到的,您可以使用 nil Owner 代替。您只需手动 Free() TDataTimePicker 即可:

type
TContosoFrobber = class(TCustomControl)
private
FMyDateTimePicker: TDateTimePicker;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
...
end;

constructor TContosoFrobber.Create(AOwner: TComponent);
begin
inherted Create(AOwner);
FMyControl := TMyDateTimePicker.Create(nil);
end;

destructor TContosoFrobber.Destroy;
begin
FMyControl.Free;
inherted Destroy;
end;

关于delphi - 如何告诉Delphi不要在DFM中包含未发布的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498418/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com