|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.12.2015, 13:04 | #1 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Запоминание/восстановление размеров и статуса окна при запуске/закрытии программы
Здравствуйте, уважаемые.
Не сложно найти в интернете как при закрытии сохранить в ini, а при открытии восстановить размеры окна. Не сложно предположить, что так же можно запомнить и статус окна, записав в ini переменную, отвечающую за WindowState. И то ли никто в результате не пользуется в полном объёме этим, то ли ещё что, но нигде я не нашёл как бороться с одним косяком. Если при работе с программой форму развернуть, а потом свернуть - она примет предыдущие размеры и положение. Однако если при развёрнутом виде форму закрыть с записью размеров и положения - запишутся значения, соответствующие максимальному размеру окна и верхней левой его позиции. Соответственно, если после запуска окно свернуть - оно не примет те размеры и положение, которые были перед разворачиванием, а останется в углу и максимальным. Может, кто-нибудь знает как с этим бороться? Пробовал запоминать размеры через CanResize и Resize. Казалось бы логичным: перед изменением размера сохранил предыдущие, и если после изменения изменился статус на Maximized, то записываем предыдущие. Но не тут то было. Для проверки работы этой связки повесил ShowMessage в оба события, который показывал при каком событии вывелось сообщение, ширина и статус окна. В результате получилось, чот при максимизации из нормального состояния происходит ШЕСТЬ событий!! Вот что выводил ShowMessage при каждом появлении: Событие (CR - CanResize; R - Resize)/Размер окна (N - нормальный; M - максимальный)/WindowState (N - wsNormal; M - wsMaximized) 1. CR/N/N 2. CR/M/N 3. R/M/N 4. CR/M/M 5. R/M/M 6. CR/M/M Т.е. программа сначала изменяет размер, создавая и финальное onResize, и только потом уже с этими размерами меняет статус окна. Получается, логично приходящий в голову способ нежизнеспособен. Зачем под конец она снова создаёт CR - вообще для меня загадка. Единственный вариант, который позволяет более-менее нормально восстанавливать/разворачивать и после закрытия, у меня получился вот такой: Код:
Встречающийся в просторах интернета вариант "повесить" запоминание размеров на Destroy не подходит, т.к. при этом не срабатывает строка, в которой окно возвращается в нормальное состояние. Косяк этого варианта: перед закрытием видно, как форма нормализуется. И ещё она не воспринимает запоминание состояния если её закрыть в минимизированном виде. |
17.12.2015, 13:27 | #2 |
Форумчанин
Регистрация: 29.10.2015
Сообщений: 273
|
|
17.12.2015, 14:20 | #3 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
У меня такое вроде работает:
Код:
Код:
E-Mail: arigato.freelance@gmail.com
Последний раз редактировалось Arigato; 17.12.2015 в 14:28. |
17.12.2015, 18:35 | #4 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Arigato, хм, у меня, вроде, тоже работает. Разница с тем подходом, который я пытался неудачно осуществить, лишь в
Код:
|
17.12.2015, 18:39 | #5 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Не уверен, потому и написал, что вроде работает. Но на двух разных компах с двумя разными ОС сработало. Так что думаю проблем не будет.
E-Mail: arigato.freelance@gmail.com
|
17.12.2015, 19:37 | #6 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если форма закрывалась максимизированной можно просто исходные размеры зафиксированные на этапе проектирования юзать. Или кровь из носу те, что юзер в последний раз использовал?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
18.12.2015, 10:47 | #7 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Ну размеры этапа проектирования у меня и так почти всегда по умолчанию (за исключением случаев окна по центру). В этот раз нужны именно последние пользовательские. Если нет менее навороченного, чем у Filka и менее условного, чем у Arigato, то вариант Arigato вполне нормален, вроде. Если ещё добавить в FormClose условие "если форма раскрыта и её верхний левый угол меньше нулей, то свернись", то, наверное, это обезопасит и от тех случаев, когда форма, разворачиваясь, всё-таки не заходит за края. Теоретически...
|
18.12.2015, 15:45 | #8 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,774
|
Есть системная функция GetWindowPlacement или как-то так. Нужно сохранять то, что она возвращает. Для восстановления SetWindowPlacement.
|
18.12.2015, 16:01 | #9 |
Форумчанин
Регистрация: 29.10.2015
Сообщений: 273
|
|
18.12.2015, 16:27 | #10 |
Форумчанин
Регистрация: 10.02.2014
Сообщений: 526
|
Filka )) разбираться в чужих компонентах не проще, чем в функции GetWindowPlacement и её параметрах.
Vapaamies, Filka как раз на этот способ и кинул ссылку во втором посте. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Открытие инфо-окна при запуске программы (Delphi) | signalrunners | Помощь студентам | 5 | 16.12.2012 16:57 |
Моментальное закрытие окна при запуске программы | tangopanka | Общие вопросы C/C++ | 2 | 10.10.2011 09:32 |
Выполнить код при закрытии окна просмотра | segail | Microsoft Office Excel | 7 | 08.02.2010 11:22 |
Confirm при закрытии активного окна | Jensi | JavaScript, Ajax | 4 | 17.08.2009 19:06 |
Текст при изменении размеров окна | Dj_smart | HTML и CSS | 2 | 25.11.2008 23:23 |