powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запомнить и восстановить "последнее" состояние Гридов
21 сообщений из 21, страница 1 из 1
Запомнить и восстановить "последнее" состояние Гридов
    #36558177
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги!

На форме пейджфрейм.
На каждой его странице множество Гридов, в которых отображаются соответствующие СВЯЗАННЫЕ таблицы.
Каждая из таблиц имеет "ключ" по которому можно ОДНОЗНАЧНО идентифицировать ту или иную запись.
Понятно, что при выходе из указанной формы либо при закрытии всей программы, можно запомнить текущие значения всех "ключей".

Вопрос: как при запуске программы либо при повторном запуске указанной формы сделать так, чтобы указатели записей восстановились и эти записи подсветились, то есть восстановилось ПОСЛЕДНЕЕ состояние Гридов?
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36558208
UAP,
запомнить номера записей в каждой таблице и встать на них перед показом.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36558433
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAP,

Встать на запись - Locate по первичному ключу.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36559047
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги!
Спасибо за желание помочь.
Но.
Я сейчас пробую реализовать рекомендации.
Пока не получается.
Очень мудреная форма.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36559271
FAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAP,
Самый простой способ для случая, когда таблицы в гридах связаны.

1. Запоминаешь только значения самой главной таблицы.
2. select 'Главная таблица'
3. Locate for RecnoID = 'Запомненное заначение'
4. И дальше - ГлавныйГрид.AfterRowColChange()

Предварительно пропиши в этом событии код, который вызовет обновление зависимых гридов следующего уровня. Те, в свою очередь - более нижнего уровня.. Получается такое веерное срабанывание. Причем ты запоминаешь только вершину этого дерева.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36559398
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый FAM !

Вы очень точно описали ситуацию.

Но.

У материнской записи может быть M дочерних.
Высветить их все в дочернем Гриде просто.
Проблема в том, что нужно в дочернем Гриде установить указатель на записи
с ключем равным N, где 1<=N<=M
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36559428
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый FAM !

Тут есть еще некоторые тонкости.
Вообще, в задаче 5 Гридов (хотя, какая разница сколько).
1<2<3<4<5
Значек < обозначает, что таблица 1 материнская (один), а таблица 2 дочерняя (ко многим).
Остальные пары - аналогично.
Тонкость в том, что в ДатаЭнвиронмент я повторно добавляю таблицу 3.
При этом VFP автоматически присваивает ей алиас 31.
Зачем я это делаю?
Дело в том, что есть еше связь 1<3 (минуя таблицу2).
При этом, 3 и 31 это одна и та же повторно открываемая таблица, у которой кроме первичного ключа есть еще два указателя на материнскую запись из 1 и из 2.
При клике на Гриде таблицы 1 в Гриде таблицы 2 появляютя дочерние записи, а в Гриде таблицы 3 меняется РекордСоурсе на 31 и появляются дочерние записи таблицы 1.
При клике на Гриде таблицы 1 в Гриде таблицы 2 появляютя дочерние записи, при клике в Гриде 2, в Гриде таблицы 3 меняется РекордСоурсе на 3 и появляются дочерние записи таблицы 2.
Гриды 3, 4, 5 - обычные.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36559994
FAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAP,

Я так и представлял ситуацию.

Но именно потому, что связь - то есть то в вашем случае надо просто создать таблицу setup и при каждом событии AfterRow.. записывать в нее значение ключа.

А при инициализации прочитать из таблицы и опять-же воспользоваться этим событием. Очень просто и удобно.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36560005
FAM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAP,

т.е записываете, например в первое поле имя грида, а во второе - ключ из ведущей таблицы таблицы:

insert into setup(NameGrid,ID) values(this.name,MyTable->ID)

а при инициализации грида читать:

sele NameGrid,ID from setup into curs InitValues where NameGrid = this.name

sele MyTable
locate for ID = InitValues->ID
if foun()
this.AfterRow..()
endif

В любом случае, такая логика работает, я постоянно пользуюсь.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36562214
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый FAM !

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

Не знаю, в какое собтие вставить код, запускаемый по этой кнопке.
Хочется, чтобы этот код выполнялся сразу после запуска приложения.
Куда его записать?
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36562282
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAP, может, в инит формы?
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36562436
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый tanglir !

Привожу код, который прекрасно работает при нажатии кнопки на странице Пейджфрейма, и который не подает признаков выполнения, если его вписать практически куда угодно. Я перепробовал много вариантов.

* Восстанавливаем "последнее" состояние указателей записей
IF vector_sostojania.rs_g3s = 't3'
SELECT t2
LOCATE FOR s = vector_sostojania.t2s
ThisForm.Pageframe1.Page2.Grid2.Click
ThisForm.Pageframe1.Page2.Grid2.Refresh

SELECT t17
LOCATE FOR s = vector_sostojania.t17s
ThisForm.Pageframe1.Page2.Grid1.Click
ThisForm.Pageframe1.Page2.Grid1.Refresh

thisform.pageframe1.page2.grid3.RecordSource = ""
thisform.pageframe1.page2.grid3.RecordSource = "t3"

SELECT t3
LOCATE FOR s = vector_sostojania.t3s
ThisForm.Pageframe1.Page2.Grid3.Click
ThisForm.Pageframe1.Page2.Grid3.Refresh

ENDIF

IF vector_sostojania.rs_g3s = 't31'
SELECT t2
LOCATE FOR s = vector_sostojania.t2s
ThisForm.Pageframe1.Page2.Grid2.Refresh
ThisForm.Pageframe1.Page2.Grid2.Click

thisform.pageframe1.page2.grid3.RecordSource = ""
thisform.pageframe1.page2.grid3.RecordSource = "t31"
SELECT t31
LOCATE FOR s = vector_sostojania.t31s
ThisForm.Pageframe1.Page2.Grid3.Click
ThisForm.Pageframe1.Page2.Grid3.Refresh
ENDIF

Вероятно, я допускаю некую глупую и неуловимую ошибку.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36564679
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UAP, честно говоря, этот код далёк от прекрасного.

Судя по Вашим словам, у всех таблиц есть первичные ключи (что правильно), так зачем locate? Есть чудная функция seek, которая умеет работать не в текущей области и без активации нужного ей индексного тега. См. help по seek()

Что, по-Вашему, означает
Код: plaintext
vector_sostojania.rs_g3s = 't3'
? По-моему, этот код означает, что значение vector_sostojania.rs_g3s начитается с 't3', например 't31' тоже удовлетворяет этому условию. См. help по операции == и сопутствующим установкам set.

Вот здесь vector_sostojania.rs_g3s точно находится значение именно в нижнем регистре? Или может быть в условие лучше дописать lower()?

Незачем двадцать раз подряд писать ThisForm.Pageframe1.Page2, для этого сущестсвует конструкция with ... endwith
with ThisForm.Pageframe1.Page2
.Gred1.Refresh()
.Textbox1.Value = 0
&& ...
endwith

К чему эти программные клики (grid1.click() и т.д.)? Так не пишут, программа с ума сойдёт. Или программист, который будет разбираться в Вашем коде после Вас.

Напоследок, отладчик у Вас есть ? :)
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36566104
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый XAndy !

Следуя вашим замечаниям, внес некоторые изменения в программу:


IF ALLTRIM(LOWER(vector_sostojania.rs_g3s)) = 't3'

SELECT t2
LOCATE FOR ALLTRIM(STR(s)) = ALLTRIM(STR(vector_sostojania.t2s))
ThisForm.Pageframe1.Page2.Grid2.Refresh

SELECT t17
LOCATE FOR ALLTRIM(STR(s)) = ALLTRIM(STR(vector_sostojania.t17s))
ThisForm.Pageframe1.Page2.Grid1.Refresh

thisform.pageframe1.page2.grid3.RecordSource = "t3"
SELECT t3
LOCATE FOR ALLTRIM(STR(s)) = ALLTRIM(STR(vector_sostojania.t3s))
ThisForm.Pageframe1.Page2.Grid3.Refresh

ENDIF

IF ALLTRIM(LOWER(vector_sostojania.rs_g3s)) = 't31'

SELECT t2
LOCATE FOR ALLTRIM(STR(s)) = ALLTRIM(STR(vector_sostojania.t2s))
ThisForm.Pageframe1.Page2.Grid2.Refresh

thisform.pageframe1.page2.grid3.RecordSource = "t31"
SELECT t31
LOCATE FOR ALLTRIM(STR(s)) = ALLTRIM(STR(vector_sostojania.t31s))
ThisForm.Pageframe1.Page2.Grid3.Refresh

ENDIF

Этот текст записан в кнопку Command35.
При нажатии на эту кнопку моя задача отлично решается.
К какому событию привязать


ThisForm.Pageframe1.Page2.Command35.Click ?

Я прошу помощи, а не критики.

Когда программа заработает, я улучшу ее стиль.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36566484
XAndy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Конструктивная критика тоже помощь ;)

А к чему привязать вызов - это зависит от организации программы, если к примеру форма ваша модальная или не модальная но приватная сессия данных, то достаточно из init фоормы один раз вызвать (возможно лучше даже в show формы), а иначе - ой... даже думать страшно про activate/deactivate :)
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36566649
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый XAndy !

Где же ответ на вопрос - почему код, запущенный по нажатию кнопки отлично работает, а без кнопки его непонятно куда писать?
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36567079
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XAndyКонструктивная критика тоже помощь ;)

А к чему привязать вызов - это зависит от организации программы, если к примеру форма ваша модальная или не модальная но приватная сессия данных, то достаточно из init фоормы один раз вызвать (возможно лучше даже в show формы), а иначе - ой... даже думать страшно про activate/deactivate :)

init
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36568387
Ffffffffffffffff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UAP, а что вы хотите услышать? Ваша задача не имеет единственно правильного решения. Вам подсказали варианты. Пробуйте.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36568471
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый Ffffffffffffffff !

Если бы у меня получился хотябы один из предложенных вриантов, я бы поблагодарил всех за внимание к моей скромной особе и на этом закончил бы обсуждение.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36568710
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UAPКоллеги!

На форме пейджфрейм.
На каждой его странице множество Гридов, в которых отображаются соответствующие СВЯЗАННЫЕ таблицы.
Каждая из таблиц имеет "ключ" по которому можно ОДНОЗНАЧНО идентифицировать ту или иную запись.
Понятно, что при выходе из указанной формы либо при закрытии всей программы, можно запомнить текущие значения всех "ключей".

Вопрос: как при запуске программы либо при повторном запуске указанной формы сделать так, чтобы указатели записей восстановились и эти записи подсветились, то есть восстановилось ПОСЛЕДНЕЕ состояние Гридов?
Вроде в этой ветке уже много советов, а решение так и не найдено...
Дело в том, что если есть много таблиц, гридов, вкладок, замкнутых реляций и пр., то нужно сюда прислать отдельным архивом ту самую форму с вкладками и гридами, а также те самые таблицы с 10-20 записями в каждой. Если в таблицах есть коммерческие тайны, то можно их перезаполнить так, чтобы мы смогли с ними открыто работать.

Мне, например, неясно, в какой вкладке находится какой грид.

Если подойти к этому вопросу теоретически, то нужно делать таким образом:

1 Добавить еще одну таблицу (напр. TabNum) в окружение данных с полями Rec1, Rec2 и т.д. по числу связанных таблиц (целые типы полей).
В этой таблице хранить номера записей по каждой таблице по выходу из формы.
Однако в Ините проверять, есть ли вообще хоть одна запись в этой таблице, и если нет, то добавить одну запись и присвоить всем полям значение = 1.

2. Или добавить в форму дополнительно N свойств (имена Rec1, Rec2 и т.п.), сразу же присвоив им начальное значение = 1.

3. При выходе из формы запомнить либо в TabNum, либо в свойствах формы номера записей в каждой связанной таблице, где стоит маркер:

TabNum.rec1 = recno(tab1)
TabNum.rec2 = recno(tab2) && и так далее

Я отдаю предпочтение таблице, т.к. при закрытии программы значения полей в таблице TABNUM сохранятся, а в свойствах формы снова станут =1.

4. При открытии формы в Ините пишем что-то типа

Select tab1
Goto tabnum.rec1
thisform.grid1.refresh && иногда эту строку я игнорирую
thisform.grid1.setfocus && а вот без этой команды маркер может не встать на нужную строку

Select tab2
Goto tabnum.rec2
thisform.grid2.refresh
thisform.grid2.setfocus && и так далее в порядке подчинения таблиц (родительская прежде дочерней).

Нужно также помнить, что активным будет тот грид, который записан последним. Но во всех гридах указатель записи (треугольничек) будет стоять на своем месте.
Чтобы как-то выделить в неактивных гридах всю строку, можно воспользоваться любым известным способом, в том числе классом GridHighLighter (UniversalThread.com)

Ну, это в теории. На практике нужно смотреть, что же там наворочено реально в форме.
...
Рейтинг: 0 / 0
Запомнить и восстановить "последнее" состояние Гридов
    #36568984
UAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый igorbik !

Спасибо за развернутый ответ.
Буду его изучать.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запомнить и восстановить "последнее" состояние Гридов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]