Пользовательский дочерний компонент, созданный компонентом хоста, не имеет автоматического имени в конструкторе - PullRequest
0 голосов
/ 01 февраля 2019

Я создал компонент, похожий на PageControl, полученный из Tcustomcontrol, в котором размещаются дочерние табулированные таблицы, полученные из TcustomPanel.

Табличные листы создаются управляющим элементом pagecontrol с помощью метода новой страницы или путем создания новой вкладки и установки ее свойства PageControl., почти так же, как стандартный pagecontrol.

Я создал редактор свойств для Pagecontrol с глаголом «Добавить страницу».

Поскольку таблица не находится на палитре компонентов, я создалзапись RegisterClass в коде конструктора.

Все это работает нормально, и я мог создать дочерние таблицы и даже выбрать их в конструкторе и установить свойства.

Проблема в том, что новые страницы имеютимя не отображается и отображается как «Безымянный» в инспекторе объектов и не отображается на древовидной диаграмме структуры формы.

После некоторого поиска я нашел пример Stackoverflow, который показал, что

RegisterNoIcon ([Myclass]) необходимо добавить вместе с registerClass.

Я сделал это, и теперь компонент отображается в дереве форм, но как общий «Компонент [14]», а потомок по-прежнему отображается как «безымянный» в инспекторе объектов.

Очевидно, что в Integrated Pagecontrol / tabsheet есть какой-то дополнительный соус, который правильно регистрирует компонент в конструкторе, но я изо всех сил пытаюсь выяснить, что это такое.

В настоящее время регистрация свойства выглядит как

procedure Register;
begin
  RegisterComponents('My Page Control', [TMyPageControl,TMytitlebar,TMyTabset]);
  RegisterComponentEditor (TMypageControl, TMyCompEditor);
  RegisterComponentEditor (TMyTabSet, TMyTabEditor);
  RegisterClass(TMytabSheet);
  RegisterNoIcon([TMytabSheet]);
end;

и код редактирования:

procedure TMyCompEditor.ExecuteVerb(Index: Integer);
var ts:MyTabsheet;
begin
  inherited;
  case Index of
    0: with Component as TMyPageControl do
    begin
      Ts:=TmyTabsheet.Create(Owner);
      Ts.Pagecontrol:=(Component as TMyPageControl);
    end;
  end;
end;

В качестве теста в редакторе свойств я попытался добавить стандартную кнопку в пользовательский элемент управления с тем же результатом.

Любые идеи?

1 Ответ

0 голосов
/ 01 февраля 2019

Кажется, вы должны установить имя самостоятельно.Добавьте строку

Ts.Name := Designer.UniqueName(Ts.ClassName);

после создания TMyTabSheet.

Примечание 1: Не используйте чей-либо владелец!Вместо этого используйте Designer.Root.

Примечание 2: Не используйте с ! (это даже не нужно, поскольку TComponent уже вводит владельца свойство)

Так что ваш код должен выглядеть лучше так:

  case Index of
    0: begin
      Ts := TmyTabsheet.Create(Designer.Root);
      Ts.Name := Designer.UniqueName(Ts.ClassName);
      Ts.Pagecontrol := (Component as TMyPageControl);
    end;
  end;
...