![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
onFilterRecord [D5, Paradox]
td © (2004-04-15 22:40:00)В событии Table1.OnFilterRecord(DataSet: TDataSet; var Accept: Boolean) при выполнении обработчика каким-то образом получается так, что DataSet - это вовсе не та таблица, которой это событие присвоено.
Это может влиять, что событие я динамически присваиваю?
(Таблица фильтруется по некоторой зависимости от значения одного из полей). Т.е. мне надо получить сначала значение поля Field1.
Было написано так (утрируя): s:=DataSet.FieldByName('Field1').AsString;
Accept:=Table2.Locate('ID',s,[]);
(Ну т.е. если в Table2 находятся записи, которые каким-то образом соответсвуют текущей записи Table1, то она Accept:=true).
Но почему-то датасетом оказалась таблица, которую я фильтрую до этого, т.е. Table2!!
И вот еще - попробовал обойти, написал так:
s:=Table1.FieldByName('Field1').AsString;
Тогда s вместе с обработчиком не перемещается по всем записям набора данных, а остается все время на первой!
Почему так происходит?
Спасибо!
td (2004-04-16 17:57:00) [1]
> ЮЮ © (16.04.04 09:32) [10]
Да-аа.. пожалуй, что так. Сегодня, когда заметил, что потер одну строку случайно, все чудесным образом разрешилось и заработало в любых ситуациях, но стало ужасно тормозить!!
Всем спасибо за помощь!
ЮЮ (2004-04-16 09:32:00) [2]TTable + OnFilterRecord + Locate
Не пора ли переходить на запросы? (вопрос риторический :)
tERRORist (2004-04-16 09:25:00) [3]td говорил что обработчики разные...
Но вот когда идет локейт по Тэйбл2, действительно может многократно вызываться ОнФильтерТэйбл2. Попробуй отрубать Table2.Filtered на время локейта
ЮЮ (2004-04-16 09:18:00) [4]>Но почему-то датасетом оказалась таблица, которую я фильтрую до этого, т.е. Table2!!
Что значит фильтрую до этого. Фильтрация производится непрерывно. К чему, думаешь, приведёт Table2.Locate('ID',s,[])?. К сканированию Table2 и , соответственно, вызову этого же обработчика, но для DataSet=Table2 ! И только после туевой хучи вызовов этого обработчика, вызванного этим Locate, продолжится выполнение обработчика для DataSet=Table1
Напиши разные обработчики для фильтрации Table2 и Table1. По крайней мере будешь понимать где нахожишься
td (2004-04-16 09:15:00) [5]не связаны :(
мистика какая-то
tERRORist (2004-04-16 09:08:00) [6]А таблицы не связаны друг с другом как мастер-детайл? Или может где-то еще прописано их взаимодействие, которое блокирует перемещение по Table1
Reindeer Moss Eater (2004-04-16 08:58:00) [7]Даже если обработчик один, параметр-то передаваемый в него все равно будет тот датасет в котором фильтрация происходит.
Если только он руками (зачем-то) не вызван
Form1.OnFilterRecord(AnotherDataSet,AAccept);
td (2004-04-16 08:48:00) [8]присвоения при создании формы.
Потому что в других формах другой механизм фильтрации.
Filtered делаю
nil попробую..
Так все же, почему, если обращаться не имени к набору данных
s:=Table1.FieldByName('Field1').AsString;
то получается, что курсор остается на одной и той же строке?
Это так и должно быть, да?
kaif (2004-04-16 03:19:00) [9]Когда происходят присвоения обработчиков? Пробовал ли перед присвоением сначала присваивать им nil? Делаешь ли после присвоения обработчика какие-то refresh или хотя бы
Filtered := False;
Filtered := True;
Почему пришлось обработчики присваивать динамически?
td (2004-04-15 23:01:00) [10]нет, конечно :)
Тем более, что они оба присваиваются динамически. Я думаю, может, в этом дело?
Тем более, эта дрянь обнаружилась только в особой последовательности действий. В прочих ситуациях все работает по-задуманному.
tERRORist (2004-04-15 22:50:00) [11]Случайно этот же обработчик у второго Тэйбла2 не стоит?
Может они оба ссылаются на Table1OnFilterRecord