Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.047 c
15-1162731090
Palladin
2006-11-05 15:51
2006.11.26
Аналог Орешника


2-1163066744
sunlo
2006-11-09 13:05
2006.11.26
Горизонтальные границы TMemo.


15-1162673233
ProgRAMmer Dimonych
2006-11-04 23:47
2006.11.26
Дайте адреса дл FTP-серверов


2-1163159929
АмеГа
2006-11-10 14:58
2006.11.26
Диалог


15-1163017615
alex-drob
2006-11-08 23:26
2006.11.26
Простая сеть + WiFi не могу настроить





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский