Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSet.OnAfterScroll и Next / 9 сообщений из 9, страница 1 из 1
28.04.2007, 13:54
    #34495467
Artemiy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
Добрый день
У меня есть датасет (TSmartQuery, ODAC) у него на обработчике OnAfterScroll висит определенный нужный код.
Так же есть операции, которые требуют полного прохода Next'ом по датасету. При этом обработчик срабатывает каждый раз, тратится много времени, хотя мне это не нужно, мне достаточно что бы этот обработчик сработал в конце массовой операции.
Вопрос: Можно ли штатными средствами заблокировать (отключить) этот обработчик на время прохода по датасету?

Для контролов я делаю DisableControls, но на выполнение этого обработчика это не влияет.
Ничего умнее кроме следующих методов я не придумал.
1. Перед началом массовой операции запомнить обработчик и прописать в него nil, а после операции восстановить;
2. Городить свои блокировки в виде выставления глобального флажка.

Хотя первый способ достаточно эффективен и красив, интересует наличие стандартных средств для решения этой проблемы.
...
Рейтинг: 0 / 0
28.04.2007, 14:31
    #34495629
Ска
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
Artemiy
интересует наличие стандартных средств для решения этой проблемы.

Ровно такие, какие вы перечислили...
Artemiy
Так же есть операции, которые требуют полного прохода Next'ом по датасету.

ИМХО : Наверняка, от такой операции можно избавиться...
...
Рейтинг: 0 / 0
28.04.2007, 14:31
    #34495630
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
Первой строкой процедуры AfterScrool должна быть:

Код: plaintext
1.
2.
3.
 procedure  TfrmTitle.odsMainAfterScroll(DataSet: TDataSet);
 begin 
    If  DataSet.ControlsDisabled  Then  Exit;
   ...
...
Рейтинг: 0 / 0
28.04.2007, 14:34
    #34495641
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
А вообще непонятно зачем делать в AfterScroll единичную операцию.
...
Рейтинг: 0 / 0
28.04.2007, 14:48
    #34495702
Artemiy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
ozА вообще непонятно зачем делать в AfterScroll единичную операцию.
В AfterScroll выполняется код ответственный за отслеживание выделенного объекта:
реализована сложная система выделения, как в нортон коммандере, у объекта есть ИД, тип, у формы есть массив выделенных объектов. По этой структуре потом определяется доступность актионов и типы возможных операций над выделенными объектами, производится раскраска грида.

Ска
ИМХО : Наверняка, от такой операции можно избавиться...
От таких операций избавится нельзя, потому что это все операции вида: выделить все (а значит пройтись по датасету и занести в структуру ИДы и типы), инвертировать, выделить по значению и т.д.

ozПервой строкой процедуры AfterScrool должна быть:
Код: plaintext
1.
2.
3.
 procedure  TfrmTitle.odsMainAfterScroll(DataSet: TDataSet);
 begin 
    If  DataSet.ControlsDisabled  Then  Exit;
   ...

Такой вариант расмотрен, ладно он все равно медленней чем с обнулением и восстановлением обработчика.

Вообщем спасибо, вопрос исчерпан, остается как есть с обнулением обработчика, меня это решение устраивает.
...
Рейтинг: 0 / 0
28.04.2007, 15:12
    #34495823
oz
oz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
Ну, примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
...
    If  DataSet.ControlsDisabled  Then  Exit;
   
    Try       
      dbgUsers.DataSource.DataSet.DisableControls;
       If  (dbgUsers.SelectedRows.Count =  0 )  Or  (dbgUsers.SelectedRows.Count =  1 )  Then   Begin 
         TempID:=dbgUsers.DataSource.DataSet.FieldByName('ID').AsInteger;
         ...
       End   Else   Begin 
          For  i:= 0   To  dbgUsers.SelectedRows.Count -  1   Do   Begin 
            dbgUsers.DataSource.DataSet.GotoBookmark(Pointer(dbgUsers.SelectedRows.Items[i]));
            TempID:=dbgUsers.DataSource.DataSet.FieldByName('ID').AsInteger;
            ...
          End ;
    Finally 
      dbgUsers.DataSource.DataSet.EnableControls;
    End ;
   ...
...
Рейтинг: 0 / 0
28.09.2007, 01:24
    #34833169
xplosn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
можно поместить код процедуры в AfterOpen, а в конце присвоить ивенту:

ADOQueryXXX.AfterScroll:=ADOQueryXXAfterOpen;
...
Рейтинг: 0 / 0
28.09.2007, 13:03
    #34834363
Ega
Ega
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
Вообще-то такие вещи в TDataSource.OnDataChange надо помещать.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
11.02.2021, 08:43
    #40044278
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataSet.OnAfterScroll и Next
1
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / DataSet.OnAfterScroll и Next / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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