![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Два меню на одной форме [D7, WinXP]
Инна © (2005-08-02 19:40:00)Как сделать так чтобы на форме было два меню: одно которое бы сливалось с меню главной формы, а второе было непосредственно на форме?
Или что-бы только некоторые пункты сливались, а остальные оставались на форме.
Юрий Зотов (2005-08-07 09:57:00) [1]Слияние меню, дефолтное позиционирование, одновременное распахивание и пр. - все это не борландовские, а майкрософтовские решения. Совершенно стандартное поведение дочерних окон в Windows, с которым ничего делать и не нужно.
msguns (2005-08-07 09:47:00) [2]И еще про MDI
"Дочки" весьма капризны. Например, при распахивании хотя бы одной дочки, распахиваются все. И наоборот. При создании и открытии дочки Гл.форма не может получить эффективный доступ к ее полям и методам, как она это может при создании обычной (fsNormal) формы.
Например, код
With TfrmChild.Create(MainForm) do
begin
Top := MainForm.Top+20;
Left := MainForm.Left+20;
Show;
end
который совершенно эффективно спозиционирует вновь созданную fsNormal форму как указано, будет совершенно "холостым" при создании "дочки" (fsMDIChild).
Этот эффект делает стартовое позиционирование дочек затруднительным и, главное, приводит к мельканию на экране (видно, как форма рисуется сначала там, где ей "сказали" в Position, а потом перерисовывается в новом месте).
Возможно, подключатся мастера и посоветуют, как избежать подобного эффекта, у меня получилось только переопределив некоторые части конструктора, что в общем совсем не так просто. Код получился громоздким, а результат несколько "смазанным" из-за побочных эффектов. В рез-те эти эксперименты я бросил, "подгоняя" концепцию управления окнами своих приложений под стандартные борландовские решения ;)
msguns (2005-08-07 09:37:00) [3]ИМХО, не стоит дублировать пункты в дочках, если они есть в основном. Достаточно посмотреть реализацию элементов управления в таком профессионально сделанном продукте, как MsOffice. Есть Главная форма с полной палитрой функций, которую очень удобно настраивать "под себя". И есть "дочки" - окна с документом, книгой, .. У дочек нет своих кнопок - используется общая панель (панели) управления с Гл.формы.
Задача "дочек" в том, чтобы контекстно переключать "кнопки" (экшины) в активное или пассивное состояние в зависимости от ее конкретных условий. Обычно это укладывается в одну процедуру-метод класса "дочки", вызов которой выполнется по событиям Ativate, Deactivate формы, а также OnEnter/OnExit ее винконтролов. Вся обработка кликов юзера цетрализуется в гл.форме через TActionList/TActions+TImageList. Каждый обработчик экшина также реализуется в Гл.форме, причем без привязки к конкретным экземпярам классов-компонент дизайна. Получая управление, процедура-обработчик определяет активную "дочку", тип активного контрола, и если это тот, что надо, выполняет соотв.действия.
В общем, довольно просто.
В некоторорых случаях "дочка" может иметь свои, чисто специфические функции. Вот их, имхо, не стоит выносить в Главную, а реализовать на самой "дочке" в виде либо панели управления (если функций много), либо просто кнопками с надписями.
Перед тем, как проектировать MDI-приложение, надо 100 раз подумать. Ведь подобные программы требуют от пользователя некоторой начальной опытности работы с многодокументными интерфейсами (хотя бвы с тем же вордом) и часто приводят к непониманию новичков того, что происходит на экране его монитора.
Кроме того, "дочку" нельзя "заставить" работать в модальном режиме (можно лишь сэмулировать, играя на OnExit, On DeActivate, OnClose, OnCloseQuery и т.д. - но обязательно будут проблемы, в частностьи с тем же управлением от Гл.формы), что часто делает управление приложением весьма запутанным.
Мой совет, найдите профессиональную программу, схожую по функциям с Вашей, посмотрите, как реализован контрол там. И сделайте так же.
Profi (2005-08-07 00:33:00) [4]Инна (02.08.05 19:40)
Имеется ввиду Mdi приложение?