I have a custom control:
type
TContosoFrobber = class(TCustomControl)
private
end;
Internally, my component creates a control:
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;
where TMyDateTimePicker is a simple descendant of TDateTimePicker
TMyDateTimePicker = class(TDateTimePicker)
protected
end;
So sum up what i have done:
TDateTimePicker
TDateTimePicker
TDateTimePicker
And that all worked - until i recently when i re-installed Delphi XE6 (on Windows 10).
Which is why i couldn't understand why i got the error at design-time:
Class TMyDateTimePicker not found
Why is it trying to find that class? That class in an implementation detail; it's not published for streaming. How is the streaming system even trying to create it!? So i check the 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
Why is the TInternalDateTimePicker ending up in the dfm:
How do i stop the form streaming system from placing a non-published property in the dfm?
Not only is it sometimes including a property it shouldn't. Sometimes it is including the property it shouldn't twice:
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
I know the horrible hack: tell the DFM about the control it should not have any business knowing about:
initialization
RegisterClass(TMyDateTimePicker);
finalization
UnRegisterClass(TMyDateTimePicker);
end.
Now the dfm contains a control it has no business knowing about. Any time i save a form it will contain references to things it shouldn't. And worst of all: i validated it's mistaken belief in a TMyDateTimePicker.
Why did Delphi XE6 not do this before the reinstall? Perhaps i need to install the last updated of the long-since unsupported version of Delphi?
Known bug?

The problem is that you are assigning the wrong Owner to the TDateTimePicker. You are assigning your TContosoFrobber's Owner instead of the TContosoFrobber itself:
constructor TContosoFrobber.Create(AOwner: TComponent);
begin
inherted Create(AOwner);
FMyControl := TMyDateTimePicker.Create(Self); // <-- not AOwner!
end;
Or: as Jerry Doge mentioned, you can use a nil Owner instead. You just have to Free() the TDataTimePicker manually:
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With