Как взаимодействовать с не сохраненными дочерними элементами управления во время разработки FMX? (Содержимое вкладки TTabControl)

#delphi #tabcontrol #tabcontainer

#delphi #tabcontrol #tabcontainer

Вопрос:

Я просматривал код TTabControl в течение последних трех дней и обнаружил следующее:

  1. Элемент управления будет принимать дочерние элементы управления, но перенаправлять их в зависимости от состояния, в котором он находится, например: если дочерним элементом является TTabItem , он назначит его FContent: TContent , который используется в качестве контейнера вкладок, в противном случае, если дочерним элементом является специальный элемент управления ( TEffect, TAnimation ... ), он будет добавлен к TTabControl , иначе, если есть активная вкладка, дочерний элемент будет перенаправлен на нее, иначе он будет перенаправлен на FNoItemsContent: TContent невидимый элемент управления (понятия не имею, почему !!!).
  2. когда дочерний элемент перенаправляется на активную вкладку, он будет перенаправлен на 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). в любом случае я хотел бы, чтобы у нас было больше возможностей для подкласса этих элементов управления, большинство из них скрывают нужные вам полезные функции, заставляя вас дублировать весь блок управления, чтобы переопределить только одну функциональность.