Как зарегистрировать компонент и редактор свойств во время выполнения?
После долгих поисков, похоже, я должен назначить RegisterComponentsProc
а также RegisterPropertyEditorProc
, что я и сделал.
Тем не менее, я подумал, что мог бы вызвать мою функцию регистра времени проектирования, т.е. <myComponentUnit>.Register();
,
Когда я получаю переполнение стека, потому что, ну...
procedure myComponentUnit.Regiter;
begin
RegisterPropertyEditor(TypeInfo(Integer),
TMyComponent, 'myProperty', TMyProperty);
конец;
procedure RegisterPropertyEditor(PropertyType: PTypeInfo;
ComponentClass: TClass; const PropertyName: string;
EditorClass: TPropertyEditorClass);
begin
if Assigned(RegisterPropertyEditorProc) then
RegisterPropertyEditorProc(PropertyType, ComponentClass, PropertyName,
EditorClass);
end;
Итак, я вызываю.Register();
который вызывает RegisterPropertyEditor()
который вызывает RegisterPropertyEditorProc()
который вызывает RegisterPropertyEditor() <=== aaargh!!
Итак, что я должен иметь в теле моего RegisterPropertyEditorProc?
После дальнейших поисков, похоже, я хочу позвонить DesignEditors.RegisterPropertyEditor()
напрямую, но это не в разделе интерфейса...
2 ответа
Нет смысла пытаться зарегистрировать редактор свойств во время выполнения, так как он не может использоваться во время выполнения с самого начала. Он может использоваться только в среде IDE во время разработки.
Delphi не включает источник для модуля DesignEditors; его реализация предоставляется исключительно в пакете DesignIDE. Этот пакет имеет доступ к внутренним компонентам IDE, таким как список зарегистрированных редакторов свойств. Среда IDE присваивает значения функциям обратного вызова RegisterComponentsProc и RegisterPropertyEditorProc. Как вы заметили, RegisterPropertyEditor вызывает RegisterPropertyEditorProc. В среде IDE есть собственная функция для обработки этого события.
Если вы хотите зарегистрировать редактор свойств во время выполнения, то ваша программа играет роль IDE. Вам необходимо предоставить реализации для этих функций обратного вызова, чтобы зарегистрировать классы редактора свойств в вашей собственной среде редактирования свойств. Вы могли бы просто держать все в простом списке. Затем, когда вы хотите узнать, какой тип редактора отображать для определенного типа свойства, просмотрите список, чтобы найти лучшее соответствие.
Вы правы, что вам следует вызвать процедуры регистрации ваших подразделений. Но именно так вы инициируете процесс регистрации, а не как вы его реализуете. Эта часть зависит от вас; Delphi не предоставляет ничего этого для вас.