Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение расположения окон, И варианты реализации... 
:(
    Опции темы
Juju
  Дата 4.11.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
Albinos_x
Дата 4.11.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



я бы использовал вариант 2


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Snowy
Дата 4.11.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Куда сохранять - это вопрос второй.
Можно в реестр, можно в файл, можно где-нить в памяти складывать, а сбрасывать в файл при выходе из программы.
Это как удобнее.
Основной вопрос, как это сделать более универсально.
Делаем форму, которая при уничтожении сохраняет данные, а при создании подгружает и проверяет на допустимость.
Проверка должна быть именно при подгрузке, т.к. параметры экрана могут отличаться от предыдущего запуска.
Сохранять нужно с привязкой к полю Name - чтобы формы не перепутались.
Сама форма нам не нужна. Нужен только класс.
И вот от этого класса уже пронаследовать все остальные формы.
Соответственно не нужно на них уже ничего кидать и писать отдельного кода или чего-то вызывать при уничтожении.
Обо всём этом уже позаботится форма-предок.
Причём переписать уже существующий проект легко - нужно только в объявлениях всех классов форм переписать
Код

class TForm1(TForm)
на
Код

class TForm1(TMyForm)

PM MAIL   Вверх
Juju
Дата 4.11.2006, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



У меня все формы создаються при загрузке и уничтожаються по закрытию:
На примере формы About (fmAbout)
Код

procedure TfmAbout.Burn;
begin
 fmAbout:=TfmAbout.Create(Application);
  try
   fmAbout.ShowModal;
  finally
   FreeAndNil(fmAbout);
  end;
end;

При закрытии формы я вызываю процедуру ...  
Код

procedure FormPositionRestore(Form: TForm);
begin
 if Form.Left < 0 then Form.Left := 0;
 if (Form.Left > Screen.Width - Form.Width) then Form.Left := Screen.Width - Form.Width;
 if Form.Top < 0 then Form.Top := 0;
 if (Form.Top > Screen.Height - Form.Height) then Form.Top := Screen.Height - Form.Height-25;
end;


Код

FormPositionRestore(fmAbout);

... потом записываю данные Top и Left в реестр Windows

А при активации формы я указываю значения Top и Left форме:
Код

//Reg_Top_About - значение Top, а Reg_Left_About - значение Left в реестре Windows.
fmAbout.Top := Reg_Top_About;
fmAbout.Left := Reg_Left_About;

Как этот вариант?
PM MAIL   Вверх
Snowy
Дата 4.11.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Про что я и говорю.
Один и тот же код во всех формах.
А проще было бы сделать одну форму, загнать этот код туда, а остальные просто пронаследовать.
Зачем дублировать один и тот же код, когда есть механизм наследования?!
И, как я уже написал, проверку на выход за пределы экрана нужно делать при восстановлении, а не при сохранении.
PM MAIL   Вверх
Sansa
Дата 4.11.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 18.10.2006
Где: Королев

Репутация: 3
Всего: 6



Не самый оптимальный способ, но показавшийся мне самым удобным:

В моих проектах практически всегда (кроме совсем мелких, с одной формой) присутствует TDataModule. На него я кидаю компонент TjvAppStorage (там несколько разновидностей - DB, Reg, Ini - каждый сохраняет в определенное место) из библиотеки JVCL. Настраиваю корневой путь (точнее, у меня обычно 2 стоража - один сохраняет в HKLM общие настройки приложения, второй в HKCU - пользовательские, такие как размер и местоположение форм, положение панелей инструментов и состав кнопок на них, ну и прочее, которое для каждого пользователя индивидуально).
Далее, создаем Custom форму проекта (по аналогии с TCustomForm), на которую уже помещается TjvFormPlacement, и в качестве AppStorage указываю тот Storage, который сохраняет в HKCU. Все остальные формы создаются наследованием от этой. 

В качестве преимуществ:
  •  Простота реализации;
  •  Единый механизм сохранения и восстановления данных в приложении;
  •  Легкость изменения как пути так и цели (реестр, файл, база данных) сохранения (очень удобно, если использовать куски проекта в других проектах);
  •  Компонент сохраняет настройки для каждого из разрешений экрана отдельно;
  •  Дополнительно получаем механизм сохранения настроек свойств компонентов (настраивается индивидуально);
  •  Может еще чего есть, но не так очевидно smile

--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
Juju
Дата 4.11.2006, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Snowy
Цитата
проверку на выход за пределы экрана нужно делать при восстановлении, а не при сохранении.
 прав на 100%.
Sansa Спасибо за пример. Дело в том - я стараюсь работать со стандартными компонентами... хотя jvcl мне уже кто-то настоятельно рекомендовал.
PM MAIL   Вверх
Bose
Дата 5.11.2006, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Juju,  TjvFormPlacement - это наследник от TrxFormPlacement. JVCL относительно недавно включили в свою коллекцию компоненты rxLib, доработанные и расширенные. 
К тому же, лицензия JVCL позволяет использовать эту библиотеку в коммерческих приложениях. 

Сравнивая варианты 3 и 4:
Цитата(Juju @  4.11.2006,  11:18 Найти цитируемый пост)
3) На каждую форму повесить FormStorage (компонент из библиотеки RXLibrary), а при активации формы проверять, чтобы Top и Left находились в области экрана.

Минус: этот компонент является полностью самостоятельным и имя ini файла придётся указывать в каждой копии(на каждой форме).

Цитата(Juju @  4.11.2006,  11:18 Найти цитируемый пост)
4) Использовать компоненты EhLib - PropStorageEh и RegPropStorageManEh (или IniPropStorageManEh) вешая их на каждую форму...

В Ehlibовском варианте, этот недостаток устранён. Там несколько PropStorageEh-ей прикрепляются к одному IniStorageManagerEh или RegStorageManagerEh-у, поэтому, если понадобится изменить название Ini-файла или ветки в реестре - достаточно будет изменить свойство в одном компоненте. У EhLiba есть одно преимущество перед всеми виденными мной компонентами для сохранения свойств: он позволяет корректно сохранять и восстанавливать данные для компонентов находящихся на фреймах.( ни TrxFormStorage ни TjvFormStorage этого не могут), но для тебя это неактуально. 
Из минусов EhLib неэстетично восстанавливает свойство WindowState для формы в максимизированном размере(для формы открывшейся в состоянии Maximized сначала выполняется Restore, а потом Maximize), но это лечится правкой исходника.

TjvFormStorage сочетает в себе сильные стороны обоих наборов(за исключением сохранения настроек компонентов на фреймах), более того, предоставляет несколько более красивых способов по управлению сохранением/загрузкой. 
PM MAIL WWW Skype   Вверх
Juju
Дата 5.11.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 26.10.2006

Репутация: 1
Всего: 1



Bose  Вот огромное спасибо за описание!
Тут появилась задача, что для каждой конкретной формы настройки по сохранению и восстановлению должны быть индивидуальны (чуть ли не до окна About) Форм в проекте около 30-ти (может чуть больше) ... а я уже руками начал делать... 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.