Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.26;
Скачать: CL | DM;

Вниз

Сохранение расположения форм   Найти похожие ветки 

 
Juju   (2006-11-04 10:34) [0]

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


 
Anatoly Podgoretsky ©   (2006-11-04 10:55) [1]

4. Сохранять Top и Left при закрытии формы в реестре Windows, без какой либо проверки, восстанавливать также.


 
Shopot ©   (2006-11-04 11:29) [2]


> Anatoly Podgoretsky ©   (04.11.06 10:55) [1]


> Сохранять Top и Left при закрытии формы в реестре Windows


Ты на какой эхе сидишь? - "НАЧИНАЮЩИМ"

Пиши код. Или хотя бы ссылки на доки. Объясни что есть TRegistry, TIniFile,
TRegIniFile.


 
Anatoly Podgoretsky ©   (2006-11-04 11:40) [3]

> Shopot  (04.11.2006 11:29:02)  [2]

Это почему такая претензия, между прочим это модификация пункта 1
Поскольку анализ лишний и вредный.
И это по тематике конференции - упрощение сложного.


 
Percent   (2006-11-04 11:44) [4]

[2] Shopot ©   (04.11.06 11:29)
Пиши код.


http://lleo.aha.ru/na/


 
Anatoly Podgoretsky ©   (2006-11-04 11:52) [5]

Странное понимание предназначения форума, ты не перепутал с форумом работа?


 
Anatoly Podgoretsky ©   (2006-11-04 11:53) [6]

Что бы не быть головословным, вот выписка из правил

>  «Начинающим» (вспомогательная конференция. если вам трудно
> понять самим, что вам нужно или есть желание и способности
> помогать новичкам — вам сюда)

Не вижу требования писать код, может ты сам напишешь?


 
Shopot ©   (2006-11-04 12:29) [7]


> Anatoly Podgoretsky ©   (04.11.06 11:53) [6]


> Не вижу требования писать код, может ты сам напишешь?


А что мы уже в Америке живем, все должно быть по правилам?


 
Juju   (2006-11-04 12:30) [8]


> Anatoly Podgoretsky ©   (04.11.06 10:55) [1]
> > 4. Сохранять Top и Left при закрытии формы в реестре Windows,
>  без какой либо проверки, восстанавливать также.

Насторожило:без какой либо проверки, восстанавливать также.
А если перед закрытием формы пользователь умудриться завести ее за пределы экрана?

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;

Я пытался восстанавливать эти значения при активации формы...

(Значение 25 Screen.Height - Form.Height-25; взято мной приблизительно, чтобы форма находилась над Панелью задач.
Не хочу засорять тему дополнительными вопросами, но как определить какая по высоте Панель задач?


 
Shopot ©   (2006-11-04 12:32) [9]

Screen.Height


 
Juju   (2006-11-04 12:47) [10]

Shopot спасибо за ответ, но Screen.Height - это немного не то. Панель задач это такая полосочка (обычно) внизу экрана, на которой находиться кнопка "Пуск".


 
Percent   (2006-11-04 12:52) [11]

А если перед закрытием формы пользователь умудриться завести ее за пределы экрана?

Попробуй умудриться. Умудришься - я тебе код напишу.

Screen.Height - это немного не то

Screen.WorkArea<Left|Top|Width|Height>


 
Percent   (2006-11-04 12:55) [12]

А что мы уже в Америке живем, все должно быть по правилам?

Нет. Поэтому за требование кода можно получить нечто другое...


 
Орион ©   (2006-11-04 13:04) [13]


> [7] Shopot ©   (04.11.06 12:29)
> А что мы уже в Америке живем, все должно быть по правилам?

Мы живем в анархическом обществе?


 
Juju   (2006-11-04 16:54) [14]

Percent
За Screen.WorkArea - спасибо!
>Попробуй умудриться. Умудришься - я тебе код напишу.
Речь идет даже о частичном заведении формы за пределы экрана. Если при восстановлении половина окна видна, а половина нет - это же неправильно.


 
sniknik ©   (2006-11-04 17:12) [15]

> это же неправильно.
почему? если это желание пользователя... ну не нужна например вся форма для просмотра кому-то, достаточна одной цифры на ней, он ее упихнет так чтобы только ее и было видно... а оно у тебя "по умному" все переиначит.

вообще завести форму за край, так что будет не видно, можно, например завести максимально за правый край, а после закрытия (сохранения координат) изменить разрешение экрана на меньшее.
я на такие случаи делаю не проверку, а открытие с дефаултными координатами, при зажатых на открытии формы Ctrl+Shift например (комбинация меняется, вернее может меняться, но ее всегда оставляют как есть).


 
Juju   (2006-11-04 17:24) [16]

sniknik
К сожалению я работал с такими пользователями, которые не специально для дела, а с теми которые случайно так вышло! Поэтому мое "по умному" обосновано личным опытом.
А вот открытие формы по гарячей клавише с координатами по умолчанию - это мысль. Спасибо.


 
Anatoly Podgoretsky ©   (2006-11-04 17:59) [17]


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

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


 
Anatoly Podgoretsky ©   (2006-11-04 18:09) [18]

Надо вообще все формы восстанавливать по центру, поскольку не порядок, не там стоит и о боже не полностью на экране.


 
Gydvin ©   (2006-11-04 18:53) [19]


> И пользователь проклиная автора будет опять уводить на свое
> место.
>

Проверять на полное скрытие формы за краем


 
Gydvin ©   (2006-11-04 18:56) [20]


> Пиши код. Или хотя бы ссылки на доки. Объясни что есть TRegistry,
>  TIniFile,
> TRegIniFile.

Не было просьбы "объяснить"


 
Juju   (2006-11-04 20:01) [21]

Anatoly Podgoretsky - Ваше мнение мне понятно, спасибо.
Gydvin - и какую величину брать за максимально возможное скрытие за краем? Окончание табличных данных или компонентов несущих какую-либо смысловую нагрузку или минимально допустимую, чтобы еще смочь мышкой передвинуть?
Тут скорее всего правильное решение оставить за пользователем выбор где в конце-концов должна находиться форма, а для "эмердженси" случаев - горячая клавиша, которая восстановит окно по poScreenCenter.


 
RASkov   (2006-11-04 20:13) [22]

Сохранить куда либо без проверок Top и Left
Считать от туда(куда сохранили) и затем проверка:

if Form1.Left < - Form1.Width then Form1.Left := - Form1.Width+50 else
 if Form1.Left > Screen.WorkAreaWidth then Form1.Left := Screen.WorkAreaWidth - 50;
if Form1.Top < - Form1.Height then Form1.Top := 0 else
 if Form1.Top > Screen.WorkAreaHeight then Form1.Top := Screen.WorkAreaHeight - 50;


 
Gydvin ©   (2006-11-04 21:15) [23]


> Juju   (04.11.06 20:01) [21]

Я имел в виду - если форма целиком скрывается за краем, то приследующей загрузки возвращать на центр, если НЕ целиком - оставлять как есть


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

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


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

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


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

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

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

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

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


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

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

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


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


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

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


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

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


 
Loginov Dmitry ©   (2006-11-05 08:20) [30]

Juju   (04.11.06 10:34)


[3]

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


 
Loginov Dmitry ©   (2006-11-05 08:21) [31]

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


 
Gydvin ©   (2006-11-05 08:43) [32]


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


ТО


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


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

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

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


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

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

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


 
Anatoly Podgoretsky ©   (2006-11-05 15:02) [35]

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

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


 
Loginov Dmitry ©   (2006-11-05 17:29) [36]

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


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


 
Leonid Troyanovsky ©   (2006-11-05 19:08) [37]


> Juju   (05.11.06 14:10) [34]


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

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

--
Regards, LVT.

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


 
Anatoly Podgoretsky ©   (2006-11-05 20:12) [38]

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

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


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

> [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 - какой нибудь строковой идентификатор формы, пусть даже может быть имя статич. форы).
Тут можно разных способов придумать, и не обязательно "суперсложных". ИМХО.


 
koha ©   (2006-11-05 20:46) [40]

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

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

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



Страницы: 1 2 вся ветка

Текущий архив: 2006.11.26;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.058 c
15-1162993960
@!!!ex
2006-11-08 16:52
2006.11.26
Read Only. :((


2-1162985555
Raekon
2006-11-08 14:32
2006.11.26
Проблема с Type


15-1162996638
oldman
2006-11-08 17:37
2006.11.26
Первая пятилетка прошла успешно!


2-1162921686
EkZot
2006-11-07 20:48
2006.11.26
Существует ли папка.


3-1159010897
Mate
2006-09-23 15:28
2006.11.26
Как сохранить (или конвертировать) базу с Unicod ом в формате Acc