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

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

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

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

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

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

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

Но.

У материнской записи может быть M дочерних.
Высветить их все в дочернем Гриде просто.
Проблема в том, что нужно в дочернем Гриде установить указатель на записи
с ключем равным N, где 1<=N<=M
...
Рейтинг: 0 / 0
03.04.2010, 21:37
    #36559428
UAP
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
04.04.2010, 18:42
    #36559994
FAM
FAM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запомнить и восстановить "последнее" состояние Гридов
UAP,

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

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

А при инициализации прочитать из таблицы и опять-же воспользоваться этим событием. Очень просто и удобно.
...
Рейтинг: 0 / 0
04.04.2010, 18:50
    #36560005
FAM
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
06.04.2010, 00:27
    #36562214
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запомнить и восстановить "последнее" состояние Гридов
Уважаемый FAM !

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

Не знаю, в какое собтие вставить код, запускаемый по этой кнопке.
Хочется, чтобы этот код выполнялся сразу после запуска приложения.
Куда его записать?
...
Рейтинг: 0 / 0
06.04.2010, 05:31
    #36562282
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запомнить и восстановить "последнее" состояние Гридов
UAP, может, в инит формы?
...
Рейтинг: 0 / 0
06.04.2010, 09:27
    #36562436
UAP
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
07.04.2010, 00:55
    #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
07.04.2010, 14:56
    #36566104
UAP
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
07.04.2010, 16:41
    #36566484
XAndy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запомнить и восстановить "последнее" состояние Гридов
Конструктивная критика тоже помощь ;)

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

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

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

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

Если бы у меня получился хотябы один из предложенных вриантов, я бы поблагодарил всех за внимание к моей скромной особе и на этом закончил бы обсуждение.
...
Рейтинг: 0 / 0
08.04.2010, 15:31
    #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
08.04.2010, 16:48
    #36568984
UAP
UAP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запомнить и восстановить "последнее" состояние Гридов
Уважаемый igorbik !

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


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