0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 39
1

Сворачивание MDIChild окна

11.10.2012, 16:30. Показов 3497. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При сворачивании дочернего MDI окна, оно уходит в нижний левый угол родительского окна. Можно ли настроить так, чтобы не показывало это(при сворачивании скрывался полностью)?
Миниатюры
Сворачивание MDIChild окна  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2012, 16:30
Ответы с готовыми решениями:

Размеры рабочей области для mdiChild окна
дд, кто знает подскажите необходимо ограничить рабочую область для дочерней формы mdi приложения...

Можно ли из MDIchild формы открывать другую Mdichild форму?
Поясню. Mdichild(дочерняя форма) содержится в mdiform(родительская форма), из родительской формы...

Автозапуск и сворачивание окна
Здравствуйте господа программисты ! Подскажите как можно сделать что бы программа запускалась в...

Создание MDIChild окна, для настроек программы...
Помогите чем сможите. Делаю программу c MDI интерфейсом, в дочернем окне "Ностройки" по смыслу...

9
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.10.2012, 18:07 2
Вот из интернета:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
  private
    procedure WMGetSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
 
...
 
procedure TForm2.WMGetSysCommand(var Msg: TMessage);
begin
  if (Msg.wParam = SC_MINIMIZE) then
    Close 
  else
    inherited;
end;
Проще говоря, перехватываешь сообщениие минимизации формы в котором запускаешь её закрытие. А событии OnClose пишешь:
Delphi
1
Action:=caHide; //Скрыть
На 100% не уверен, но попробуй.
0
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 39
11.10.2012, 18:19  [ТС] 3
Одиночка, к сожалению повесить на OnClose не получиться. Событие уже задействовано в закрытии дочерней формы.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.10.2012, 18:27 4
Можешь показать, как именно задействовано.
На крайний случай можешь в таймере проверять:
Delphi
1
If Form2.WindowState=wsMinimize Then Form2.Hide;
Или вообще, в первом коде писать Hide для скрытия.
0
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 39
11.10.2012, 18:33  [ТС] 5
Одиночка, Закрытие обрабатывается следующим образом:

Delphi
1
2
3
4
5
6
procedure Tformadv.DoClose;
begin
  inherited;
  sendmessage(application.MainForm.Handle, WM_MDIDESTROY, self.Handle, 0);
  action:=cafree;
end;
Сенд использую для обработки в главной форме, где расположены индикаторы, какие дочерние формы открыты, какие закрыты.
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.10.2012, 18:44 6
Hide не пробовал? (Предыдущий мой пост).
0
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 39
11.10.2012, 18:49  [ТС] 7
Одиночка, так как предложил нет, пробывал так:

Delphi
1
2
3
4
5
6
var i:integer;
begin
 for i := 0 to self.MDIChildCount-1 do
  if (self.MDIChildren[i].WindowState=wsnormal) or(self.MDIChildren[i].WindowState=wsMaximized) then
   self.MDIChildren[i].Hide;
end;
Как итог мне сказали "Cannot hide an MDI Child Form"
0
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
11.10.2012, 19:07 8
Вот совет из инета:
Delphi
1
raise EInvalidOperation.Create(SMDIChildNotVisible);
Это для скрытия. Вместо Hide.
1
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32793 / 21133 / 8144
Регистрация: 22.10.2011
Сообщений: 36,393
Записей в блоге: 8
11.10.2012, 19:11 9
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Anross, перехватывай в дочерней форме WM_SIZE:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TMDIChild = class(TForm)
   // ...
private
   procedure WMSize(var Msg : TWMSIZE) ; message WM_Size;
   // ...
 
procedure TMDIChild.WMSize(var Msg : TWMSIZE);
begin
   if Msg.SizeType = Size_Minimized then
   begin
     ShowWindow(Handle, SW_HIDE); // И скрывай форму
     Msg.Result := 0;
   end
   else Inherited;
end;
, только как потом будешь восстанавливать?
1
0 / 0 / 0
Регистрация: 11.10.2012
Сообщений: 39
11.10.2012, 22:36  [ТС] 10
UI, Спасибо, то что нужно. Разворачивание окна не проблема.

Суть вообще такая, есть главная форма, из которой запускаются разнообразные дочерние окна. Для удобства, решил сделать нечто вроде вкладок в браузере. Одна форма-одна вкладка. В качестве вкладок взял TabControl, для управления(сворачивание, разворачивание, закрытие) прикрутил еще PopupMenu. А чтобы не описывать решил для дочерних сделать другой базовый класс, на основе TForm, отличается от которого ток SendMessage для создания, закрытия и управления вкладками.
0
11.10.2012, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2012, 22:36
Помогаю со студенческими работами здесь

Предотвратить сворачивание окна по нажатию кнопки Windows «Свернуть все окна»
Здравствуйте, пишу что то вроде гаджета на c# wpf, и возник вопрос: можно ли как нибудь...

Сворачивание окна по клику в любом месте окна браузера
Приветствую уважаемые форумчане. Есть сайт bm05.ru. Верху над логотипом есть две разворачивающиеся...

Как запретить сворачивание окна приложения при нажатии кнопки "свернуть все окна"
Что происходит при нажатии этой кнопки в плане сообщениий, и как их перехватить и игнорировать,что...

Сворачивание окна
Когда сворачиваю окно, то оно выглядит вот так (форма не главная)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru