Как добавить свойство в TTabSheet, чтобы его можно было использовать во время разработки с TPageControl
Я хотел бы добавить "MyProperty" в TTabSheet и работать с ним во время разработки. Однако, если я сделаю его подклассом, я боюсь, что мне понадобится также подкласс TPageControl, так как он внутренне создает / управляет TTabSheets.
Я считаю, что для этого потребуется дублирование кода управления TTabSheet для ссылки на TMyTabSheet вместо TTabSheet, так как для этого потребуется вызвать TMyTabSheet.create. Это похоже на то, о чем я буду сожалеть, когда новая версия Delphi обновляет TPageControl, и я забываю обновить TMyPageControl.
Я также исследую "помощников класса" как другой вариант.
У кого-нибудь есть совет, как лучше всего это сделать?
Спасибо!
1 ответ
Помощники типов - это просто сахар во время компиляции, они не будут влиять на уже скомпилированный код, этот стандартный VCL вместе с TPageControl
а также TForm
, Это тупик.
Однако у вас есть небольшое заблуждение, что здесь TPageControl... internally creates... the TTabSheets
, Действительно, когда вы создаете листы с помощью TPageControl
сам, как щелкнув правой кнопкой мыши по нему и выбрав "Новая вкладка", что си, что происходит. Но когда вы создаете объект живой формы из файла DFM (или ресурса DFM в скомпилированном EXE-файле), это TForm
сам, который создает ВСЕ компоненты, включая как элемент управления страницей, так и его вкладки.
Просто посмотрите мой ответ в разделе Как эффективно разрешить дочернему элементу управления `ParentFont = False` использовать то же имя шрифта, что и у родительского? - это покажет вам, как далеко это о владельце - TForm
, не о TPageControl
или другие родительские компоненты, когда речь идет о выборе определенных классов для реальных вкладок или других элементов.
Таким образом, вы можете использовать только табличные таблицы.
- Создать
TMyTabsheet = class(TTabSheet)
составная часть - Создайте и установите в IDE пакет времени разработки, который представит новую вложенную таблицу вкладок в Delphi Form Editor.
- В вашей форме положить акции
TPageControl
и создать все необходимые вкладки обычным способом - в редакторе форм IDE щелкните правой кнопкой мыши свободное место на форме и в меню выполните команду "Просмотреть как текст Alt-F12" - вы увидите текстовое содержимое файла DFM вашей формы.
- в этих источниках DFM найдите свои вкладки и измените их запас
TTabSheet
класс, чтобы быть вашим производным подклассом - щелкните правой кнопкой мыши текстовый редактор и выберите команду "Просмотреть как форму Alt-F12"
- Если бы все было сделано правильно, Delphi теперь воссоздает форму с вашими листами нового класса. Найдите новые свойства в Инспекторе объектов и измените их.
- Теперь переключитесь на источники.Pas формы и найдите объявления этих вкладок и измените их тип. Это требуется только в том случае, если вам потребуется доступ к новым свойствам из источников Delphi. Если нет, вы можете оставить их декларацию как
TTabSheet
в pas-файле, так как ваш класс является прямым потомком от него. Вы можете оставить эти декларации, как они были - но тогда вам придется добавитьRegisterClass(TMyTabSheet);
позвонить в самыйinitialization
раздел в нижней части вашего модуля, поэтому, когда форма будет построена из DFM, она сможет найти реализацию класса по имени. Если вы измените объявление (хотя бы одно из них), тогда ваша форма автоматически вызовет все необходимоеRegisterClass
перед потоковой передачей из DFM. Выберите любой вариант, который вам нравится. - Необязательно и позже, расширьте свой пакет времени разработки, чтобы найти и взломать контекстное меню редактора форм IDE для
TPageControl
и добавьте туда команду "Новая моя вложенная закладка". Просто чтобы избежать ручного постфактумного редактирования DFM. если бы ты делал это часто
Такое чувство, что я буду сожалеть, когда новая версия Delphi обновляет TPageControl
После того, как вы создали и настроили форму и сохранили ее в DFM - она будет TForm
это создает все компоненты из сохраненных DFM-данных, включая ваши вкладки. Если только очень невероятное событие EMBT не уничтожит всю потоковую передачу VCL (сделанную еще в Delphi 1 в 1995 году) и перепроектирует ее с нуля (уничтожая всю совместимость с существующими источниками Delphi за один раз), не должно быть проблем с прямой совместимостью с указанием вашего класса. в DFM. Это просто стандартный способ разработки VCL - для получения определенных типов компонентов из DFM.