Форум: "Начинающим";
Текущий архив: 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;
Я пытался восстанавливать эти значения при активации формы...
(Значение 25Screen.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
← →
Juju (2006-11-06 20:24) [41]
> Anatoly Podgoretsky © (05.11.06 15:02) [35]
> Странно, а я вот не использую ни EhLib, ни RxLib и как то не тронулся.
EhLib
- Ну например скроллинг в DBGrid колесом мыши. Не скролируеться...
- Скроллинг в DBLookupComboBox...
> Loginov Dmitry © (05.11.06 17:29) [36]
> Страдание херней. Нет бы делом заняться.
Полностью тебя поддерживаю, но заказчик с такими мухами, я не могу диктовать ему ничего т.к. у него один аргумент - Я ТАК ХОЧУ!
← →
Anatoly Podgoretsky © (2006-11-06 23:27) [42]> Juju (06.11.2006 20:24:41) [41]
> я не могу диктовать ему ничего т.к. у него один аргумент - Я ТАК ХОЧУ!
Если у него есть деньги на это хочу, то почему бы и не постараться
← →
Juju (2006-11-07 00:01) [43]К сожалению история длинная... но факт в том, что с родственниками и их знакомыми лучше не связываться (особенно когда присутствует вопрос денег).
Сначала нужна программка которая складывает 2 плюс 3, а через некоторое время, когда пора платить - тестируеться и уже неплохо было бы чтобы 2-ки были синего цвета, (вроде ничего принципиально не поменялось...), потом здорово было бы чтобы и 3-ки были оранжевого цвета (вроде опять ничего принципиально не поменялось...), через день 2-ки должны вылетать по клавише "M", 3-ки по "N"... короче и так далее.
Цену поднимать вроде оснований нет, а работы с каждым днем все больше и больше...
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.039 c