Вопрос № 94035: Доброго дня всем!У меня вопрос или вернее призыв к обсуждению
При запуске программы возникает меню скажем из пяти пунктов
в виде пяти кнопок.При нажатии на какую либо кнопку меню
исчезает и возникает окно совсем другого вида со своим наб...
Вопрос № 94.035
Доброго дня всем!У меня вопрос или вернее призыв к обсуждению
При запуске программы возникает меню скажем из пяти пунктов
в виде пяти кнопок.При нажатии на какую либо кнопку меню
исчезает и возникает окно совсем другого вида со своим набором
компонентов.И т.д Т.е форма одна но ее вид и компоненты на ней каждый раз другие.
В паскале было все просто - делаем clrscr и рисуем что хотим.
Как это сделать в DELPHI ?
Порывшись в своих книжках я нашел три способа решения проблемы
1 Создаем одну форму и бросаем на нее ВСЕ компоненты а потом
из программы через свойство ENABLED включаем или отключаем
компоненты по мере надобности.Но как такую вещь проектировать
ведь они будут сидеть друг на дружке а если их очень много то будет полная неразбериха
2Создать для каждого пункта меню свою форму .Через процедуры HIDE
SHOW включаем одну форму и выключаем другую.Но при этом вырастает
объем программы ведь даже пустая форма довольно увесиста.
3 Ничего не коструировать а все нужные копоненты создавать
и удалять програмно.Но тут все надо делать через код и
пропадают все удобства визуального програмирования.
А как в таком случае поступают профессионалы ? Может быть
есть более простое решение ? Не хотелось бы изобретать
велосипед.
Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Байрашевский Тахир!
2 Вариант наименее трудоемок и наиболее удобен при разработке, а насчет "увесистости" Вы не правы. Когда в приложение добавляется _первая_ форма, вместе с кодом собственно ее модуля и ресурса (.dfm) добавляется соответствующий код VCL. При добавлении же остальных форм код библиотеки не добавляется (он уже есть), добавляется только код модуля формы и .dfm. Разница полезного кода по сравнению с первым вариантом будет килобайта 3-4 (из-за выравнивания модуля по границе страницы)
В принципе, можно использовать и первый вариант, но компоненты группируем панелями, которые когда надо показываем/скрываем. При разработке нужную панель делаем Bring to front и работаем с ее компонентами.
Ответ отправил: Лукьяненко Алексей Валериевич (статус: 8-ой класс)
Ответ отправлен: 05.07.2007, 13:49 Оценка за ответ: 5
Отвечает: BlackRaider
Здравствуйте, Байрашевский Тахир!
Можете сделать все через формы но формы сделать в DLL
B по мере необходимости вызывать те DLL которые нужны и выгружать те что уже отработали... По крайней мере я б так сделал.
Это конечно не уменьшит общего размера файла но в процессе работы программы снизит размер занимаемой памяти.
Ответ отправил: BlackRaider (статус: 1-ый класс)
Ответ отправлен: 05.07.2007, 13:55 Оценка за ответ: 4
Отвечает: Sandy
Здравствуйте, Байрашевский Тахир!
Как вариант, каждый вид формы разместить на отдельной TPanel, которых будет столько, сколько видов у формы. Visible в каждый момент времени только у одной. В режиме разработки достаточно удобно получать доступ к нужной панели выбрав нужную панель в инспекторе объектов и через меню Правка пункт BringToFront,
Ответ отправил: Sandy (статус: 7-ой класс)
Ответ отправлен: 05.07.2007, 14:22 Оценка за ответ: 5
Отвечает: W@NDeReR
Здравствуйте, Байрашевский Тахир!
Вместо Enabled можно использовать свойство Visible
--------- Опыт — дитя мысли, а мысль — дитя действия. Нельзя учиться по книгам.
Ответ отправил: W@NDeReR (статус: 5-ый класс)
Ответ отправлен: 05.07.2007, 16:35 Оценка за ответ: 3
Отвечает: Delph
Здравствуйте, Байрашевский Тахир!
А как Вы относитесь к такому компоненту, как PageControl? В нём можно сделать необходимое в Вашем приложении число листов, из которых в один момент времени полностью виден только один, а остальные представлены лишь в виде вкладок с названиями. Содержимое всех листов, кроме активного, скрыто как при проектировании программы, так и при выполнении, активируется же нужный лист одним кликом мышки. Для переключения листов Вам даже не придётся писать никакого кода, да и смотрится это, на мой взгляд, лучше, чем переключение
по меню.
В палитре компонентов PageControl находится на вкладке Win32. Поместите его на форму, щелчком правой кнопкой по нему Вы вызовите меню, в котором можно добавить лист (New sheet). Добавьте столько листов, сколько считаете нужным.
На мой взгляд это наиболее удобное решение в Вашей ситуации, поскольку оно сочетает в себе простоту реализации с привычным уже изяществом многих приложений. Если нужны подробности, пишите в личку, постараюсь ответить на все Ваши вопросы.
Ответ отправил: Delph (статус: 4-ый класс)
Ответ отправлен: 05.07.2007, 16:46 Оценка за ответ: 3
Отвечает: Виктор Пырлик
Здравствуйте, Байрашевский Тахир!
Все способы перечисленные вами хороши по-своему.
Часто удобно сделать так: добавить PageControl, установить Align = alClient и сделать у него столько вкладок, сколько необходимо, на момент запуска приложения, прятать все вкладки - PageControl1.Pages[i].Visible := false;
PageControl1.ActivePageIndex := 0; //или, та, которая вам нужна
где i – количество вкладок, можно получить из PageControl1.PageCount.
Таким образом, вы не будите загромождать форму, во время исполнения вкладки не будут видны (обычная форма будет) и будет видно только содержимое активной вкладки а переключаться можно так:
PageControl1.ActivePageIndex := <нужный номер>;
Но, проблема шире, и лежит не в реализации а в проектировании приложения, основным требованием которого является, в том числе – минимизация функциональных элементов на видимой форме и как следствие – разделение отдельных функционалов по разным модулям, что значительно снижает нагрузку на программиста при разработке (все разложено по полочкам). Сегодня действительно, добавление формы – не критично по отношению к ресурсам, совокупная требуемая память все равно перешагнет мегабайт. Но, такой подход, значительно
оптимизирует процесс разработки.
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: 5-ый класс)
Ответ отправлен: 05.07.2007, 23:07 Оценка за ответ: 3