|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Динамическое создание "тяжёлой" формы
Доброго времени суток, форумчане!
Долгое время я работал над проектом базы данных для своих нужд, и по итогу работы пришёл к выводу, что интерфейс программы надо серьёзно переделать. Старый интерфейс был многооконным: нужна какая-нибудь справочная таблица - вызываем окно с ней из главного окна. В работе это было удобно, но пришлось очень много всего дублировать в интерфейсе. И я пришёл к выводу, что новую версию программы нужно делать однооконной, со вкладками. Но возник вопрос - а как запускать такое однооконное приложение, содержащее уйму интерфейсных элементов? По старой базе я провёл анализ времени выполнения задач при запуске, и вышло, что суммарно процентов до 40 всего времени запуска приходилось на создание форм (то есть примерно 10...12 секунд). Поскольку форм там было много, и они создавались последовательно, можно было отображать прогресс-бар загрузки. Все свойства и события форм прописывались в дизайн-тайме, а при запуске для каждой из них вызывалось Application.CreateForm(...). Но как быть в случае однооконного приложения, у которого форма будет создаваться 10 секунд? Это же явно неприемлемо. Тем более что этот этап идёт первым, а потом уже идёт загрузка настроек и активация датасетов? Возможен ли такой вариант: главное и единственное окно программы в дизайн-тайме содержит только PageControl-ы с пустыми вкладками - это для того, чтобы создание такой формы заняло минимальное время. И я делаю отдельные формы, которые будут относиться к проекту, но в ран-тайме создаваться не будут. И на этих формах я в дизайн-тайме размещаю интерфейсные элементы, которые впоследствии будут на вкладках единственного окна программы. Можно ли так сделать, чтобы динамически, при старте программы, в пустые вкладки главного окна вставлялись интерфейсные элементы из упомянутых заранее подготовленных в дизайн-тайме окон, причём желательно сразу группами - например, всё, что лежит на такой-то панели, затем - на другой, и т.д.? Понимаю, что теоретически можно и всё "до атомов" руками прописать в процедуре запуска, но это ж застрелиться можно, да и неудобно при разработке. Хотелось бы всё-таки максимально упростить себе жизнь, чтобы больше сосредоточиться на функционале программы, и не тратить слишком много труда на код процедуры запуска. |
#2
|
|||
|
|||
Ну, делал нечто подобное. Только вместо страничек делал MDI приложение. Естественно, с контролем создания форм, что бы не создавать 2 одинаковые формы. Собственно, там был написан очень простой фреймворк для создания формы, добавления соотв. пункта меню и т.д. Ну и, конечно, все формы "растут" от базовой для обеспечения общего интерфейса управления. Естественно, к диалоговым окнам это не относится.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Guaho (Вчера)
|
#3
|
|||
|
|||
Да, если не оставил идею делать главное окно программы на вкладках, то тут тебе могут помочь фреймы. Во время разработки фрейм выглядит как окно, но показать просто фрейм нельзя. Его надо "класть" на какой-то компонет наследник TWinControl (окно, страничку TabSheet, панель и т.д.).
Т.е. ты можешь отдизайнить все фреймы, а потом в OnCreate просто их все создать и положить на соотв. вкладки. Для автоматизации этого процесса можно сделать регистрацию таких фреймов: 1. Создаем синглтон на основе, например, TList. В нем определяем тип в котором храним имя класса и имя вкладки (ну и еще что, если нужно) 2. В каждом модуле фрейма в секции initialization регистрируем этот фрейм в нашем синглтоне. 3. В главной форме пробегаемся по синглтону и создаем все вкладки с фреймами на них. Как создавать класс по имени можно посмотреть, например, тут: https://stackoverflow.com/questions/...-from-a-string (тут, возможно, придется перекрыть конструктор Create, т.к. RTTI, вроде, умеет вызывать только дефолтный конструктор). Ну или придумать свой механизм... Последний раз редактировалось lmikle, Сегодня в 02:17. |