powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / BindEvent()
14 сообщений из 14, страница 1 из 1
BindEvent()
    #38879560
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
BINDEVENT перехватывает событие, вызывая мой метод.

BINDEVENT(thisform.ocont1.tree,"change",THISFORM,"SaveData",0)

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

Можно его как-то прибить?
...
Рейтинг: 0 / 0
BindEvent()
    #38879616
tor300
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miv32,

Код: sql
1.
NODEFAULT
...
Рейтинг: 0 / 0
BindEvent()
    #38879711
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помогает. :(
...
Рейтинг: 0 / 0
BindEvent()
    #38879747
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй в пятом параметре поставить 2
Код: sql
1.
BINDEVENT(thisform.ocont1.tree,"change",THISFORM,"SaveData",2)


Если я правильно хэлп понял, то должно помочь.
...
Рейтинг: 0 / 0
BindEvent()
    #38879874
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все флаги перебрал. Не помогает.
Я хочу при потере фокуса (LostFocus) контейнера не попасть в Grid и Tree
в методе SaveData делаю Grid.enabled = .f.
И все равно могу на грид попасть мышкой. Причем если потом опять в контейнер ткнуть, то уже grid становится недоступным.
...
Рейтинг: 0 / 0
BindEvent()
    #38881162
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Назначение BindEvent() - это выполнить метод-делегат, при выполнении события-источника. Он не перехватывает события, а "дополняет" код выполнение события некоторым дополнительным кодом. При этом, Вы никак, никоим образом, не можете влиять на факт выполнения события-источника (события-триггера). Он будет выполнен в любом случае.

Флаги 2 и 3 - это блокирование выполнения метода-делегата, если событие-источник было вызвано программно. Но блокирование именно делегата, а не источника!

Если Вы программно меняете "видимые" (отображаемые на форме) свойства объектов, например, top, enable, label, то следует иметь в виду, что эти изменения вступят в силу только по окончании выполнения Вашего метода. Дело в том, что отрисовка формы - это тоже некоторое событие, которое ставится в стек событий и ждет своей очереди на исполнение. Если визуально отобразить изменения надо немедленно, то следует использовать команду DoEvents

Код: sql
1.
2.
3.
4.
(...)
ThisForm.Grid.enabled = .f.
DoEvents
(...)



Для блокирования входа в объект можно использовать метод When. Если он вернет .F., то вход в объект блокируется. Можно попробовать написать в этом методе что-то вроде

Код: sql
1.
return this.enabled
...
Рейтинг: 0 / 0
BindEvent()
    #38881176
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, поэкспериментирую.
...
Рейтинг: 0 / 0
BindEvent()
    #38881283
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С гридом вроде разобрался. enable = .f. в When помогает.
С tree не получается. Там нет when, и в контейнере, в котором он лежит, тоже нет.
Дерево ctTree от DBI.
...
Рейтинг: 0 / 0
BindEvent()
    #38882432
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно воспользоваться таким приемом:

На форму кладется TextBox вне области видимости. Например, top = -100, left = -100. В случае необходимости, фокус программно переводится на этот объект. ThisForm.TextBox1.setFocus(). Для пользователя это будет выглядеть так, как будто фокус был убран с любого объекта формы.
...
Рейтинг: 0 / 0
BindEvent()
    #38884083
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не помогает.
Дерево успевает поймать фокус на другой ветке, а уж потом становится недоступным.
...
Рейтинг: 0 / 0
BindEvent()
    #38885733
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С объектом ctTree от DBI не работал, поэтому только общая идея.

При выходе из узла дерева, "взвести флаг". Затем при выборе нового узла проверить факт "взведения флага" и если это есть, то сбросить флаг и перейти на старый узел. Разумеется, будет некоторое "передергивание", но результат будет нужным. Указатель вернется на исходный узел.

Хотя, сама идея запрета выхода из объекта - не корректная. Как Вы планируете форму-то закрывать, если что? Вы не можете закрыть форму, поскольку нельзя покинуть объект, а объект Вы покинуть не можете, поскольку не знаете, что в него надо ввести. Тупик!

Как правило, из объекта все-таки дают выйти, но если значение не корректное, то как-то "подсвечивают" объект. Ну, там контрастным фоном или рамочкой. Кроме того дублирую контроль на кнопку "Сохранить", где и сообщают "человеческими словами" в чем ошибка и что надо исправить. Т.е. если ввели не корректное значение, то форму закрыть можно, просто значения либо не сохраняются, либо сохраняются, но с признаком не достоверности.
...
Рейтинг: 0 / 0
BindEvent()
    #38885752
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, надо мудрить.
Дело в том, что формы-то и нет. Все в одном главном окне.
Слева дерево, содержимое ветки показывает грид, содержимое строки которого показывают объекты. Объекты добавляются через AddObjects в контейнер. Грид и дерево тоже в контейнерах. Перемещаясь по гриду - меняются данные.
Допустим в данных что-то изменили. По идее нажал "Сохранить" - все ок.
Но юзер может ткнуть как в ветку дерева, так и на другую строку в гриде.
BINDEVENT на LostFocus контейнера с данными помогает. Идет проверка на факт изменений. Выскакивает окошко: "Сохранить изменения?". С этим тоже все хорошо. Но дело в том, что есть поля, обязательные для заполнения и если они не заполнены, то надо вернуться в контейнер. when в гриде в данном случае спасает. С деревом засада.

Надо как-то не дать туда вообще попасть. :(
...
Рейтинг: 0 / 0
BindEvent()
    #38885811
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавьте в свою таблицу дополнительное логическое поле, смысл которого, "Данные корректны".

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

При такой организации работы Вы становитесь независимы от интерфейса и у Вас полностью "развязаны руки" Пользователь вводит что угодно и как угодно, просто часть введенных данных в программе не используется. Мусор, так в виде мусора и хранится (специальная меточка висит - это мусор ) и никак не влияет на приложение.

Можно вместо дополнительного поля использовать дополнительную таблицу. Т.е. не до конца введенные данные физически хранятся в другой (буферной) таблице. После прохождения всех проверок копируются в "окончательную" таблицу. Хотя, конечно, организационно это значительно сложнее, ведь в этом случае нужен двусторонний обмен. Записи из постоянной таблицы могут оказаться в буферной, если пользователь что-то не корректно исправил. Но здесь можно запретить изменять ряд полей после создания окончательного варианта записей.

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

PS: Также есть вариант организации древовидной структуры на основе объекта Grid http://www.foxclub.ru/sol/solution668.php
Вот здесь картинка, как это выглядит http://forum.foxclub.ru/read.php?29,370548,475187#msg-475187
...
Рейтинг: 0 / 0
BindEvent()
    #38885822
miv32
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. :)
Буду думать. Скорее всего откажусь от алярма на пропуск ввода обязательных данных.
Собственно эти поля у меня и так подкрашиваются.
на форме есть чекбокс - Сохранять не спрашивая. Если юзер минует кнопку Сохранить, то в зависимости от значения чекбокса либо просто не сохранять, либо сохранять принудительно.
Ваши варианты с доптаблицами мне не подходят.
Во первых, клиент-сервер. Во вторых, у меня и таблиц-то нет :)
Источником данных для объектов редактирования служат курсоры, полученные командой sys.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / BindEvent()
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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