Добрый день.
1
Цитата:
Я понимаю, что вам приходится перемещаться по записям. Я как раз и имею в виду, почему бы до окончания этого поиска не отключать пользовательские события DataSet.BeforeScroll и DataSet.AfterScroll? Это было бы логично и правильно.
Грид отключает события в цепочки DataSource-Dataset используя стандартный метод отключения событий DisableControls. Но события DataSet.Before… и DataSet.After… являются неотключаемыми. Предполагается что разработчик должен использовать эти события, когда нужны события, которые будут вызываться всегда, при любом перемещении по DataSet'у, в любом режиме.
Цитата:
Иначе, я не нахожу ни одного адекватного способа определить окончание поиска и последнее перемещение, чтобы однократно выполнить на AfterScroll достаточно емкую обработку.
Можно предложить несколько вариантов решения.
1.1 Перенести логику выполнения операции на изменение текущей записи в отключаемое событие DataSource.OnDataChange
1.2 Написать свою версию поиска, и в ней отключать нужные события.
Вызов поиска проходит через виртуальный метод TDBGridEhCenter.DefaultLocateText
Вы можете написать свой класс TMyDBGridEhCenter и зарегистрировать его как класс используемый для всех гридов проекта.
Код:
type
TMyDBGridEhCenter = class(TDBGridEhCenter)
function DefaultLocateText(AGrid: TCustomDBGridEh; const FieldName: string; const Text: String; Options: TLocateTextOptionsEh; Direction: TLocateTextDirectionEh; Matching: TLocateTextMatchingEh; TreeFindRange: TLocateTextTreeFindRangeEh; TimeOut: LongWord = 0; CheckValueEvent: TCheckColumnValueAcceptEventEh = nil): Boolean; override;
end;
{ TMyDBGridEhCenter }
function TMyDBGridEhCenter.DefaultLocateText(AGrid: TCustomDBGridEh;
const FieldName, Text: String; Options: TLocateTextOptionsEh;
Direction: TLocateTextDirectionEh; Matching: TLocateTextMatchingEh;
TreeFindRange: TLocateTextTreeFindRangeEh; TimeOut: LongWord;
CheckValueEvent: TCheckColumnValueAcceptEventEh): Boolean;
var
OldAfterScroll: TDataSetNotifyEvent;
begin
OldAfterScroll := AGrid.DataSource.DataSet.AfterScroll;
AGrid.DataSource.DataSet.AfterScroll := nil;
Result := inherited DefaultLocateText(AGrid, FieldName, Text,
Options, Direction, Matching, TreeFindRange, TimeOut, CheckValueEvent);
AGrid.DataSource.DataSet.AfterScroll := OldAfterScroll;
end;
initialization
SetDBGridEhCenter(TMyDBGridEhCenter.Create);
end.
2.
Цитата:
Как обойти ошибку я знаю, мне даже проще проверять 1-й проверяемый контрол на равенство nil. Я понимаю, что в принципе, это не вина библиотеки.
Наверно контрол на форме не должен отключать все или часть событий в других контролов когда он это считает нужным, иначе он может просто сломать логику работы формы в части уже написанных приложений.
3.
Цитата:
Если я правильно понимаю, то при сворачивании узла DataSet фильтруется?
Именно так. Сворачиваемые записи скрываются в гриде с помощью стандартного механизма фильтрации.
Переход на отфильтрованную запись простым способом невозможен.