![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: 1 Всего: 1 |
Чуть больше года назад подобная тема уже поднималась на форуме. Может у кого возникли приоритетные аргументы по решению вопроса...
Задача: Необходимо сохранять расположение окон программы на экране при последующих загрузках (только расположение! сохранять настройки остальных компонентов необязательно!) Возможные решения: 1) Сохранять значения Top и Left при закрытии формы в реестре Windows, при этом проверяя, чтобы Top и Left находились в области экрана. И, соответственно при создании формы - восстанавливать настройки. 2) Сохранять значения Top и Left при закрытии формы в ini-файле, при этом проверяя, чтобы Top и Left находились в области экрана. И, соответственно при создании формы - восстанавливать настройки. 3) На каждую форму повесить FormStorage (компонент из библиотеки RXLibrary), а при активации формы проверять, чтобы Top и Left находились в области экрана. 4) Использовать компоненты EhLib - PropStorageEh и RegPropStorageManEh (или IniPropStorageManEh) вешая их на каждую форму... Вопрос: Какой из возможных решений самый оптимальный или может есть другие решения? Это сообщение отредактировал(а) Juju - 4.11.2006, 11:22 |
|||
|
||||
| Albinos_x |
|
|||
![]() Evil Skynet ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3288 Регистрация: 28.5.2004 Где: X-6120400 Y-1 4624650 Репутация: 26 Всего: 108 |
я бы использовал вариант 2
-------------------- "Кто владеет информацией, тот владеет миром" Уинстон Черчилль |
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Куда сохранять - это вопрос второй.
Можно в реестр, можно в файл, можно где-нить в памяти складывать, а сбрасывать в файл при выходе из программы. Это как удобнее. Основной вопрос, как это сделать более универсально. Делаем форму, которая при уничтожении сохраняет данные, а при создании подгружает и проверяет на допустимость. Проверка должна быть именно при подгрузке, т.к. параметры экрана могут отличаться от предыдущего запуска. Сохранять нужно с привязкой к полю Name - чтобы формы не перепутались. Сама форма нам не нужна. Нужен только класс. И вот от этого класса уже пронаследовать все остальные формы. Соответственно не нужно на них уже ничего кидать и писать отдельного кода или чего-то вызывать при уничтожении. Обо всём этом уже позаботится форма-предок. Причём переписать уже существующий проект легко - нужно только в объявлениях всех классов форм переписать
|
||||
|
|||||
| Juju |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: 1 Всего: 1 |
У меня все формы создаються при загрузке и уничтожаються по закрытию:
На примере формы About (fmAbout)
При закрытии формы я вызываю процедуру ...
... потом записываю данные Top и Left в реестр Windows А при активации формы я указываю значения Top и Left форме:
Как этот вариант? |
||||||||
|
|||||||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Про что я и говорю.
Один и тот же код во всех формах. А проще было бы сделать одну форму, загнать этот код туда, а остальные просто пронаследовать. Зачем дублировать один и тот же код, когда есть механизм наследования?! И, как я уже написал, проверку на выход за пределы экрана нужно делать при восстановлении, а не при сохранении. |
|||
|
||||
| Sansa |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 18.10.2006 Где: Королев Репутация: 3 Всего: 6 |
Не самый оптимальный способ, но показавшийся мне самым удобным:
В моих проектах практически всегда (кроме совсем мелких, с одной формой) присутствует TDataModule. На него я кидаю компонент TjvAppStorage (там несколько разновидностей - DB, Reg, Ini - каждый сохраняет в определенное место) из библиотеки JVCL. Настраиваю корневой путь (точнее, у меня обычно 2 стоража - один сохраняет в HKLM общие настройки приложения, второй в HKCU - пользовательские, такие как размер и местоположение форм, положение панелей инструментов и состав кнопок на них, ну и прочее, которое для каждого пользователя индивидуально). Далее, создаем Custom форму проекта (по аналогии с TCustomForm), на которую уже помещается TjvFormPlacement, и в качестве AppStorage указываю тот Storage, который сохраняет в HKCU. Все остальные формы создаются наследованием от этой. В качестве преимуществ:
--------------------
- Здравствуйте, я Ваш патологоанатом |
|||
|
||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: 1 Всего: 1 |
Snowy
Sansa Спасибо за пример. Дело в том - я стараюсь работать со стандартными компонентами... хотя jvcl мне уже кто-то настоятельно рекомендовал. |
|||
|
||||
| Bose |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1458 Регистрация: 5.3.2005 Где: Riga, Latvia Репутация: 23 Всего: 51 |
Juju, TjvFormPlacement - это наследник от TrxFormPlacement. JVCL относительно недавно включили в свою коллекцию компоненты rxLib, доработанные и расширенные.
К тому же, лицензия JVCL позволяет использовать эту библиотеку в коммерческих приложениях. Сравнивая варианты 3 и 4:
Минус: этот компонент является полностью самостоятельным и имя ini файла придётся указывать в каждой копии(на каждой форме).
В Ehlibовском варианте, этот недостаток устранён. Там несколько PropStorageEh-ей прикрепляются к одному IniStorageManagerEh или RegStorageManagerEh-у, поэтому, если понадобится изменить название Ini-файла или ветки в реестре - достаточно будет изменить свойство в одном компоненте. У EhLiba есть одно преимущество перед всеми виденными мной компонентами для сохранения свойств: он позволяет корректно сохранять и восстанавливать данные для компонентов находящихся на фреймах.( ни TrxFormStorage ни TjvFormStorage этого не могут), но для тебя это неактуально. Из минусов EhLib неэстетично восстанавливает свойство WindowState для формы в максимизированном размере(для формы открывшейся в состоянии Maximized сначала выполняется Restore, а потом Maximize), но это лечится правкой исходника. TjvFormStorage сочетает в себе сильные стороны обоих наборов(за исключением сохранения настроек компонентов на фреймах), более того, предоставляет несколько более красивых способов по управлению сохранением/загрузкой. |
||||
|
|||||
| Juju |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 26.10.2006 Репутация: 1 Всего: 1 |
Bose Вот огромное спасибо за описание!
Тут появилась задача, что для каждой конкретной формы настройки по сохранению и восстановлению должны быть индивидуальны (чуть ли не до окна About) Форм в проекте около 30-ти (может чуть больше) ... а я уже руками начал делать... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |