![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сохранение расположения форм [D7, XP]
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Вот я пытался целикомскрыть форму... не получилось! Все равно какой-то кусочек остается.
Может он понадобиться пользователю?! А то как начнет автора проклинать! :)
RASkovForm1.Left < - Form1.Widthтакого добиться трудно... ну пусть теоритически можно... а 50- это что-то осмысленное или так просто, чтоб подальше от краев?