Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2010, 11:34   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию MDIChild-формы самопроизвольно располагаются каскадом

Здравствуйте.

Есть такая проблема: Имеется MDI-окно, на которой располагаются несколько дочерних окон. Всем окнам выставлены св-ва WindowState := wsMaximized и BorderIcons := [];
Это сделано для того, что бы пользователь не мог закрыть окно кроме как через специальную кнопку. НО! Когда юзер жмёт на эту кнопку, что бы закрыть одно из окон, то происходит размещение каскадом всех остальных открытых окон. (При этом, если не трогать BorderIcons, то оставшиеся окна каскадом не располагаются).

Беглое исследование показало, что максимизированные окна располагаются каскадом, когда изменяется значение BorderIcons.

Если принудительно разворачивать оставшиеся окна после закрытия нужного окна, то происходит неприятное мерцание.

Подскажите пожалуйста, как можно закрыть максимизированное дочернее окно (без системных кнопок) либо, что бы оставшиеся окна оставались в состоянии wsMaximized, либо что бы моргание было не таким заментым.

Заранее спасибо!
Greek9000 вне форума Ответить с цитированием
Старый 02.07.2010, 07:46   #2
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

После некоторых изысканий удалось выяснить, что такое поведение формы происходит из-за того, что во время присвоения св-ву BorderIcons нового значения происходит вызов ф-ции RecreateWnd, которая пересоздаёт окно. При этом теряется значение св-ва WindowState.

Полностью победить проблему не удалось, но получилось её "обезвредить", путём перекрытия события дочерней формы WM_SYSCOMMAND следующим образом:

Код:
procedure TfrmSearch.WMSysCommand(var Msg: TWMSysCommand);
var
  sMsg:string;
begin
  sMsg := 'Управлять страницами можно только через вкладки';
  MessageDlg(sMsg, mtInformation, [mbOK], 0);
end;
Теперь пользователь не сможет закрыть дочернее окно с помощью кнопок системного меню (Чего и требовалось добиться). Но появилась другая проблема: кнопки системного меню дочернего окна расположены пряпо под кнопками главного окна и я очень часто промахиваюсь и пытаюсь закрыть вместо главного окна дочернее.
Может быть кто-нибудь может подсказать, перекрытием какого события можно спрятать эти самые системные кнопки дочернего окна?
Greek9000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Самопроизвольно закрывается форма после выполнения процедуры nitroG Помощь студентам 5 04.05.2010 08:20
Стиль MDIChild Dr.Badnezz Общие вопросы Delphi 0 05.04.2010 16:54
MdiChild Farhod Общие вопросы .NET 3 01.04.2010 16:50
Mdichild приложение SeregaKo Общие вопросы Delphi 7 28.03.2009 00:55
Закрытие формы MDIChild в MDI приложении Avalonix Общие вопросы Delphi 4 29.05.2008 16:45