2016-04-20 4 views
1

Я хотел бы добавить «MyProperty» в TTabSheet и работать с ним во время разработки. Однако, если я подклассифицирую его, я боюсь, что мне также понадобится подкласс TPageControl, поскольку он внутренне создает/управляет TTabSheets.Как добавить свойство в TTabSheet, чтобы его можно было использовать во время разработки с помощью TPageControl

Я считаю, что для этого потребуется дублирование кода управления TTabSheet для ссылки на TMyTabSheet вместо TTabSheet, так как ему нужно будет вызвать TMyTabSheet.create. Это похоже на то, о чем я буду сожалеть, когда новая версия Delphi обновит TPageControl, и я забыл обновить TMyPageControl.

Я также изучаю «помощников класса» в качестве другого варианта.

У кого-нибудь есть советы о том, как это сделать?

Спасибо!

+0

будет ли это реальная собственность или только один, смоделированный во время разработки? вы можете обойтись без подкласса TTabSheet? –

ответ

2

Тип Помощники - это всего лишь сахара для компиляции, они не будут влиять на уже скомпилированный код, этот запас VCL вместе с TPageControl и TForm. Это тупик.

Однако у вас есть небольшое заблуждение, что TPageControl... internally creates... the TTabSheets. Действительно, когда вы создаете листы с помощью самого TPageControl, например, щелкнув правой кнопкой мыши и выбрав «Новая вкладка», что произойдет. Но когда вы создаете объект живой формы из файла DFM (или ресурса DFM в скомпилированном EXE), который сам составляет TForm, который создает ВСЕ компоненты, включая как элемент управления страницы, так и его таблицы.

Просто посмотрите мой ответ на How to efficiently let a `ParentFont = False` child control to use same font name as parent? - что бы показать вам, насколько это о владельца - TForm, а не о TPageControl или другого родителя компонентов, когда речь идет о выборе конкретных классов для фактических вкладок или других элементов ..

Таким образом, вы можете проводить только таблицы подклассов.

  • Создать TMyTabsheet = class(TTabSheet) компонент
  • Создать и установить в IDE времени разработки пакета, что бы ввести новую вкладку подклассы лист Delphi Form Editor
  • В вашей форме поставить запас TPageControl и создать все необходимые вкладки в обычном порядке
  • в форме формы IDE щелкните правой кнопкой мыши по свободному пространству формы и в меню сделайте команду «Просмотр как текст Alt-F12» - вы увидите текстовое содержимое файла DFM формы.
  • в этих источниках DFM найти вкладку листы и изменить их запас TTabSheet класс быть производный подклассу
  • правой кнопкой мыши текстовый редактор и выберите «View As Form Alt-F12» команды
  • Если все было сделано правильно то Delphi теперь воссоздает форму с вашими листами нового класса. Найдите свои новые объекты в Object Inspector и измените их.
  • Теперь переключитесь на источники .Pas вашей формы и найдите объявления этих листов вкладок и измените их тип тоже. Это требуется только в том случае, если вам нужно будет получить доступ к своим новым свойствам из источников Delphi. Если нет, вы можете оставить свою декларацию как TTabSheet в pas-файле, так как ваш класс является прямым потомком.Вы можете оставить эти объявления такими, какими они были, - но тогда вам нужно будет добавить RegisterClass(TMyTabSheet); звонок в самый раздел initialization внизу вашего устройства, поэтому, когда форма будет построена сама из DFM, он сможет найти реализацию класса по названию. Если вы измените объявление (по крайней мере, одно из них), тогда ваша форма автоматически вызовет все необходимые RegisterClass перед потоковой передачей из DFM. Выберите любой вариант.
  • Необязательно и позже расширьте свой пакет времени разработки, чтобы найти и захватить контекстное меню редактора форм IDE для TPageControl и добавить там команду «Новая моя подкласса». Просто чтобы избежать ручного постфактумного редактирования DFM. если бы вы сделали это часто

Это чувствует, как что-то я буду сожалеть, когда новая версия обновления Delphi TPageControl

После создания и настроил форму и сохранили его в DFM - это было бы be TForm, который создает все компоненты из сохраненных DFM-данных и включает также ваши вкладки. Если бы очень невероятное событие EMBT не убило всю потоковое VCL-потоковое воспроизведение (сделанное еще в Delphi 1 в 1995 году) и перепроектировало его с нуля (одновременно уничтожая всю совместимость с существующими источниками Delphi), не должно быть проблем с прямой совместимостью с указанием вашего класса в DFM. Это стандартный способ разработки VCL - для получения конкретных типов компонентов из DFM.

+0

Работает как рекламируется! Я знал о трюке редактирования DFM, чтобы быстро менять типы, но я не ожидал, что замена TTabSheet для «TMyTabSheet» не будет бороться с «TPageControl». Спасибо @ Ариох-это! – user1627960

+0

Не было сражений, использовались методы по умолчанию. Различные листы в управлении страницей похожи на разные элементы управления в форме. Они различаются деталями, но они разделяют критические общности. См. Замену Лискова. Возможность размещения разных классов кнопок (разных, но все из двойного контроля «стандарт») над панелью не сильно отличается от разных листов в управлении страницей. –

+0

@ user1627960 В моем ответе был зафиксирован один недосмотр, важная деталь реализации, которую я изначально забыл упомянуть –

 Смежные вопросы

  • Нет связанных вопросов^_^