Каков стандартный способ в Delphi 5 наблюдать за изменением выбора в DBGrid?

У меня есть много форм "мастер / деталь" в моем приложении. TDBGrid, где каждая строка показывает несколько основных значений элемента. Под сеткой обычно находится "Область сведений", которая показывает полную информацию об элементе, который в данный момент выбран в сетке.

В настоящее время я слушаю "AfterScroll"- событие TADOQuery за сеткой, но, похоже, оно дает мне слишком много событий.

Является ли AfterScroll правильным событием для этого? Как ты это делаешь?

2 ответа

"Стандартный" способ (в среде, учитывающей данные) состоит в том, чтобы не управлять этим с помощью элементов управления GUI, а использовать компоненты данных.

Большинство наборов данных таблицы обеспечивают MasterSource (связано с соответствующим TDataSource компонент) и MasterFields свойства. Вы используете их, чтобы связать ваши наборы данных в отношениях мастер-детали. Тогда ваша детальная сетка (или другие элементы управления с учетом данных ) должны заботиться только о связях с правильным набором данных.

РЕДАКТИРОВАТЬ
Другие виды наборов данных (например, TQuery, TADOQuery) иногда предоставляют DataSource использоваться для аналогичной цели. Из Delphi 5 помогите: Set DataSource to automatically fill parameters in a query with fields values from another dataset."
Тем не менее, есть еще несколько осложнений (как будет видно при чтении справки). Так что может быть целесообразно использовать TTable или же TADOTable вместо подробного набора данных.

Я не знаю, есть ли какой-нибудь "стандартный" способ, но ИМО AfterScroll Это хорошо. Используйте таймер, чтобы предотвратить быстрое обновление элементов управления, например, при прокрутке сетки. Пример:

procedure TSomeForm.DataSetAfterScroll(DataSet: TDataSet);
begin
  if not DataSet.ControlsDisabled then begin
    if ScrollTimer.Enabled then
      ScrollTimer.Enabled := False;
    ScrollTimer.Enabled := True;
  end;
end;

procedure TSomeForm.ScrollTimerTimer(Sender: TObject);
begin
  ScrollTimer.Enabled := False;
  UpdateGUI;
end;

Я думаю, что вы найдете интервал в 250-300 мс приятным.

Другие вопросы по тегам