:: Visual Foxpro, Foxpro for DOS
Сохранение состояния формы
ZenTigra

Сообщений: 514
Дата регистрации: 03.12.2004
Возникла необходимость сохранят состояние формы, ведь всем пользователям не угодишь...
Например, на форме есть Grid, нужно предоставить пользователям самим настраивать в каком порядке размещать колонки, и какие из них отображать.
Или выбор по умолчанию какой из Option1 должен быть активным в Optiongroup1 и т.п.
Сейчас пробую, но что-то не очень нравиться. Не могу ничего придумать универсального, чтоб подходило к разным формам.
Хочется эти настройки сохранять в таблице, для КАЖДОГО пользователя.

Вопрос чисто теоретически, посоветуйте как это лучше реализовать?

И где лучше разместить кнопку или меню, для сохранение/восстановления состояния формы.
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
lulgu
Автор

Сообщений: 1838
Дата регистрации: 30.11.2016
Лучше всего сохранять такие данные поименно в ini-файле, примеры легко найти.
Кнопки не нужны, сохранение параметров выполняется в Destroy формы, их восстановление в Init.
Если нужно универсальное решение, то проще для размещения этих кодов создать класс Custom, который добавляется на форму.
Сохранение данных в таблице или др. отличается только кодами вызова.
Другие способы работы с пересчетом объектов обычно громоздки.
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Полезные места для сохранения ГДЕ:
GETENV("AppData") = 'C:\users\user\AppData\Roaming' - в XP - users\user\Application Data
GETENV("ALLUSERSPROFILE") = 'C:\ProgramData' - в XP - users\All Users
GETENV("ProgramData") = 'C:\ProgramData' - в XP - пусто
GETENV("PUBLIC") = 'C:\users\PUBLIC' - в XP - пусто
GETENV('HOMEDRIVE')+GETENV('HOMEPATH') = 'C:\users\user'

Сохранить ЧТО:
- можно отметить обьекты на форме, координаты которых хочется сохранить, например, непустым свойство Tag (и сделать подпрограмму-обходчик всех обьектов, включая вложенные, в поиске таких обьектов и сохранении их координат)
- или завести подпрограмму Сохранить(обьект-форма, имя_на_форме, имя_свойства), и форма (при уничтожении) пусть сама вызывает подпрограмму нужное кол. раз, и при старте восстанавливает
...
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
У меня для грида сделано так:

1. Табличка с гридамИ для юзеров проги

CREATE TABLE [Схема].[MetaGrid](
[cID] [varchar](254) NOT NULL, -- "путь к гриду" MyForm.MyPageFrame1.MyPage1.Grid6
[nColumn] [int] NOT NULL, -- номер колонки
[nWidth] [decimal](14, 4) NOT NULL, -- ширина
[IsVisible] [bit] NOT NULL, -- видимость - рудимент, заменено правом Visible
[nColumnOrder] [int] NOT NULL, -- порядковый номер
[Users_ID] [int] NOT NULL, -- юзер для которого сохранён грид
[IsEditInGrid] [bit] NULL, -- признак редактирования - рудимент, заменено правом ред.
CONSTRAINT [PK_MetaGrid] PRIMARY KEY CLUSTERED
(
[cID] ASC,
[nColumn] ASC,
[Users_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [Схема].[MetaGrid] WITH CHECK ADD CONSTRAINT [FK_MetaGrid_Users] FOREIGN KEY([Users_ID])
REFERENCES [Схема].[Users] ([UserId])
GO

2. В Grid.Init:
- получаем "путь" относительно формы
- на основании "пути" вынимаем из таблички колонки грида, вызываем ХП
- расставляем их ширину, ColumnOrder

3. В Grid.Destroy:
- проходим по гриду, формируем временный курсор настроек
- в ХП передаём курсор настроек, сохраняем грид в табличке


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
я как-то привык такие настройки сохранять в реестре ... проблем нету, правда я не сохраняю положение отдельных контролов на форме - не было нужды как-то. Вот ширина/порядок/сортировка для грида - да, вполне себе сохраняю в виде четырех строк в реестре - один раз прописал в классе грида - и пользую ))), а также положение и размер формочек ну и прочие параметры по необходимости - и все разумеется без всяких вопросов юзверю - при закрытии сохраняется, при ините - восстанавливаю.

В реестр обычно пишу в ветку - HKEY_CURRENT_USER\ИМЯ_ПРИЛОЖЕНИЯ\ИМЯ_ФОРМЫ - проблем с правами на запись не возникало ни у кого
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не пробовал в реестре сохранять (боюсь этой Виндовс-махины для сохранения моей разной ерунды). Если на удаленном столе выполняется прога, то какой эффект имеет "сохранение в реестре"? Сохраняется ли после перезапуска удаленного рабочего стола (сохраняется скорее всего, но, чтобы не пробовать, - это ответ "да"?)
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
сохраняется все ))) причем для того юзверя под которым в систему (винду) вошли - ветка то - HKEY_CURRENT_USER
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
AndyNigmatec
сохраняется все ))) причем для того юзверя под которым в систему (винду) вошли - ветка то - HKEY_CURRENT_USER

А если с другого рабочего места вошел? Не, не годится!


------------------
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
Sawradym
А если с другого рабочего места вошел? Не, не годится!
- я же говорю - все зависит от потребности задачи, у меня не было необходимости такие настройки строго под пользователя проги хранить/подгружать - если непременно нужно именно это - то тады сие в базе сохранять нужно, типа как PaulWist выше написал
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
2 ф-ии для сохранения - чтения на стороне клиента, кот. сам пользуюсь
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
ZenTigra

Сообщений: 514
Дата регистрации: 03.12.2004
Именно, практика показала, что нужны настройки под каждого пользователя или (группы пользователей).
Автоматическое сохранение настроек также не вариант, не всегда это нужно. И есть необходимость восстановление состояние формы в первоначальное состояние.

Сейчас у меня реализовано сохранение настроек на каждом компьютере, а это неудобно, так как приходиться настраивать каждое рабочее место.
Тому решил улучшить эту функцию.
Первое - это сделать новую структуру для сохранения настроек, и сохранять ее на сервере.

Сама структуру таблиц еще в процессе (вот некоторые поля)
Главная таблица
Key - уникальный номер
Form - имя формы
User - Код пользователя/группы пользователей
BackColor - цвет формы (да есть такие кадры, которые просят индивидуальный цвет для формы)
и т.п. (размер формы, положение...)

И настройки для объектов которые размещены на форме (думаю будут две таблицы одна для настройки Grid-ов вторая для объектов Check, Optiongroup...)
Key - для связи с главной формой
Clas - вид объекта (Grid, Combo и т.п.)
Name - имя объекта
Value- состояние объекта (Check, Optiongroup и т.п.)
Order- положение поля (для Grid)
Width- размер поля (для Grid)
Visible - отображать объекта (для Grid)

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

А можно ли изменить вот это меню, добавив туда парочку своих пунктов

[attachment 29114 Menu2.png]



Исправлено 2 раз(а). Последнее : ZenTigra, 11.03.18 11:07
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Sawradym
А если с другого рабочего места вошел? Не, не годится!
Это да, настроил всё себе под 1920*1080, потом зашёл со старенькой машинки где монитор больше 800*600 не тянет - кака печаль, не развернуло формы/гриды на 4 таких экрана... Впрочем, для любителей всего странного есть в винде Roaming profiles - в т.ч. раздел реестра HKEY_CURRENT_USER "путешествует" за юзером.

AndyNigmatec
В реестр обычно пишу в ветку - HKEY_CURRENT_USER\ИМЯ_ПРИЛОЖЕНИЯ\ИМЯ_ФОРМЫ
Надеюсь всё же что на самом деле в HKEY_CURRENT_USER\Software\ИМЯ_ПРИЛОЖЕНИЯ\...
У нас в старые времена путь сохранения был
HKEY_CURRENT_USER\Software\Имя_компании\ИМЯ_ПРИЛОЖЕНИЯ\1.0\ - т.е. в именем конторы и номером версии (хотя история показывает что "номер версии" это практически ненужная предосторожность - он реально не меняется)
внутри ветки Layout\Windows, Layout\Grids - а там уже REG_BINARY значения под именами типа frmSome.pgfMain.pagClient.grd.Column1
Сейчас, впрочем, я бы не стал в реестре это хранить.

ZenTigra
И есть необходимость восстановление состояние формы в первоначальное состояние.
Да, это нужно, и это реализовано (удалить ветку реестра, или набор значений по шаблону не составляет труда - после этого первый запуск проходит с настройками "как разраб задал"). Так же эксопрт/импорт делается (тривиальным батником с reg export/import делается) - на случай переустановок, или того же "переноса" настроек от одного пользователя другому.

Ничего кроме размера/положения/состояния форм, размера/состояния/порядка колонок грида, в отдельных случаях положения splitter-а не сохранялось. Т.к. вообще-то всё прочее НЕ является "параметрами визуального отображения". Цвета - было дело, но там скорее к бизнес-значениям это относилось (как покрасить "просроченное", а как "неполные/некорректные данные"), а не тупо "цвет кнопок".
Какие ещё "переключатели"? Это ж, очевидно, какой-то фильтр - а значит по сути "условия фильтра". Не следует это мешать с визуальными параметрами. Если очень нужно, можно делать "именованные пресеты/наборы настроек фильтра". Заморачиваться с их разделением между разными пользователями я бы не стал. Только хранить в настройках пользователя "последний использованный набор для такой-то формы/отчёта". Естественно, параметры должны хранится исходя из их бизнес-смысла, а никак не имён текстбоксов/спиннеров/комбобоксов где эти данные вводятся. И да, код вычитывания и "применения" набора к конкретной форме с её контролами НЕ будет универсальным (да и не должен быть).
ZenTigra
А можно ли изменить вот это меню, добавив туда парочку своих пунктов
Можно (через АПИ), но не нужно. 90% юзеров про системное меню не в курсе, да и не очень это удобно. Проще пункт обычного "главного меню", или кнопку на тулбаре...

Да, у нас тоже визуальное расположение запоминалось автоматом, никаких кнопок "запомнить", "прочитать и применить" не было. Хотя вариант типа закрытия формы с зажатым Shift - чтобы конкретно в этот раз ничего НЕ записывалось - имеет право на жизнь. Лишние кнопки - нет, они лишние


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
AndyNigmatec

Сообщений: 1552
Откуда: Волгоград
Дата регистрации: 28.06.2015
Igor Korolyov
Надеюсь всё же что на самом деле в HKEY_CURRENT_USER\Software\ИМЯ_ПРИЛОЖЕНИЯ\...
- да именно так - просто по по памяти набросал ... подводит зараза )))


Исправлено 1 раз(а). Последнее : AndyNigmatec, 11.03.18 20:05
Ratings: 0 negative/0 positive
Re: Сохранение состояния формы
lulgu
Автор

Сообщений: 1838
Дата регистрации: 30.11.2016
ZenTigra
Сама структуру таблиц еще в процессе (вот некоторые поля)
Главная таблица
Key - уникальный номер
Form - имя формы
User - Код пользователя/группы пользователей
BackColor - цвет формы (да есть такие кадры, которые просят индивидуальный цвет для формы)
и т.п. (размер формы, положение...)

И настройки для объектов которые размещены на форме (думаю будут две таблицы одна для настройки Grid-ов вторая для объектов Check, Optiongroup...)
Key - для связи с главной формой
Clas - вид объекта (Grid, Combo и т.п.)
Name - имя объекта
Value- состояние объекта (Check, Optiongroup и т.п.)
Order- положение поля (для Grid)
Width- размер поля (для Grid)
Visible - отображать объекта (для Grid)

И это все вместо пол-страницы кода.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика