Delphi: Управление несколькими экземплярами TFrames
В этой статье объясняется, как использовать TFrames в качестве альтернативы TTabSheets в Delphi PageControl.
Я размышлял над подобным упражнением, которое, по-видимому, не дает решения выше, и для которого мое решение кажется слишком сложным.
Требование к интерфейсу с вкладками, где каждая вкладка может быть одной из нескольких различных конструкций. Каждый дизайн реализован в виде TFrame.
Из-за характера разрабатываемого приложения у нас может быть несколько копий любого фрейма, открытого в любой конкретный момент (при этом содержимое каждой вкладки отличается, но не дизайн), чтобы пользователь мог сравнить детали 2/3 разных предметы одновременно.
Например, в одном сеансе у нас может быть открыто 3 вкладки, все в рамке А. В другом случае у нас может быть открыто 3 вкладки в каждой из рамок А, В и С.
Дизайн должен быть достаточно гибким, чтобы мы могли добавлять рамки к дизайну по запросу.
На данный момент, решение, которое у меня есть, состоит в том, чтобы иметь отдельные TList, управляющие каждым типом Frame, который у нас открыт, и, возможно, главный TList для отслеживания открытых вкладок. Как я уже сказал, более сложный.
У кого-нибудь есть предложения о том, как это можно сделать проще?
3 ответа
Я бы, вероятно, пропустил главный TList экземпляров фрейма
Если они вам нужны, вы сможете получить их, опросив TPageControl напрямую или через каждый из ваших отдельных списков TList для каждого типа фрейма.
Кроме того, ваш подход звучит разумно.
У меня есть приложение, которое управляет кадрами на одной панели с моим собственным элементом управления меню, чтобы контролировать, какой кадр виден. Когда мне нужно сделать видимый кадр, я просто устанавливаю visible:=false для каждого кадра на панели, кроме того, который мне нужен. Я контролирую то, что происходит на панели, поэтому я знаю, что по крайней мере каждый элемент управления является Tframe, и я могу добраться до каждого кадра, перебирая свойство Controls панели. Затем я использую интерфейсы для связи между моей основной формой и моими фреймами.
Теперь, если вы хотите использовать стандартный интерфейс Windows с вкладками, вы все равно можете использовать элемент управления страницей, как вы предлагали, вы знаете, что на каждом TtabSheet есть один Tframe, и вы можете проверить его тип и работать с ним по мере необходимости. Я не понимаю, зачем вам нужен Tlist, потому что, если вам действительно нужно попасть в "список Tframes", вы все равно можете построить его динамически, перебирая TtabSheets в элементе управления страницы.
Альтернативой, которая будет работать аналогично моему первому подходу, но при этом вы получите хорошие вкладки Windows, будет использование TtabControl вместо TpageControl. С TtabControl вы просто получаете экземпляр Tstrings (в свойстве Tabs), который представляет все вкладки. Поскольку это Tstrings, вы можете связать объект (т.е. ваш Tframe) с каждым элементом и, следовательно, с каждой вкладкой. Когда вы нажимаете на вкладку, вы скрываете все и показывает правильный Tframe. У вас также есть свой список, потому что он привязан к TtabControl через свойство Tabs. Вы просто должны сами управлять видимостью кадров.
Мы используем TPageControl и создаем во время выполнения потомка TTabSheet, у которого есть новое свойство для нашего собственного TFrame (нам не нужно сканировать через.Controls или.Components, чтобы искать наш кадр каждый раз).