Delphi как сделать mdi окно всегда максимизированным

Обновлено: 19.04.2024

Я ищу, чтобы предотвратить изменения изменений в Microsoft Window Window, возникающие при создании второго дочернего MDI.

У меня есть приложение, которое я разрабатываю, написанное на Delphi. Через небольшое волшебство Delphi/Windows приложение имеет несколько родителей MDI и несколько детей MDI.

Я могу создать форму (Child A1) и максимизировать ее в родительском MDI (Родитель A). Я могу создать вторую форму (Child B1) и максимизировать ее в течение второго родителя MDI (родителя B). Обе формы будут мазимизированы в отдельных родителях MDI. Все идет нормально. У меня это работает.

Однако, когда я создаю второго родителя MDI (дочерний A2) в первом родителе MDI (родитель A), WindowState (wsMaximized) первого дочернего элемента (дочерний A1) изменяется, когда создается второй ребенок (дочерний A2). Я хочу, чтобы первый ребенок (Child A1) оставался максимальным, а второй ребенок (Child A2) должен быть создан и помещен поверх первого ребенка.

Как я могу предотвратить изменение состояния первого ребенка MDI, а также создать второй ребенок MDI? Любые намеки?

ОК - Теперь я немного пообедал, может быть, я могу объяснить это лучше. здесь второй пойдет на это.

Описанное поведение может быть воспроизведено в простом приложении MDI (магия, которую я использовал для создания нескольких родителей MDI, не влияет на мою проблему)

Создать новое приложение форм, изменяющее форму в формате fsMdiForm
Создайте вторую форму, изменив ее стиль на fsMDIChild
Создайте третью форму, изменив ее стиль на fsMDIChild

Запустите приложение. Создайте вторую форму, затем максимизируйте (работает как ожидалось - максимизируется в родительском MDI)
Создайте третью форму, откроется третья форма с состоянием окна wsNormal. Но когда создается третья форма, изменяется состояние окна второй формы - она ​​перестает быть максимальной и становится wsNormal, как если бы вы нажали на восстановление!

Я хочу избежать восстановления второй формы при открытии третьей формы. (У всех форм есть исходный WindowState wsNormal.

Добрый день!
Мне нужно чтобы в MDI приложении первое созданное
дочернее окно было максимизировано.
Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Мне нужно чтобы оно было максимизировано сразу. Я видел такие приложения.

Здравствуйте, ak_miass, Вы писали:

_>Добрый день!
_>Мне нужно чтобы в MDI приложении первое созданное
_>дочернее окно было максимизировано.
_>Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Это вроде как фича MDI. походу никак. ИМХО.

странно, не заметил такого эффекта. (может анимация выключена)
Может попробовать Visible = False в Designtime а в рантайме WindowState := wsMaximized; Visible := True;?

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, ak_miass, Вы писали:

Подскажу возможный путь.

Особенность MDI-окон состоит в том, что они не могут быть невидимыми. Поэтому MDI-окно создается сразу видимым, а максимизация отрабатывает позднее.

Соответственно, цель заключается в том, чтобы окно было изначально максимизированным (до того, как станет видимым). Я вижу два возможных варианта:

— устанавливать WindowState в конструкторе окна до вызова inherited (то есть до считывания dfm)

— в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

Здравствуйте, Softwarer, Вы писали:

S>- в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

В этом случае если в дизайн-тайме поставить Visible = false, то эффект остаётся тот же. А если Visible = true, то ещё хуже: сначала появляется окно на весь экран и затем уменьшается. Если затем вернуть ему wsNormal, оно остаётся плавать внутри главоного окна, но при этом огромных размеров.

Здравствуйте, ak_miass, Вы писали:

Нда. Там довольно интересно — эта "мультипликация" отрабатывается отдельно, уже после того как окно создано, показано, активизировано. Покопаюсь; если найду способ — опубликую.

P.S. Правильно я сделал лет семь назад, что раз и навсегда решил не использовать MDI

Здравствуйте, ak_miass, Вы писали:

Что ж, вот такой код отрабатывает вполне неплохо.


Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает. Почему — надо будет разобраться, но пока — могу предложить такое решение.

Здравствуйте, Softwarer, Вы писали:

S>Что ж, вот такой код отрабатывает вполне неплохо.

S>

Спасибо! Это помогло.

S>Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает.

Думаю, что в конструкторе окно ещё не показано на экране.

Hello, ak_miass!
You wrote on Fri, 17 Sep 2004 04:28:03 GMT:

S>> Что ж, вот такой код отрабатывает вполне неплохо.
S>>

am> Спасибо! Это помогло.

S>> Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а,
S>> у меня это не срабатывает.

am> Думаю, что в конструкторе окно ещё не показано на экране.

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, Diouzshev, Вы писали:

Нет, там тоже не работает. Но тот вариант, который предложил Softwarer мне вполне подходит.

Добрый день!
Мне нужно чтобы в MDI приложении первое созданное
дочернее окно было максимизировано.
Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Мне нужно чтобы оно было максимизировано сразу. Я видел такие приложения.

Здравствуйте, ak_miass, Вы писали:

_>Добрый день!
_>Мне нужно чтобы в MDI приложении первое созданное
_>дочернее окно было максимизировано.
_>Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Это вроде как фича MDI. походу никак. ИМХО.

странно, не заметил такого эффекта. (может анимация выключена)
Может попробовать Visible = False в Designtime а в рантайме WindowState := wsMaximized; Visible := True;?

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, ak_miass, Вы писали:

Подскажу возможный путь.

Особенность MDI-окон состоит в том, что они не могут быть невидимыми. Поэтому MDI-окно создается сразу видимым, а максимизация отрабатывает позднее.

Соответственно, цель заключается в том, чтобы окно было изначально максимизированным (до того, как станет видимым). Я вижу два возможных варианта:

— устанавливать WindowState в конструкторе окна до вызова inherited (то есть до считывания dfm)

— в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

Здравствуйте, Softwarer, Вы писали:

S>- в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

В этом случае если в дизайн-тайме поставить Visible = false, то эффект остаётся тот же. А если Visible = true, то ещё хуже: сначала появляется окно на весь экран и затем уменьшается. Если затем вернуть ему wsNormal, оно остаётся плавать внутри главоного окна, но при этом огромных размеров.

Здравствуйте, ak_miass, Вы писали:

Нда. Там довольно интересно — эта "мультипликация" отрабатывается отдельно, уже после того как окно создано, показано, активизировано. Покопаюсь; если найду способ — опубликую.

P.S. Правильно я сделал лет семь назад, что раз и навсегда решил не использовать MDI

Здравствуйте, ak_miass, Вы писали:

Что ж, вот такой код отрабатывает вполне неплохо.


Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает. Почему — надо будет разобраться, но пока — могу предложить такое решение.

Здравствуйте, Softwarer, Вы писали:

S>Что ж, вот такой код отрабатывает вполне неплохо.

S>

Спасибо! Это помогло.

S>Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает.

Думаю, что в конструкторе окно ещё не показано на экране.

Hello, ak_miass!
You wrote on Fri, 17 Sep 2004 04:28:03 GMT:

S>> Что ж, вот такой код отрабатывает вполне неплохо.
S>>

am> Спасибо! Это помогло.

S>> Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а,
S>> у меня это не срабатывает.

am> Думаю, что в конструкторе окно ещё не показано на экране.

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, Diouzshev, Вы писали:

Нет, там тоже не работает. Но тот вариант, который предложил Softwarer мне вполне подходит.

Добрый день!
Мне нужно чтобы в MDI приложении первое созданное
дочернее окно было максимизировано.
Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Мне нужно чтобы оно было максимизировано сразу. Я видел такие приложения.

Здравствуйте, ak_miass, Вы писали:

_>Добрый день!
_>Мне нужно чтобы в MDI приложении первое созданное
_>дочернее окно было максимизировано.
_>Делал WindowState = wsMaximized. При этом хорошо видно, как оно сначала создаётся с нормальными размерами, а затем расширяется.
Это вроде как фича MDI. походу никак. ИМХО.

странно, не заметил такого эффекта. (может анимация выключена)
Может попробовать Visible = False в Designtime а в рантайме WindowState := wsMaximized; Visible := True;?

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, ak_miass, Вы писали:

Подскажу возможный путь.

Особенность MDI-окон состоит в том, что они не могут быть невидимыми. Поэтому MDI-окно создается сразу видимым, а максимизация отрабатывает позднее.

Соответственно, цель заключается в том, чтобы окно было изначально максимизированным (до того, как станет видимым). Я вижу два возможных варианта:

— устанавливать WindowState в конструкторе окна до вызова inherited (то есть до считывания dfm)

— в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

Здравствуйте, Softwarer, Вы писали:

S>- в дизайн-тайме описать это окно как fsNormal и wsMaximized, а стиль MDIChild устанавливать в ран-тайме (при этом, если не ошибаюсь, окно автоматом станет видимым).

В этом случае если в дизайн-тайме поставить Visible = false, то эффект остаётся тот же. А если Visible = true, то ещё хуже: сначала появляется окно на весь экран и затем уменьшается. Если затем вернуть ему wsNormal, оно остаётся плавать внутри главоного окна, но при этом огромных размеров.

Здравствуйте, ak_miass, Вы писали:

Нда. Там довольно интересно — эта "мультипликация" отрабатывается отдельно, уже после того как окно создано, показано, активизировано. Покопаюсь; если найду способ — опубликую.

P.S. Правильно я сделал лет семь назад, что раз и навсегда решил не использовать MDI

Здравствуйте, ak_miass, Вы писали:

Что ж, вот такой код отрабатывает вполне неплохо.


Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает. Почему — надо будет разобраться, но пока — могу предложить такое решение.

Здравствуйте, Softwarer, Вы писали:

S>Что ж, вот такой код отрабатывает вполне неплохо.

S>

Спасибо! Это помогло.

S>Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а, у меня это не срабатывает.

Думаю, что в конструкторе окно ещё не показано на экране.

Hello, ak_miass!
You wrote on Fri, 17 Sep 2004 04:28:03 GMT:

S>> Что ж, вот такой код отрабатывает вполне неплохо.
S>>

am> Спасибо! Это помогло.

S>> Почему-то если запихнуть то же самое внутрь конструктора MDIChild-а,
S>> у меня это не срабатывает.

am> Думаю, что в конструкторе окно ещё не показано на экране.

With best regards, Alexander Diouzshev-Maltsev.

Здравствуйте, Diouzshev, Вы писали:

Нет, там тоже не работает. Но тот вариант, который предложил Softwarer мне вполне подходит.

Характеристика:
Глюк похож на двадцать пятый кадр. Приходится улавливать глазом рисование сцены объектов, которой в реальности мы не видели и не увидим, т.е. открыт канал в паралельный мир. При насыщеном перерисовками и выравниваниями скролбаров и сплитов IDE, начинает подташнивать.


При переключении этих окон в дизайнере Delphi, та же глюка, а вот при Ctrl+Tab её нет нигде. Были идеи посылать в главное окно комбинацию клавиш, пока не переключишся на нужное, но уже при пяти окнах пришлось отказаться - ещё хуже.

Какие вопросы всвязи с этим интересуют меня:
а. Может кто знает как с этим бороться или причины этого.
б. Может будут здоровые свежие идеи по этому поводу.
в. Я уже кое что сделал, но идея сильно не доработана. Много ситуаций когда меняется сценарий поведения VCL или система перестаёт понимать что произошло. Код я выложу немного позже, пока интереснее первые вопросы.
г. Ну и какую Вы хотели бы логику поведения окон, что для Вас было бы стандартным при ситуациях минимизации максимизации, переключениях и т.д. Ситуации я тоже отпишу попозжа.

Ладно. Короче что я делаю, и что делаю не так?

Идея следующая. Кодга окно максимизируется, то я устанавливаю размеры и положение окна, так чтобы они совпадали с клиентской областью. При активизации следующего окна, перерисовки и реалигны совпадают с той картиной которую мы увидим. Но конечно некоторый геморой - требуется запоминать истинные нормальные размеры. Востанавливать их когда надо. Реагировать на закрытие Main, так как используются rx-овские сторожи сохраняющие позицию в ini файле и TMS-овские "офисные" контролы. И т.д.

Приходится не полагаться на WindowState, так как VCL и TMS переключают окна по разному. приходится ориентироваться по отрикательному TopLeft - тогда это максимизация. Я понимаю, что в такой ситуёвине винда диктует свою политику жёстко, дельфа не понимает что хочет видна, я перевожу с виндового на монгольский для дельфы и на корейский обратно. Но, почти всё работает отлично - без глюков для пользователя, за исключением одной фигни. Что я делаю не так?

Описание фигни. Есть глюк, когда я создал два окна. Максимизирую второе созданное, оно активно. Переключаю на первое. Минимизирую первое. Второе нормализуется. Теперь максимизирую второе и переключаюсь. Когда я проделываю это с VCL, то в менюхе справа уже не три кнопки для окон, а шесть. Если все окна закрыть, то три кнопы останется. На каком шаге рюхается - непойму.

Читайте также: