#delphi #tabcontrol #tabcontainer
#delphi #tabcontrol #tabcontainer
Вопрос:
Я просматривал код TTabControl
в течение последних трех дней и обнаружил следующее:
- Элемент управления будет принимать дочерние элементы управления, но перенаправлять их в зависимости от состояния, в котором он находится, например: если дочерним элементом является
TTabItem
, он назначит егоFContent: TContent
, который используется в качестве контейнера вкладок, в противном случае, если дочерним элементом является специальный элемент управления (TEffect, TAnimation ...
), он будет добавлен кTTabControl
, иначе, если есть активная вкладка, дочерний элемент будет перенаправлен на нее, иначе он будет перенаправлен наFNoItemsContent: TContent
невидимый элемент управления (понятия не имею, почему !!!). - когда дочерний элемент перенаправляется на активную вкладку, он будет перенаправлен на
FContent: TContent
элемент вкладки (во время разработки позиция будет скорректирована).
значение слова перенаправлено здесь заключается в том, какому родителю будет назначен дочерний элемент.
Таким образом, Child.Parent := TabControl;
запускается вышеупомянутое, и это метод, который это делает.
procedure TTabControl.AddOrInsertObject(const AObject: TFmxObject; const Index: Integer = MaxInt);
что меня смущает, так это то, что следующие элементы управления не сохранены, но они являются родительскими по дизайну и времени выполнения для дочернего элемента.
TTabItem.FContent
.TTabControl.FContent
.TTabControl.FNoItemContent
.
TTabItem
сохраняется, поэтому в IDE, когда вы добавляете вкладку (щелкните правой кнопкой мыши добавить новый элемент TabItem), вы увидите на панели структуры, что TTabItem
элементы являются дочерними элементами элемента tab, удалите другой элемент управления, и вы увидите, что он является дочерним элементом активной вкладки (TTabItem, а не его FContent).
вы можете взаимодействовать с элементами управления и всем остальным.
Мой вопрос
В чем идея этого механизма, как сделать то же самое, если я хочу создать его с нуля?
Чего я хочу, так это функции времени разработки.
Комментарии:
1. » В чем идея этого механизма » — звучит так, как будто вы должны спросить Embarcadero напрямую, поскольку они разработали его таким образом.
2. @RemyLebeau Я думаю, что в конечном итоге мне придется это сделать, причина, по которой я спрашиваю об этом здесь, — просто получить более быстрый ответ от знающего человека. возможно, кто-то должен был сделать то, что я пытаюсь сделать здесь.
Ответ №1:
Я вижу, что код переопределяет как DoAddObject, так и DoInsertObject, вызывая AddOrInsertObject из обоих, при этом Add не передает индекс, поэтому он использует значение по умолчанию из последнего метода, которое является MaxInt.
В этом методе он записывает:
// Если AObject является TabItem, то мы добавляем его в контейнер элементов вкладки (FContent)
// Если AObject является эффектом, анимацией, ресурсом стиля, мы добавляем его в Self
// Во всех остальных случаях мы добавляем AObject в активную вкладку или специальный контейнер (FNoItemsContent)
принимая его снизу вверх:
очевидно, что FNoItemsContent используется, когда в TTabControl нет вкладок для добавления / вставки дочернего элемента
я думаю, что это похоже на шаблон делегирования, который они используют, чтобы вы могли взаимодействовать с самим TTabControl, и он передает его на текущую вкладку, если таковая имеется (за исключением специальных объектов Effect, Animation, Style, которые должны быть добавлены к самому TTabControl)
конечно, если вы попытаетесь добавить TTabItem, он будет добавлен в коллекцию tabs (контейнер tab items, он же FContent)
Комментарии:
1. большое вам спасибо, насколько я помню, после этого вопроса я пришел к тому же выводу и создал свой пользовательский элемент управления. также я не помню комментарии, которые вы процитировали (тогда я был на 10.3.3). в любом случае я хотел бы, чтобы у нас было больше возможностей для подкласса этих элементов управления, большинство из них скрывают нужные вам полезные функции, заставляя вас дублировать весь блок управления, чтобы переопределить только одну функциональность.