powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / 2 формы с Private Data Session
20 сообщений из 20, страница 1 из 1
2 формы с Private Data Session
    #35624609
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леди и джентльмены!
Может быть, я неверно понимаю ситуацию, помогите. Извините за тафталогию в примере.

В проекте запускается Forma_01 с Private Data Session.
Потом пользователь может открыть из нее Forma_02, в ней сессия тоже приватна.
В одной из таблиц второй формы пользователь удаляет запись.
Далее Forma_02 закрывается.
Но в Forma_01 эта запись еще остается в таблице. Нужно закрыть Forma_01, запустить ее вновь, чтобы таблица обновилась.

Правильно ли я понимаю, что это происходит от того, что в обеих формах проставлено Private Data Session?
Как поступить?
Благодарю.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624623
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первой форме передернуть указатель записи
Код: plaintext
go recno('MyTable')
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624631
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделать у контрола, где таблица является сырцом Refresh() или Requery() - второй актуален для cbo, lst и типа того
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624733
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гм-м...
Не помогает. Кстати, у меня уже проставлено было GO TOP IN...
И таблица эта не привязана к контролу. Из нее идут запросы.
Я вот что подумала сейчас.
Значит, идет у меня выполнение программного кода в Forma_01.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
** При нажатии  Enter  **
IF LASTKEY()= 13  AND pnМpage= 1 
... ... ...
DO FORM 'c:\Sort\My_Forms\frmPoisk'   && Запускается форма Forma_02, в ней что-то делается пользователем, потом она закрывается &&
     GO   1  IN пациент
     SELECT * FROM ...
... ... ...
ENDIF
А подумала я вот о чем: после закрытия Forma_02 код в Forma_01 продолжает выполняться со строки, идущей после DO FORM?
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624748
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой, прошу прощения, вставила из буфера слова, а буфер - из Word'a.
Строка такая:
GO 1 IN Sortredak

)))
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624789
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛисонькаА подумала я вот о чем: после закрытия Forma_02 код в Forma_01 продолжает выполняться со строки, идущей после DO FORM?

Это зависит от Forma_02. Если она модальная, то выполнение в DO FORM 'c:\Sort\My_Forms\frmPoisk' приостанавливается до закрытия Forma_02. Иначе, если вызываемая форма немодальная, то выполнение кода продолжается...
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624792
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут сижу эксперемнтирую. Теперь попробовала так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
** При нажатии  Enter  **
IF LASTKEY()= 13  AND pnМpage= 1 
... ... ...
DO FORM 'c:\Sort\My_Forms\frmPoisk'   && Запускается форма Forma_02, в ней что-то делается пользователем, потом она закрывается &&
          USE IN Sortredak
          USE Sortredak
     SELECT * FROM ...
... ... ...
ENDIF
Но USE Sortredak - это некорректный адрес. Нужно было писать полный путь к файлу. Соответсвтенно - Фокс заругался. Но сообщение об ошибке выдалось еще ДО появления на экране Forma_02!
Вывод: GO 1 IN Sortredak срабатывает тоже ДО того момента, как удаление записи было сделано пользователем.
Вот поэтому у меня и неполучается ничего.
Что подскажете?
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624805
12345зайчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Лисонька


если использовать для получения выборок(курсоров), привзанных к гридам
курсорадаптер, то получить актуальные данные можно
методом cursorrefresh() либо RecordRefresh(1) (для одной текущей записи) курсорадаптера

В Вашем случае необходимо каким-то образом инициировать
событие изменения записей (после закрытия формы 2 в форме 1 запускать метод проверки актуальности записи и вносить уже изм-я в курсор 1-й формы руками)
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624825
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем DO FORM ' c:\Sort\My_Forms\ frmPoisk' ?
Достаточно в стартовой программе сделать Set Default To на каталог,откуда стартует программа.
Иначе могут быть проблемы.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624836
12345зайчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
+ set path
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624889
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
homikА зачем DO FORM ' c:\Sort\My_Forms\ frmPoisk' ?
Достаточно в стартовой программе сделать Set Default To на каталог,откуда стартует программа.
Иначе могут быть проблемы.
Ну нет у нас ананасов! :-Р
Нет, Set Default To не проставила. Не из-за того, что не знала об этой команде. Ведь я ссылки пишу не только на папку с формами, но и с отчетами, и сшаблонами и т.п. Мне легче при написании кода через буфер ввести нужный путь.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624933
ЛисонькаНет, Set Default To не проставила. Не из-за того, что не знала об этой команде. Ведь я ссылки пишу не только на папку с формами, но и с отчетами, и сшаблонами и т.п. Мне легче при написании кода через буфер ввести нужный путь.
И что? А еще легче их совсем не писать. Никак. Ни руками, ни через буфер. Что и предлагается сделать. Set Path в этом отношении очень хорошая команда. Только не надо незнание чего-либо выдавать за продуманный хитрый выверт.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624949
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.И что? А еще легче их совсем не писать. Никак. Ни руками, ни через буфер. Что и предлагается сделать. Set Path в этом отношении очень хорошая команда. Только не надо незнание чего-либо выдавать за продуманный хитрый выверт.
Реплика мимоходом.
Если Вы помните еще какие-нибудь мои темы, то могли бы понять, что я никогда не скрываю свое незнание и честно говорю об этом: этого я не знала.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624956
homik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька Ведь я ссылки пишу не только на папку с формами, но и с отчетами, и сшаблонами и т.п. Мне легче при написании кода через буфер ввести нужный путь.

Ага и завтра перетащили папку с проектами в другое место, и как результат сидим пару тройку часов и меняем все пути ???
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35624970
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наивный вопрос:

Настройка SET DELETED ON на первой форме есть?

Надеюсь, вы в курсе, что внутри Private DataSession все настройки, связанные с обработкой данных сбрасываются в значение по умолчанию? В том числе и SET DELETED. Полный список настроек, которые сбрасываются в Private DataSession можно посмотреть в описании к настройке

SET DATASESSION

Кроме того, удаление записи физически означает всего-лишь пометку такой записи как удаленной. Т.е. физически, запись по прежнему существует. А это значит, что на нее можно перевести указатель записи командой GO.

Настройка SET DELETED - это всего-лишь своеобразный фильтр, наложенный на таблицу. Чтобы фильтр вступил в силу, необходимо передвинуть указатель записи. Но не командой GO, а командой SKIP. Т.е. примерно так:

Код: plaintext
1.
2.
3.
4.
5.
select MyTab
SKIP
IF EOF() = .T.
      SKIP - 1 
ENDIF

После этой операции, надо обновить картинку в Grid. А это происходит только при получении Grid фокуса. Т.е. надо явно прописать

Код: plaintext
ThisForm.Grid1.SetFocus()

Однако если подчиненная форма НЕ модальная, то весь этот код по обновлению придется вынести в отдельный метод и запускать ЯВНО. Специальной командой. Например, напрямую из подчиненной формы.

В простейшем случае, чтобы это сделать, можно передать идентификатор родительской формы в подчиненную. Но в более общем случае, требуется собственный менеджер открытых форм, чтобы отслеживать возможные взаимосвязи.

Для модальной формы все проще. Этот код можно записать сразу за DO FORM.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35625041
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET DELETE, пометка на удаление, физическое удаление PACK - это все понятно.
Модальная форма - нет, нежелательно.
Значит, мне нужно в главной форме сделать New Method? А потом запускать командой THISFORM.new_m()?
А если из подчиненной, то какой командой?
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35625063
ЛисонькаА потом запускать командой THISFORM.new_m()?
А если из подчиненной, то какой командой?
Ссылка_на_родительскую_форму.new_m()
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35625070
12345зайчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2Лисонька

попробуйте поработать с курсорадаптером
с примерами я помогу, + пополните объем знаний

курсорадаптеры позволят Вам использовать более логичные приемы
и облегчит разработку
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35625160
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лисонька

Если решите использовать CursorAdapter, то имейте в виду, что для решения данной задачи вам придется делать ТО ЖЕ САМОЕ. Ну, разве что, другими командами.

Т.е. по прежнему потребуется написать метод new_m() на главной форме. По прежнему потребуется организовать его вызов из дочерней формы. Отличия будут только в содержимом этого метода.

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

Если формы не могут открываться в двух экземплярах (дважды открыть одну и ту же форму), то, в качестве такого идентификатора можно передать свойство Name формы. Т.е. вызов дочерней формы примет вид

Код: plaintext
DO FORM ChildForm.scx WITH ThisForm.Name

В методе Init дочерней формы необходимо организовать прием этого параметра и записать его в специальное свойство дочерней формы

Код: plaintext
1.
2.
3.
4.
5.
* Метод Init дочерней формы
LPARAMETERS tcParentFormName
IF TYPE("tcParentFormName") = "C"
      ThisForm.ParentFormName = m.tcParentFormName
ENDIF

Здесь свойство ThisForm.ParentFormName - это предварительно созданное свойство дочерней формы.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
* Выполняется модификация данных
...
* Проверяю, есть ли ссылка на родительскую форму
* и открыта ли она в настоящий момент
* Можно еще добавить проверку на факт наличия нужного метода
IF EMPTY(ThisForm.ParentFormName) = .F. AND ;
      TYPE("_VFP.Forms(ThisForm.ParentFormName)") = "O"

      * Если есть родительская форма с нужным методом, то запускаю этот метод
      _VFP.Forms(ThisForm.ParentFormName).new_m()
ENDIF

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

-------------------------------------------------------------------------------

Однако начиная с версии VFP8, все то же самое можно сделать при помощи BindEvents() примерно так:

Код: plaintext
1.
2.
3.
4.
* Запуск дочерней формы
LOCAL loForm
DO FORM ChildForm.scx NAME loForm
=BindEvent(loForm, "MyUpdate", ThisForm, "new_m",  1 )

Здесь я предполагаю, что при ЛЮБОЙ модификации в дочерней форме, так или иначе будет запущен ее метод MyUpdate(). Это пользовательский метод в этой дочерней форме.

Факт запуска метод MyUpdate() по связке в BindEvent() инициирует выполнение метода new_m() в текущей (родительской) форме. Что, собственно, и требуется.

Недостаток связки по BindEvent() - это невозможность передачи параметров. Впрочем, не думаю, что в данной задаче это так уж нужно. Ну, а достоинства - это предельная простота организации и нет необходимости как-то модифицировать дочернюю форму.
...
Рейтинг: 0 / 0
2 формы с Private Data Session
    #35625165
Лисонька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да!!!!!!!!!!! :D
Запускать родительскую форму с NAME ... LINKED. Далее метод со SKIP.
Работает!!!
Благодарюю всех-всех-всех!

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


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