Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Об обработке предшествующих событий в LostFocus / 11 сообщений из 11, страница 1 из 1
11.12.2007, 14:55
    #35001364
Лео_дан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Обрабатываю LOSTFOCUS объекта TEXTBOX.
Есть ли возможность определить программно, как был "покинут" объект....
Или, предположим, нажали клавишу ENTER / ESC, или нажали какую-то командную кнопку, или произошло какое-то событие ?
Заранее буду благодарен
...
Рейтинг: 0 / 0
11.12.2007, 19:09
    #35002425
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
В общем случае, обработать все возможные ситауции - нельзя.

Сама постановка вопроса говороит о том, что "в консерватории что-то надо подправить". Т.е. сама постановка задчи в чем-то не правильная. Если опишешь зачем это надо, возможно, тебе подскажут другие решения проблемы.
...
Рейтинг: 0 / 0
12.12.2007, 08:19
    #35003043
Лео_дан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
На форме размещаю поля (TEXTBOX) для ввода данных. Размещаю 2 командные кнопки: "Запись" и "Отмена". По Кнопке "Запись" провожу полную семантическую проверку и прописываю, в случае успеха, в таблицу. В случае ошибки сообщаю и устанавливаю курсор на ошибочном поле (это общая проверка по всем полям).
Кнопкой "Отмена" сбрасываю все поля ввода/изменения в исходное состояние. Кроме того, в проверяемых полях прописываю также проверку но в событии LOSTFOCUS и, если ошибка - о ней сообщается, но курсор остается на этом поле(работа через VALID мне что-то не понравилась... может не допонимаю).
Создаю ошибочную ситуацию по какому-то реквизиту и пытаюсь кнопкой "Сброс" вернуть все в исходное состояние, но мне выдается сообщение об ошибке в этом поле, которую я не хотел бы видеть (я же сбрасываю ситуацию).То же самое происходит и при аварийном выходе из формы. В этом,собственно, и суть проблемы для меня. Я понимаю, что вся проблемы в последовательности обработки событий, поэтому и задавал свой вопрос.
...
Рейтинг: 0 / 0
12.12.2007, 09:13
    #35003099
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Лео_данСоздаю ошибочную ситуацию по какому-то реквизиту и пытаюсь кнопкой "Сброс" вернуть все в исходное состояние, но мне выдается сообщение об ошибке в этом поле, которую я не хотел бы видеть (я же сбрасываю ситуацию)...
А Вы используете буферизацию данных?
...
Рейтинг: 0 / 0
12.12.2007, 09:30
    #35003128
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Последовательность событий можешь через EventTracking посмотреть:
form1.text1.Valid()
form1.command1.When()
form1.text1.LostFocus()
form1.command1.GotFocus()
form1.command1.Click()

Можешь завести флаг на форме например lNoCheck
при thisform.lNoCheck = .T. проверку не делать. А в кнопке:
Код: plaintext
1.
2.
3.
4.
5.
6.
proc command1.When()
thisform.lNoCheck = .T.

proc command1.Click()
thisform.lNoCheck = .F.
...

Для других ситуаций (закрытие окна крестиком) смотри порядок событий и ищи куда вставить
Код: plaintext
thisform.lNoCheck = .T. 

Но я бы не рекомендовал так жестко все контролировать. Достаточно одной проверки перед сохранением, мало ли пользователь по каким-то причинам умышленно недозаполнил поле и решил сначала заполнить другое.
LostFocus() так же срабатывает при переключении на окно другого приложения.
...
Рейтинг: 0 / 0
12.12.2007, 09:45
    #35003159
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Лео_данОбрабатываю LOSTFOCUS объекта TEXTBOX.
Есть ли возможность определить программно, как был "покинут" объект....
Или, предположим, нажали клавишу ENTER / ESC, или нажали какую-то командную кнопку, или произошло какое-то событие ?
Заранее буду благодарен

по минимуму так, в том же Lostfocus():
Код: plaintext
1.
2.
3.
4.
5.
If !Mdown()
     Messagebox("была нажата кнопка мыши");
Else
     Messagebox(Lastkey());
Endif;
Если надо не терять фокус при нажатии определенных клавиш
Код: plaintext
1.
2.
3.
4.
5.
6.
IF !Mdown()
  If !Inlist(Lastkey(), 5 , 24 , 13 , 9 , 15 )
      Nodefault;
      Return  0 ;
   EndIf
EndIf     
...
Рейтинг: 0 / 0
12.12.2007, 09:48
    #35003169
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Лео_данОбрабатываю LOSTFOCUS объекта TEXTBOX.
Есть ли возможность определить программно, как был "покинут" объект....
Или, предположим, нажали клавишу ENTER / ESC, или нажали какую-то командную кнопку, или произошло какое-то событие ?
Заранее буду благодарен
Сорри за небольшие ошибочки...
по минимуму так, в том же Lostfocus():
Код: plaintext
1.
2.
3.
4.
5.
If Mdown()
     Messagebox("была нажата кнопка мыши");
Else
     Messagebox(Lastkey());
Endif;
Если надо не терять фокус при нажатии определенных клавиш
Код: plaintext
1.
2.
3.
4.
5.
6.
IF !Mdown()
  If !Inlist(Lastkey(), 5 , 24 , 13 , 9 , 15 )
      Nodefault;
      Return  0 ;
   EndIf
EndIf     
...
Рейтинг: 0 / 0
12.12.2007, 11:04
    #35003435
Лео_дан
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Всем большое спасибо (особенно ДИМА Т). Информации вполне достаточно, чтобы решить проблему
...
Рейтинг: 0 / 0
12.12.2007, 14:49
    #35004528
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Dima TПоследовательность событий можешь через EventTracking посмотреть:
form1.text1.Valid()
form1.command1.When()
form1.text1.LostFocus()
form1.command1.GotFocus()
form1.command1.Click()

Последовательность событий меняется в случае перехода между объектами клавиатурой или мышкой.

Приведенное "смешение" событий - это следствие использование мышки. Если же переход осуществляется при помощи только клавиатуры, то все происходит последовательно. Сначала все события "выхода" для одного объекта, затем все события "входа" для другого.

Кроме того, при потерей фокуса формой (из объекта не выходили) последовательность совсем другая. А при программном перемещении - еще один вариант.

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

Повторюсь, в общем случае, как-то "закладываться" на последовательность выполнения событий - глупо. Это будет всего-лишь один из множества вариантов.
...
Рейтинг: 0 / 0
13.12.2007, 09:35
    #35006352
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
ВладимирМПоследовательность событий меняется в случае перехода между объектами клавиатурой или мышкой.

Приведенное "смешение" событий - это следствие использование мышки. Если же переход осуществляется при помощи только клавиатуры, то все происходит последовательно. Сначала все события "выхода" для одного объекта, затем все события "входа" для другого.
Меняется, но в рамках поставленной автором задачи не влияет на результат. И даже правильно меняется если по порядку обхода за полем сразу стоит кнопка.

К тому же клик на кнопке мышью и переход фокуса после поля на кнопку (по Enter или Tab) - это разные действия (во втором случае Click() не выполняется). Может разработчики фокса не случайно порядок событий сменили?

ВладимирМПовторюсь, в общем случае, как-то "закладываться" на последовательность выполнения событий - глупо. Это будет всего-лишь один из множества вариантов.
Согласен, но чтобы знать все множество надо знать все варианты. Или предлагаете умалчивать об приемах, которые могут иметь "побочные проблемы"? Речь ведь не об "общем" решении, а о конкретной проблеме, которая не решается другими способами, разве что таймерами, но с ними тоже не все гладко.

Я автора честно предупредил о недостатках выбранного им подхода. Так что пусть знает все достоинства и недостатки такого подхода, а использовать или нет решать ему.
...
Рейтинг: 0 / 0
13.12.2007, 19:46
    #35008884
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Об обработке предшествующих событий в LostFocus
Dima T ВладимирМПоследовательность событий меняется в случае перехода между объектами клавиатурой или мышкой.
Меняется, но в рамках поставленной автором задачи не влияет на результат.
Как раз в рамках задачи и влияет. Ведь предложен вариант, когда флаг lNoCheck "взводится" в событии Command.When() с тем, чтобы потом выполнить его анализ в Text.LostFocus() именно исходя из предположения, что одно событие выполняется перед другим. Явно "закладываясь" на определенный порядок срабатывания событий, который нарушается при клавиатурном переходе между объектами.

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


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