Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как правильно переходить между формами в FormSet ?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
Привет!

Снова вопрос по FormSet-ам.
Что надо: сет содержит 2 формы, одна (1я) - список, выбираем в нем запись, появляется 2я - редактирование записи из этого списка, соотв. на фоне 1й формы появляется 2я.
В хелпе предписано активно юзать свойство форм Visible. Соотв. вызов второй формы выглядит так:
   WITH thisformset.Forms(2) && EditForm
	 .Visible= .T. && делаем 2ю форму видимой
	 .ZOrder() && выводим ее поверх 1й (front)
    ENDWITH
Проблема: у 1й формы есть кнопкa со свойством Cancel=.T.(выход/отмена) и кнопка со сво-вом Default=.T. (редактировать). Когда находясь во 2й форме нажать Enter - это событие зачем-то обрабатывается в 1й форме, т.е. в итоге на 1й форме "нажимается" кнопка свойством Default=.T., соотв. привычно перемещаться по полям второй формы Enter -ом не удается, т.к. при этом просто "перезапускается" редактирование. А когда в той же 2й форме нажать Escape, то снова непонятка - сработает кнопкa 1й формы со свойством Cancel=.T. и весь фомрсет отвалится!
Создается впечатление что хоть 2я форма и доступна, но она какбы не считается фоксой запущенной и события, происходящие для меня визуально в ней, 2й, реально обрабатываются 1й.
Пробовал еще курить хелп и вызывать 2ю форму через show() - тогда все ок, все события обрабатываются 2й формой, как и надо. Но тогда вылазит другая проблема - когда 2ю форму делаю невидимой (закончили редактирование) и пытаюсь вернуться в 1ю форму, то 1я форма как бы "зависает" (судя по дебаггеру в строке с show(), т.е. на вызове 2й формы), и в итоге повторно вызвать редактирование и перейти во 2ю форму невозможно. Пробовал давать на выходе из 2й формы CLEAR EVENTS - но безуспешно. Т.е. видно что выполнение show() должно чем-то закончится, но непонятно чего именно ждет show() чтобы прога/форма нормаль продолжила работу.

Что делать чтобы Enter/Escape не "уходили" в первую форму, т.е. как правильно переходить между формами в FormSet-е?

вфп9

спасибо

К сообщению приложен файл (test1.zip - 1Kb) cкачать
18 янв 10, 11:58    [8200996]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно переходить между формами в FormSet ?  [new]
KpaqpTuk
Member

Откуда:
Сообщений: 129
ОМГ лично я делаю так:
Находясь на 1й форме
ThisFormSet.Form2.Show
ThisFormSet.Form1.Hide
Никогда еще проблем не было
18 янв 10, 13:04    [8201743]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно переходить между формами в FormSet ?  [new]
KpaqpTuk
Member

Откуда:
Сообщений: 129
Прикрепленый файл

К сообщению приложен файл (test_new.rar - 1Kb) cкачать
18 янв 10, 13:10    [8201802]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно переходить между формами в FormSet ?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Есть два понятия: "Видимая" форма и "активная" форма.

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

WITH thisformset.Forms(2) && EditForm
	.Visible= .T. && делаем 2ю форму видимой
	.ZOrder() && выводим ее поверх 1й (front)
	.MyTextBox.setFocus()   && переводим фокус на первый объект формы
ENDWITH

Основное отличие FormSet от не связанных друг с другом форм - это возможность "общей модальности". Т.е. если сделать модальным FormSet, то свойство модальности будет распространено на сам FormSet, но между формами внутри FormSet можно будет свободно переключаться. Другими средствами добиться такого же эффекта довольно сложно.

Есть еще вопрос общего DataEnvironment для всех форм, но это, во-первых, легко решаемо обычной Default DataSession, а, во-вторых, не очень-то и нужно.

Следствием этой самой общей модальность и является запрет на использование методов Form.Show() если сам FormSet модальный. По той причине, что форма, вызванная из модальной формы автоматически становится модальной. Как следствие, FoxPro останавливается на команде Show() и ждет, пока форма не будет закрыта.

Судя по описанию, никакой необходимости в использовании "общей модальности" для нескольких форм - нет. Ведь формы у Вас скрытые и открываются "по требованию". Поэтому, проще сделать независимые формы, а не один общий FormSet. Так проще будет управлять формами.
18 янв 10, 17:34    [8204241]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно переходить между формами в FormSet ?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
KpaqpTuk
ОМГ лично я делаю так:
Находясь на 1й форме
ThisFormSet.Form2.Show
ThisFormSet.Form1.Hide
Никогда еще проблем не было
Hide пробовал тоже, но хотел чтобы форма со списком оставалась видимой. В Вашем примере если ее оставлять видимой - проблемы на месте. Хотя, в целом - это вариант решения. Спасибо!

ВладимирМ
Судя по описанию, никакой необходимости в использовании "общей модальности" для нескольких форм - нет. Ведь формы у Вас скрытые и открываются "по требованию". Поэтому, проще сделать независимые формы, а не один общий FormSet. Так проще будет управлять формами.

Спасибо, Владимир! Ваши ответы как всегда исчерпывающи...
Но проблема в том, что прилагаемый пример содержит немодальный формсет, а установка фокуса по Вашему примеру не дает абсолютно никакого результата, т.е. проблема остаётся на месте. Да и фокус 2я форма, вернее её Text1, получает нормально, иначе нельзя бы было в этот текстбокс вносить данные.
Что интересно, когда они обе видны, даже если кликнуть конкретно по 2й форме, нормально она активируется, фокус и все такое, но все равно проблема на месте - набираешь в текстбокс жмешь ентер - а он отрабатывает на 1й форме и все тут!
19 янв 10, 00:25    [8205572]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно переходить между формами в FormSet ?  [new]
CTAC-KO
Member

Откуда: Украина, г. Ивано-Франковск
Сообщений: 1012
Вобщем многочасовой менингит показал - проблема кроется в кнопке со свойством Default=.T.
Если таковая имеется на 1й форме - то ей (что естественно) и всем остальным (что неестественно) формам формсета нельзя пользоваться ентером для ввода данных в тектсбоксы, т.к. из любой формы формсета по ентеру сработает нажатие той самой кнопки 1й формы.
Что еще более замечательно, можно программно, при появлении 2й формы у 1й убирать с кнопки Default, но фокс чихать хотел на такие мансы и все равно кнопка остается для него со св-вом Default, судя по реакции на нажатие ентера во 2й форме.
Что еще куда интереснее, если, скажем у первой формы вообще нет изначально кнопки с установленным св-ом Default, а при вызове 2й формы тупо установить это св-во любой кнопке и тут же его убрать:
ThisFormSet.Forms(2).Visible= .T.
ThisFormSet.Forms(2).Zorder()
ThisFormSet.Forms(2).Command1.Default=.T.
ThisFormSet.Forms(2).Command1.Default=.F.
фокс начинает реагировать на ентер как на нажатие Forms(2).Command1, хотя Default у нее и был сразу же снят. Фокс все равно остается при мнении что она и есть та самая, заветная Default-кнопка.
Еще интереснее вариант, когда на первой форме кнопка Default есть, но при активации 2й формы 1й даешь Enabled=.F.
ThisFormSet.Forms(1).Enabled= .F.
ThisFormSet.Forms(2).Visible= .T.
ThisFormSet.Forms(2).Zorder()
то реакции на нажатие ентера в текстбоксах 2й формы больше не будет вообще - жми-не жми, фокс - как удав... Но реально когда жмешь ентер фокс пытается нажать на Default-кнопку 1й формы, а вся 1я форма недоступна и все ее контролы, ну и дальше соотв. ничего не происходит. Та же картина будет происходить если на 1й форме Default-кнопка .Enabled= .F. или она упакована в контейнер, который .Enabled= .F..
Логика такого поведения мне непонятна, но я догадываюсь, что она примерно такая - если снимаешь св-во Default, то обязательно надо такое установить другой кнопке, иначе зачем ты еще это ваще можешь делать? Но лично я-то ожидаю реакции на снятие с кнопки Default-а как у формы, у которой никогда не было такой кнопки.
короче для формсетов кнопка с установленным Default - опасная вещь, причем неважно даже если такая кнопка спрятана в контейнере фокс ее вычислит и будет на нее молиццо.
Уж не знаю глюк это или фича, но явление сие для меня оказалось весьма досадным.
19 янв 10, 11:34    [8207107]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить