|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Коллеги! На форме пейджфрейм. На каждой его странице множество Гридов, в которых отображаются соответствующие СВЯЗАННЫЕ таблицы. Каждая из таблиц имеет "ключ" по которому можно ОДНОЗНАЧНО идентифицировать ту или иную запись. Понятно, что при выходе из указанной формы либо при закрытии всей программы, можно запомнить текущие значения всех "ключей". Вопрос: как при запуске программы либо при повторном запуске указанной формы сделать так, чтобы указатели записей восстановились и эти записи подсветились, то есть восстановилось ПОСЛЕДНЕЕ состояние Гридов? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 15:49 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, запомнить номера записей в каждой таблице и встать на них перед показом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 15:59 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, Встать на запись - Locate по первичному ключу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2010, 17:14 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Коллеги! Спасибо за желание помочь. Но. Я сейчас пробую реализовать рекомендации. Пока не получается. Очень мудреная форма. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2010, 08:51 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, Самый простой способ для случая, когда таблицы в гридах связаны. 1. Запоминаешь только значения самой главной таблицы. 2. select 'Главная таблица' 3. Locate for RecnoID = 'Запомненное заначение' 4. И дальше - ГлавныйГрид.AfterRowColChange() Предварительно пропиши в этом событии код, который вызовет обновление зависимых гридов следующего уровня. Те, в свою очередь - более нижнего уровня.. Получается такое веерное срабанывание. Причем ты запоминаешь только вершину этого дерева. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2010, 17:07 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый FAM ! Вы очень точно описали ситуацию. Но. У материнской записи может быть M дочерних. Высветить их все в дочернем Гриде просто. Проблема в том, что нужно в дочернем Гриде установить указатель на записи с ключем равным N, где 1<=N<=M ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2010, 21:04 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый 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 - обычные. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2010, 21:37 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, Я так и представлял ситуацию. Но именно потому, что связь - то есть то в вашем случае надо просто создать таблицу setup и при каждом событии AfterRow.. записывать в нее значение ключа. А при инициализации прочитать из таблицы и опять-же воспользоваться этим событием. Очень просто и удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2010, 18:42 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
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 В любом случае, такая логика работает, я постоянно пользуюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2010, 18:50 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый FAM ! Только что ПОЧТИ выкрутился, используя и ваши рекомендации в том числе. У меня сейчас все указатели становятся на свои места, но не при запуске приложения, а после того как на экране появится мой Пейджфрейм и я нажму кнопку с соответствующим кодом. Не знаю, в какое собтие вставить код, запускаемый по этой кнопке. Хочется, чтобы этот код выполнялся сразу после запуска приложения. Куда его записать? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2010, 00:27 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, может, в инит формы? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2010, 05:31 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый 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 Вероятно, я допускаю некую глупую и неуловимую ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2010, 09:27 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, честно говоря, этот код далёк от прекрасного. Судя по Вашим словам, у всех таблиц есть первичные ключи (что правильно), так зачем locate? Есть чудная функция seek, которая умеет работать не в текущей области и без активации нужного ей индексного тега. См. help по seek() Что, по-Вашему, означает Код: plaintext
Вот здесь vector_sostojania.rs_g3s точно находится значение именно в нижнем регистре? Или может быть в условие лучше дописать lower()? Незачем двадцать раз подряд писать ThisForm.Pageframe1.Page2, для этого сущестсвует конструкция with ... endwith with ThisForm.Pageframe1.Page2 .Gred1.Refresh() .Textbox1.Value = 0 && ... endwith К чему эти программные клики (grid1.click() и т.д.)? Так не пишут, программа с ума сойдёт. Или программист, который будет разбираться в Вашем коде после Вас. Напоследок, отладчик у Вас есть ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2010, 00:55 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый 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 ? Я прошу помощи, а не критики. Когда программа заработает, я улучшу ее стиль. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2010, 14:56 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Конструктивная критика тоже помощь ;) А к чему привязать вызов - это зависит от организации программы, если к примеру форма ваша модальная или не модальная но приватная сессия данных, то достаточно из init фоормы один раз вызвать (возможно лучше даже в show формы), а иначе - ой... даже думать страшно про activate/deactivate :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2010, 16:41 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый XAndy ! Где же ответ на вопрос - почему код, запущенный по нажатию кнопки отлично работает, а без кнопки его непонятно куда писать? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2010, 17:26 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
XAndyКонструктивная критика тоже помощь ;) А к чему привязать вызов - это зависит от организации программы, если к примеру форма ваша модальная или не модальная но приватная сессия данных, то достаточно из init фоормы один раз вызвать (возможно лучше даже в show формы), а иначе - ой... даже думать страшно про activate/deactivate :) init ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2010, 20:42 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
UAP, а что вы хотите услышать? Ваша задача не имеет единственно правильного решения. Вам подсказали варианты. Пробуйте. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2010, 13:48 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
Уважаемый Ffffffffffffffff ! Если бы у меня получился хотябы один из предложенных вриантов, я бы поблагодарил всех за внимание к моей скромной особе и на этом закончил бы обсуждение. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2010, 14:14 |
|
Запомнить и восстановить "последнее" состояние Гридов
|
|||
---|---|---|---|
#18+
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) Ну, это в теории. На практике нужно смотреть, что же там наворочено реально в форме. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2010, 15:31 |
|
|
start [/forum/search_topic.php?author=comsel&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 783ms |
total: | 936ms |
0 / 0 |