| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > MDI проложение и Chaild окна |
| Автор: ALXP 7.6.2008, 11:21 | ||||
| Приветствую! Вот столкнулся с проблемкой. У мну MDI приложение. Т.е. стало мди. Я создал просто приложение с основной формой не MDI. И еще много форм тоже отдельных, сразными кнопочками и т.п. Потом просто свойство основного окна FormStyle поставил в fsMDIForm А те формы остальные этоже свойство FormStyle поставил в fsMDIChild Окна создаю кодом
Типа проверяю если есть уже такое созданное окно то просто устанавливаю на него фокус По нажатии на закрытия окна пишу
НО ShowModal() в MDI делать нельзя, только Show() Я не знаю как сделать это. Или просто |
| Автор: orthrus 7.6.2008, 12:06 |
| MDIChild нельзя сделать модальным, так что вызывай это окно не как MDIChild но модально. |
| Автор: Vyacheslav 9.6.2008, 19:42 | ||||||||||||||
| Cымитируй работу модального окна. При вызове Child окна из друго окна передаешь ему качестве owner окно , которое его вызывает типа
Задаешь обработчик
Не забудь задать обработчики OnClose для всех child-окон, иначе не сможешь их закрыть
Добавлено @ 19:47 Кстати вот этого
в коде делать не рекомендуется. Лучше изменить в инспекторое. В хелпе есть на этот счет рекомендации( С++Builder 6 )
Чтобы Child-окна при этом не появлялись при запуске нужно убрать их из списка автосоздания и создвать в коде, как я уже выше показывал Если указатель на окно не нужен, то просто
Если же он все так для чего то нужен, то
где childForm - переменная типа TChildForm |
| Автор: ALXP 10.6.2008, 08:30 |
| orthrus это я понимаю и знаю, но прога такова что все окна должны быть в оном контейнере, т.е. внутри одного окна. Такова цель. Вот только стандартные диалоги как MessageBox можно по заданию вызывать как модальные для всей проги Vyacheslav спасибо, но есть большиено. Я попробовал как Вы написали. Это работает, если мы будем нажимать на окно родитель. НО в окне родителе есть таблица и другие элементы, если мы на них нажимаем, то активной становится форма родитель и такое же происходит когда нажимаем на кнопки свернуть развернуть. Так что этот способ работает, но не так как надо. ..------------------------------------- А насчет того чтобы сделать неактивными остальные окна У меня вот какая задумка появилась. Я понимаю что будет полный бред для некоторых, и не надо орать на меня и бить ногами, просто как вариант. И хочу отзывов. У мну окон определенное количество 8 штук, они не генерятся случайно. поэтому я в оснойной WinMain могу сделать глобальные переменные для каждой формы типа bool, которые будут показывать создана форма щас или нет. И сделать функцию для тех окон которые должны вызываться типа модально, которая будет просто те окна которые созданы делать неактивными, а при закрытии такой модальной формы делать активными. ..-------------------------------------------- Думаю так будет чуток геморойней, но сработает. Но это не решит проблему паузы в окне вызывателя(родителя) Как можно поставить на паузу MDIChaild ? |
| Автор: Vyacheslav 10.6.2008, 10:29 | ||||
| Ну можно пойти от обратного сделать следущее. Поскольку модальное окно может быть одно, создайте переменную , которое будет указывать на модальное окно и которое будет доступно для всех окон( можно в главвной форме) Для каждого окна задайте обработчик
Чтобы передать информацию в момент закрытия окна можно воспользоваться куче вариантов Например просто в событии OnClose модально окна передать все, что нужно Я бы сделал базовый класс для Child - окон, в котором бы предусмотрел виртуальную функцию OnModalClose( TBaseChildForm * modalForm)
По логике быдо бы лучше предусмотреть событие even, которое будет вызываться у родительского окна на момент закрытия модального окна [/code] |
| Автор: ALXP 10.6.2008, 10:45 |
| а по закрытию делаю эти формы(окно MDIChild) наоборот Enabled = true. Это работает. Пока у меня активна (модальная)форма все остальные неактивны. С этой проблемой разобрался. А со второй проблемой справился (вроде справился) так (пока работает). В форме родителе у мну есть кнопочка добавить новую запись ,а эта запись бралась из второй (модальной) формы. А сделал так. Создал в окне с кнопочкой переменную флаг(bool) и если нажата кнопочка добавить новую запись, то делаю флаг в true. А в метод OnActivate поместил проверку этого флага. и если да , то записываю запись которую возвращает в глобальную переменную(которая определена в главном окне) (модальная)форма по закрытии. Получается что по закрытию (модальной)формы она возвращает и запись мне нужную и делает активными все окна которые были неактивны. Срабатывает тот метод и происходит запись в базу УРА. Правдо геморно это все флагами делать. Если кто знает способ проще то поделитесь |
| Автор: ALXP 11.6.2008, 07:46 |
| Рано радовался. То что блокирую окна по открытию какой либо формы это ГУД. то что надо. Вот вопрос опять. МОЖНО ЛИ ПОСТАВИТЬ ВЫПОЛНЕНИЕ ЧАЙЛДА В ПАУЗУ? как поток , остановил запустил? сделать паузу прям посреди выполнения какой либо функции(метода)? |
| Автор: ALXP 16.6.2008, 16:09 |
| теперь видно какое окно модальное работает и могу сделать проверку, если оно есть, то там где надо, ничего не делается, а просто выходит из функции(метода). Уря. Теперь у мну с маленьким гемороем есть MDI приложение в котором есть ModalChild |