Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение расположения форм [D7, XP]


Страницы:   1 2 3

Juju ©   (2006-11-04 10:34:00) 

Задача:
Необходимо сохранять расположение окон программы на экране при последующих загрузках.
Возможные решения:
1) Сохранять значения Top и Left при закрытии формы в реестре Windows, при этом проверяя, чтобы Top и Left находились в области экрана.
2) Сохранять значения Top и Left при закрытии формы в ini-файле, при этом проверяя, чтобы Top и Left находились в области экрана.
3) На каждую форму повесить FormStorage (компонент из библиотеки RXLibrary), а при активации формы проверять, чтобы Top и Left находились в области экрана.
Вопрос:
Какой из возможных решений самый оптимальный или может есть другие решения?


Juju   (2006-11-07 00:01:00) [1]

К сожалению история длинная... но факт в том, что с родственниками и их знакомыми лучше не связываться (особенно когда присутствует вопрос денег).

Сначала нужна программка которая складывает 2 плюс 3, а через некоторое время, когда пора платить - тестируеться и уже неплохо было бы чтобы 2-ки были синего цвета, (вроде ничего принципиально не поменялось...), потом здорово было бы чтобы и 3-ки были оранжевого цвета (вроде опять ничего принципиально не поменялось...), через день 2-ки должны вылетать по клавише "M", 3-ки по "N"... короче и так далее.

Цену поднимать вроде оснований нет, а работы с каждым днем все больше и больше...


Anatoly Podgoretsky   (2006-11-06 23:27:00) [2]

> Juju  (06.11.2006 20:24:41)  [41]

> я не могу диктовать ему ничего т.к. у него один аргумент - Я ТАК ХОЧУ!

Если у него есть деньги на это хочу, то почему бы и не постараться


Juju   (2006-11-06 20:24:00) [3]


> Anatoly Podgoretsky ©   (05.11.06 15:02) [35]
> Странно, а я вот не использую ни EhLib, ни RxLib и как то не тронулся.

EhLib
- Ну например скроллинг в DBGrid колесом мыши. Не скролируеться...
- Скроллинг в DBLookupComboBox...

> Loginov Dmitry ©   (05.11.06 17:29) [36]
> Страдание херней. Нет бы делом заняться.

Полностью тебя поддерживаю, но заказчик с такими мухами, я не могу диктовать ему ничего т.к. у него один аргумент - Я ТАК ХОЧУ!


koha   (2006-11-05 20:46:00) [4]

> Juju   (04.11.06 10:34)
>  Необходимо сохранять расположение окон программы на экране при последующих загрузках.

Вот решение простое и верное:
создай структуру:
type
 RecPos = record
 // тут значения Top и Left : integer;
 end;

Затем в оброботчике формы onClose перепеши координаты окна в RecPos.Top:=Form.Top ... и загони через стрим в ini -файл.
При ввостановлении окна читаешь структуру из ini -файла и из структуры ввостанавливаешь состояния окна, тобишь обратное действие Form.Top:=RecPos.Top


RASkov   (2006-11-05 20:19:00) [5]

> [33] Anatoly Podgoretsky ©   (05.11.06 11:48)

Полностью согласен, но всякое бывает.... Если программа пишется только для себя, то здесь и нужно учитывать только свои действия, а так на всех не угодишь. По моему вариант [22], простой, без использования сторонних компанентов.
Сделать общую для всех форм процедуру и после создания формы ее вызывать, что-нибудь типа так

procedure SetValidFormPos(Frm: TForm; VisWidth: Integer=50);
begin
 if Frm.Left < - Frm.Width then Frm.Left := - Frm.Width+VisWidth else
  if Frm.Left > Screen.WorkAreaWidth then Frm.Left := Screen.WorkAreaWidth - VisWidth;
 if Frm.Top < - Frm.Height then Frm.Top := 0 else
  if Frm.Top > Screen.WorkAreaHeight then Frm.Top := Screen.WorkAreaHeight - VisWidth;
end;


Вызов что-нибудь так:

procedure TForm1.FormCreate();
begin
 if LoadPosFromIni then SetValidFormPos;
end;

function LoadPosFromIni: Boolean;
var FIni: TIniFile;
begin
 try
 ....
 Result:=FIni.ReadBoolean('Form'+FName, 'SavePos', False);
 if not Result then Exit;
 Left:=..
 .....
 finally FIni.Free; end;
end;

>Juju Разве не то, что надо? Это просто как вариант.
В реализации LoadPosFromIni считываются и присваиваются координаты Left и Top для формы (FName - какой нибудь строковой идентификатор формы, пусть даже может быть имя статич. форы).
Тут можно разных способов придумать, и не обязательно "суперсложных". ИМХО.


Anatoly Podgoretsky   (2006-11-05 20:12:00) [6]

> Leonid Troyanovsky  (05.11.2006 19:08:37)  [37]

Ой оказывается у меня есть такое :-)


Leonid Troyanovsky   (2006-11-05 19:08:00) [7]


> Juju   (05.11.06 14:10) [34]


http://podgoretsky.com/ftp/Language/nps/ru.delphi.html

Q-132: Как сохранить всю форму в файл (как Delphi в *.dfm)?

--
Regards, LVT.

PS. Только, ради Бога, без всяких экранных заграниц.


Loginov Dmitry   (2006-11-05 17:29:00) [8]

Juju   (05.11.06 14:10) [34]
Мне ко всему прочему необходимо в настройках программы предусмотреть пользовательское настраивание сохранения формы конкретно для каждого окна. 1) Расположение этой формы запоминать
2) Расположение этой формы не запоминать
3) Положение этой формы вернуть в первоначальный...


Страдание херней. Нет бы делом заняться.


Anatoly Podgoretsky   (2006-11-05 15:02:00) [9]

> Juju  (05.11.2006 14:10:34)  [34]

Странно, а я вот не использую ни EhLib, ни RxLib и как то не тронулся.


Juju   (2006-11-05 14:10:00) [10]

Loginov Dmitryто что FormStorage - это самый простой и почти безминингитный способ я понял, когда использовал ее в предыдущем варианте программы (когда к утру у пользователя должна была быть такая возможность).
Просто я думал, как лучше сделать без использования сторонних компонентов.
Например в библиотеке EhLib (которую я и так уже использую из-за DBGridEh), есть тоже (даже более расширенный! аналог FormStorage) PropStorageEh.

Мне ко всему прочему необходимо в настройках программы предусмотреть пользовательское настраивание сохранения формы конкретно для каждого окна. 1) Расположение этойформы запоминать
2) Расположение этойформы не запоминать
3) Положение этойформы вернуть в первоначальный...
Вот такое пожелание. Конечно чтобы не тронуться мозгами надо было использовать все-таки компоненты... но я чего-то начал уже писать руцями...


Anatoly Podgoretsky   (2006-11-05 11:48:00) [11]

> Это на всякий случай. А вдруг в инишке или реестре сделают типа Left
> = -1578 :)))

Так это руки оторвать и заставить вернуть обратно.


Gydvin   (2006-11-05 08:43:00) [12]


> Gydvin Вот я пытался целиком скрыть форму... не получилось!


ТО


>sniknik ©   (04.11.06 17:12) [15]
> вообще завести форму за край, так что будет не видно, можно,
>  например завести максимально за правый край, а после закрытия
> (сохранения координат) изменить разрешение экрана на меньшее.
>


Loginov Dmitry   (2006-11-05 08:21:00) [13]

Имелось ввиду [0] -> 3 :))


Loginov Dmitry   (2006-11-05 08:20:00) [14]

Juju   (04.11.06 10:34)


[3]

Проверка в любом случае необходима. А использование FormStorage - самый простой способ чтобы добиться результата.


Германн   (2006-11-05 01:52:00) [15]

Добавлю.
Мой пост Германн ©   (05.11.06 01:48) [28]
не ответ на Anatoly Podgoretsky ©   (05.11.06 00:47) [25], а общее замечание о сабже.


Германн   (2006-11-05 01:48:00) [16]


> Anatoly Podgoretsky ©   (05.11.06 00:47) [25]
>
> Можно пойти на компромис с совестью и пользователем, если
> слишком глубоко задвинуто, то выдвигать кусочек пикселя
> на 32, только оно нафиг нужно, проводить расчеты, перемещать,
>  куда пользователь поместил туда и тебе помещать, а то на
> роль бога претендуешь.
>

И можно, и сложно. И не совсем понятен смысл сабжа.
Если сее множество окон должнобыть показано при старте программы, то, имхо стоит иметь где-то в меню пункты, которые определяют "наличие показа" конкретного окна. Имхо.


RASkov   (2006-11-05 01:42:00) [17]

> чтоб подальше от краев?

наоборот, чтобы краешек формы шириной(высотой) равной 50 был.
Т.е. что бы форму было видно если чё не так :)


RASkov   (2006-11-05 01:36:00) [18]

> [24] Juju   (04.11.06 23:48)
> такого добиться трудно...

Это на всякий случай. А вдруг в инишке или реестре сделают типа Left = -1578 :)))

> а 50 - это что-то осмысленное или

или... вообщем никакого смысла кроме показать "краешек"


Anatoly Podgoretsky   (2006-11-05 00:47:00) [19]

Можно пойти на компромис с совестью и пользователем, если слишком глубоко задвинуто, то выдвигать кусочек пикселя на 32, только оно нафиг нужно, проводить расчеты, перемещать, куда пользователь поместил туда и тебе помещать, а то на роль бога претендуешь.


Juju   (2006-11-04 23:48:00) [20]

GydvinВот я пытался целикомскрыть форму... не получилось! Все равно какой-то кусочек остается.
Может он понадобиться пользователю?! А то как начнет автора проклинать! :)
RASkov Form1.Left < - Form1.Widthтакого добиться трудно... ну пусть теоритически можно... а 50- это что-то осмысленное или так просто, чтоб подальше от краев?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо