|
BindEvent()
|
|||
---|---|---|---|
#18+
Всем привет! BINDEVENT перехватывает событие, вызывая мой метод. BINDEVENT(thisform.ocont1.tree,"change",THISFORM,"SaveData",0) Но после отработки моей процедуры все равно отрабатывает перехватываемое событие, чего бы не хотелось. Можно его как-то прибить? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2015, 22:21 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
miv32, Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2015, 01:33 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Попробуй в пятом параметре поставить 2 Код: sql 1.
Если я правильно хэлп понял, то должно помочь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2015, 13:52 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Все флаги перебрал. Не помогает. Я хочу при потере фокуса (LostFocus) контейнера не попасть в Grid и Tree в методе SaveData делаю Grid.enabled = .f. И все равно могу на грид попасть мышкой. Причем если потом опять в контейнер ткнуть, то уже grid становится недоступным. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2015, 19:52 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Назначение BindEvent() - это выполнить метод-делегат, при выполнении события-источника. Он не перехватывает события, а "дополняет" код выполнение события некоторым дополнительным кодом. При этом, Вы никак, никоим образом, не можете влиять на факт выполнения события-источника (события-триггера). Он будет выполнен в любом случае. Флаги 2 и 3 - это блокирование выполнения метода-делегата, если событие-источник было вызвано программно. Но блокирование именно делегата, а не источника! Если Вы программно меняете "видимые" (отображаемые на форме) свойства объектов, например, top, enable, label, то следует иметь в виду, что эти изменения вступят в силу только по окончании выполнения Вашего метода. Дело в том, что отрисовка формы - это тоже некоторое событие, которое ставится в стек событий и ждет своей очереди на исполнение. Если визуально отобразить изменения надо немедленно, то следует использовать команду DoEvents Код: sql 1. 2. 3. 4.
Для блокирования входа в объект можно использовать метод When. Если он вернет .F., то вход в объект блокируется. Можно попробовать написать в этом методе что-то вроде Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 21:19 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Спасибо, поэкспериментирую. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2015, 21:42 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
С гридом вроде разобрался. enable = .f. в When помогает. С tree не получается. Там нет when, и в контейнере, в котором он лежит, тоже нет. Дерево ctTree от DBI. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2015, 08:24 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Можно воспользоваться таким приемом: На форму кладется TextBox вне области видимости. Например, top = -100, left = -100. В случае необходимости, фокус программно переводится на этот объект. ThisForm.TextBox1.setFocus(). Для пользователя это будет выглядеть так, как будто фокус был убран с любого объекта формы. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 08:42 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Не помогает. Дерево успевает поймать фокус на другой ветке, а уж потом становится недоступным. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2015, 15:21 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
С объектом ctTree от DBI не работал, поэтому только общая идея. При выходе из узла дерева, "взвести флаг". Затем при выборе нового узла проверить факт "взведения флага" и если это есть, то сбросить флаг и перейти на старый узел. Разумеется, будет некоторое "передергивание", но результат будет нужным. Указатель вернется на исходный узел. Хотя, сама идея запрета выхода из объекта - не корректная. Как Вы планируете форму-то закрывать, если что? Вы не можете закрыть форму, поскольку нельзя покинуть объект, а объект Вы покинуть не можете, поскольку не знаете, что в него надо ввести. Тупик! Как правило, из объекта все-таки дают выйти, но если значение не корректное, то как-то "подсвечивают" объект. Ну, там контрастным фоном или рамочкой. Кроме того дублирую контроль на кнопку "Сохранить", где и сообщают "человеческими словами" в чем ошибка и что надо исправить. Т.е. если ввели не корректное значение, то форму закрыть можно, просто значения либо не сохраняются, либо сохраняются, но с признаком не достоверности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 20:42 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
В общем, надо мудрить. Дело в том, что формы-то и нет. Все в одном главном окне. Слева дерево, содержимое ветки показывает грид, содержимое строки которого показывают объекты. Объекты добавляются через AddObjects в контейнер. Грид и дерево тоже в контейнерах. Перемещаясь по гриду - меняются данные. Допустим в данных что-то изменили. По идее нажал "Сохранить" - все ок. Но юзер может ткнуть как в ветку дерева, так и на другую строку в гриде. BINDEVENT на LostFocus контейнера с данными помогает. Идет проверка на факт изменений. Выскакивает окошко: "Сохранить изменения?". С этим тоже все хорошо. Но дело в том, что есть поля, обязательные для заполнения и если они не заполнены, то надо вернуться в контейнер. when в гриде в данном случае спасает. С деревом засада. Надо как-то не дать туда вообще попасть. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 21:28 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Добавьте в свою таблицу дополнительное логическое поле, смысл которого, "Данные корректны". Т.е. пользователь может что угодно вводить или НЕ вводить, но пока не будут заполнены все поля обязательные к заполнению, причем корректно заполнены, поле-флаг не изменит своего значения. Соответственно, использовать в работе можно только те записи, у которых установлен этот самый признак о корректности и непротиворечивости данных. Для дерева, вероятно, дополнительным условием является корректность всех узлов-родителей на любом уровне. При такой организации работы Вы становитесь независимы от интерфейса и у Вас полностью "развязаны руки" Пользователь вводит что угодно и как угодно, просто часть введенных данных в программе не используется. Мусор, так в виде мусора и хранится (специальная меточка висит - это мусор ) и никак не влияет на приложение. Можно вместо дополнительного поля использовать дополнительную таблицу. Т.е. не до конца введенные данные физически хранятся в другой (буферной) таблице. После прохождения всех проверок копируются в "окончательную" таблицу. Хотя, конечно, организационно это значительно сложнее, ведь в этом случае нужен двусторонний обмен. Записи из постоянной таблицы могут оказаться в буферной, если пользователь что-то не корректно исправил. Но здесь можно запретить изменять ряд полей после создания окончательного варианта записей. В принципе, есть еще вариант. Создавать или изменять записи только и исключительно в дополнительной форме. Пока эту дополнительную форму не закрыли, изменения не сохраняются. Но это уже изменения интерфейса, что не всегда возможно. PS: Также есть вариант организации древовидной структуры на основе объекта Grid http://www.foxclub.ru/sol/solution668.php Вот здесь картинка, как это выглядит http://forum.foxclub.ru/read.php?29,370548,475187#msg-475187 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2015, 00:09 |
|
BindEvent()
|
|||
---|---|---|---|
#18+
Спасибо. :) Буду думать. Скорее всего откажусь от алярма на пропуск ввода обязательных данных. Собственно эти поля у меня и так подкрашиваются. на форме есть чекбокс - Сохранять не спрашивая. Если юзер минует кнопку Сохранить, то в зависимости от значения чекбокса либо просто не сохранять, либо сохранять принудительно. Ваши варианты с доптаблицами мне не подходят. Во первых, клиент-сервер. Во вторых, у меня и таблиц-то нет :) Источником данных для объектов редактирования служат курсоры, полученные командой sys. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2015, 00:44 |
|
|
start [/forum/moderation_log.php?user_name=POSTLOMASTER]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 9827ms |
total: | 10016ms |
0 / 0 |