У меня есть пользовательский элемент управления:Как сообщить Delphi не включать в DFM не опубликованные свойства?
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).
ДФМ
Именно поэтому я не мог понять, почему я получил ошибку во время разработки:
Класс 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' своим владельцем при его создании. (Разумеется, вам придется явно освободить его и в этом случае). –