Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 608

/ вопрос открыт /

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

Храмцов Денис Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Храмцов Денис (статус: 1-ый класс)
Вопрос отправлен: 31 мая 2007, 09:15
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Venom

Здравствуйте, hdrus!
Если я все правильно понял, то ничего сложного нет.
F_Child.Top:=F_Main.Top;
F_Child.Left:=F_Main.Left;
F_Child.Width:=F_Main.Width;
F_Child.Height:=F_Main.Height;
если необходимо поставить ограничение на размер дочернего окна, то, например, так:
if F_Child.Width>F_Main.Width then F_Child.Width:=F_Main.Width;
if F_Child.Height>F_Main.Height then F_Child.Height:=F_Main.Height;
повесить можно на событие onresize

Ответ отправил: Venom (статус: 1-ый класс)
Время отправки: 31 мая 2007, 09:59

Ответ #2. Отвечает эксперт: min@y™

Нужно обрабатывать сообщение WM_GetMinMaxInfo в дочерних формах.

Порылся в исходниках. Вот тебе примерчик написал (см. приложение):

Приложение:
  1. program Project1;
  2.  
  3. uses
  4. Forms,
  5. Unit1 in 'Unit1.pas' {Form1},
  6. Unit2 in 'Unit2.pas' {Form2};
  7.  
  8. {$R *.res}
  9.  
  10. begin
  11. Application.Initialize;
  12. Application.CreateForm(TForm1, Form1);
  13. Application.CreateForm(TForm2, Form2);
  14. Form2.Show;
  15. Application.Run;
  16. end.
  17.  
  18. unit Unit1;
  19.  
  20. interface
  21.  
  22. uses
  23. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  24. Dialogs;
  25.  
  26. type
  27. TForm1 = class(TForm)
  28. private
  29. { Private declarations }
  30. public
  31. constructor Create(AOwner: TComponent); override;
  32. end;
  33.  
  34. var
  35. Form1: TForm1;
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41. { TForm1 }
  42.  
  43. constructor TForm1.Create(AOwner: TComponent);
  44. begin
  45. inherited;
  46. Constraints.MinHeight:= Height;
  47. Constraints.MaxHeight:= Height;
  48. WindowState:= wsMaximized;
  49. end;
  50.  
  51. end.
  52.  
  53.  
  54. unit Unit2;
  55.  
  56. interface
  57.  
  58. uses
  59. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  60. Dialogs;
  61.  
  62. type
  63. TForm2 = class(TForm)
  64. private
  65. procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GetMinMaxInfo;
  66. public
  67. { Public declarations }
  68. end;
  69.  
  70. var
  71. Form2: TForm2;
  72.  
  73. implementation
  74.  
  75. {$R *.dfm}
  76.  
  77. { TForm2 }
  78.  
  79. uses Unit1;
  80.  
  81. procedure TForm2.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
  82. begin
  83. inherited;
  84. Msg.MinMaxInfo^.ptMaxPosition.Y:= Form1.BoundsRect.Bottom;
  85. Msg.MinMaxInfo^.ptMaxSize.Y:= Screen.DesktopRect.Bottom - Form1.BoundsRect.Bottom;
  86. end;
  87.  
  88. end.
  89.  
  90.  
  91.  
  92.  
  93. object Form1: TForm1
  94. Left = 192
  95. Top = 109
  96. Width = 870
  97. Height = 118
  98.  
  99. Color = clBtnFace
  100. Font.Charset = DEFAULT_CHARSET
  101. Font.Color = clWindowText
  102. Font.Height = -11
  103. Font.Name = 'MS Sans Serif'
  104. Font.Style = []
  105. OldCreateOrder = False
  106. PixelsPerInch = 96
  107. TextHeight = 13
  108. end
  109.  
  110. object Form2: TForm2
  111. Left = 192
  112. Top = 105
  113. Width = 870
  114. Height = 640
  115.  
  116. Color = clBtnFace
  117. Font.Charset = DEFAULT_CHARSET
  118. Font.Color = clWindowText
  119. Font.Height = -11
  120. Font.Name = 'MS Sans Serif'
  121. Font.Style = []
  122. OldCreateOrder = False
  123. PixelsPerInch = 96
  124. TextHeight = 13
  125. end


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 31 мая 2007, 10:23
Оценка за ответ: 4

Ответ #3. Отвечает эксперт: Косолапов Дмитрий Юрьевич

Здравствуйте, hdrus!
Может быть, через MDI-интерфейс? Главным и дочерним окнам достаточно будет установить соотвествующие свойства.

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 31 мая 2007, 17:19


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 31 мая 2007, 12:13; участников в обсуждении: 2.
Храмцов Денис

Храмцов Денис (статус: 1-ый класс), 31 мая 2007, 11:00 [#1]:

Все бы хорошо только как бы еще главное окно когда оно развернуто привязать к верхней границе экрана
min@y™

min@y™ (статус: Доктор наук), 31 мая 2007, 11:24 [#2]:

Я чото не понял, ты мой пример компилил/запускал?
Там главная форма в развёрнутом состоянии разве не торчит на верхней границе экрана?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Храмцов Денис

Храмцов Денис (статус: 1-ый класс), 31 мая 2007, 11:47 [#3]:

В примере все отлично. Мне по сути нужна была только процедурка обработки собщения WM_GetMinMaxInfo для дочерних окон. Да при запуске форма разворачивается и прилипает к верхней границе только ее можно перемещять, а мне нужно такую возможность отключить.
Запусти Делфи7 и посмотри как там привязывается главное окно когда оно развернуто и как ведут себя дочерние.
min@y™

min@y™ (статус: Доктор наук), 31 мая 2007, 12:13 [#4]:

Взял из DelphiWorld:
Заблокировать перемещение формы
--------------------------------------------------------------------------------


Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{....}

private
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;

{....}


{....}

private
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;

{....}

procedure TForm2.WMNCHitTest(var Message: TWMNCHitTest);
begin
inherited;

with Message do
begin
if Result = HTCAPTION then
Result := HTNOWHERE;
end;
end;

Остаётся только поставить условие там:

if (WindowState = wsMaximized)
then with Message do
begin
if Result = HTCAPTION then
Result := HTNOWHERE;
end;
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.02 сек.