![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
отрубить DataSource но без DisableControls [D7]
leolick © (2005-08-08 21:45:00)Пишу компоненту и хочу посчиталь номер текущей логической записи с учетом всех индексов фильтров и всяких запрсов... Стандартной такой функции нет... :( Пытаюсь написать..... вроде все выходит а когда добавляю эту функцию в обработчик события DataChange компанента DataSource эта редиска залазит в бесконечный цыкл. Пытался отрубить DisableControls но при обратном подключении срабатывает опять DataChange, и все по кругу... что делать подскажите ПЛИЗЗЗЗЗЗЗЗЗЗЗЗ!!!!! Нужно срочнои позарез... допишу компоненту поделюсь, если понадобится, или алгоритмом...
leolick (2005-08-09 19:23:00) [1]DataChange вызывается при любом изменении номера записи (переходе на другую), при обновлении (Refresh), при открытии и закрытии таблиц и при вызове DisableControls... А зацыкливание вызывает компонент DataSource. Чтото такое уже пробовал... Попробую и этот вариант. Спасибо!!!Если будут идеи как лучше избавится от этого гемороя пишите. Зарание Спасибо!
Наиль (2005-08-09 15:10:00) [2]Моих скудных знаний по DBComponents хватает, чтобы вспомнить, что DataChange вызывается всегда, когда изменяется содержимое FieldValues. Например, при вызове Next. Так что думаю дело не в изменении, а в переборе данных.
Юрий Зотов (2005-08-09 10:01:00) [3]Хотя, по здравом размышлении - что-то тут не так. DataChange означает любое изменение данных и если возникает рекурсия - значит, Ваша функция их как-то меняет. Хотя, если исходить из ее назначения, делать этого, вроде как, не должна. Поэтому я бы проверил, не портит ли она данные.
Юрий Зотов (2005-08-09 03:20:00) [4]А если еще добавить try-finally, то все станет вполне надежно:
procedure TMyComponent.MyProc;
begin
if not FIamBusy then
begin
FIamBusy := True;
try
...
finally
FIamBusy := False
end
end
end;
Буква F добавлена к IamBusy не случайно - это должно быть поле компонента.
Наиль (2005-08-08 22:17:00) [5]Не вникая в суть компонентов баз данных, могу предложить следующее.
private
IamBusy:boolean;
...
Constructor ___.Create
Begin
IamBusy:=false;
....
End;
Function ___.MyFunction;
Begin
if IamBusy then Exit;
IamBusy:=true;
....
IamBusy:=false;
End;
Данный код быстро лечит бесконечные циклы.
Уверен, что в твоём случае есть другой выход, но если ничего другого не предложат, то пользуйся этим.