Какое событие возникает при каждом изменении выбранного местоположения TDbGrid? - PullRequest
3 голосов
/ 17 ноября 2008

У меня есть TDbGrid в моем проекте, и я пытаюсь отключить событие каждый раз, когда меняю выбранную строку. Любое изменение в строке уже обновляет все элементы управления с поддержкой данных, связанные с тем же источником данных, но есть и другие изменения, для которых мне нужен обработчик событий.

Я думал, что OnColEnter будет работать. Согласно справочному файлу, он срабатывает, когда:

  • Пользователь перемещается к ячейке, используя клавиатура. Например, когда пользователь использует клавишу Tab или Home ключ.

  • Пользователь нажимает кнопку мыши вниз в камере.

  • SelectedField или SelectedIndex свойство установлено.

К сожалению, он не срабатывает, когда пользователь перемещается с помощью клавиатуры, когда включена опция dgRowSelect, и OnRowEnter отсутствует. И событие OnKeyDown срабатывает до изменения выбора. Я пытаюсь смоделировать версию TListBox с учетом данных, и мне нужно что-то, чтобы заменить обработчик OnClick List Box, который, несмотря на имя, фактически отключается при каждом изменении выбора, будь то с помощью мыши или клавиатуры. Есть ли способ сделать это с помощью TDbGrid? Если нет, то должен быть какой-то другой элемент управления сеткой, который это сделает. Кто-нибудь знает, что это? (Желательно с открытым исходным кодом?)

Ответы [ 4 ]

8 голосов
/ 17 ноября 2008

Вы пробовали событие OnDataChange DataSource?

3 голосов
/ 17 ноября 2008

OnDataChange - это один из вариантов. Другое, на стороне TDataset, событие AfterScroll. В большинстве случаев я находил это более практичным, чем OnDataChange; потому что в OnDataChange событие прокрутки приходит с параметром Field nil (который является ловушкой и может быть одной из причин, по которой ваши AV его кодируют).

2 голосов
/ 17 ноября 2008

Используйте OnDataChange и для обработки случая, когда вы загружаете набор данных, добавьте логическую проверку в качестве первой строки подпрограммы и установите для этого параметра значение false, когда загрузка завершена.

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if fbLoading then exit;
  // rest of your code here
end;

procedure TForm1.Form1Create(Sender:tObject);
begin
  fbLoading := true;
  // load your table here     
  fbLoading := false; 
end;
1 голос
/ 17 ноября 2008

Я бы использовал AfterScroll только для набора данных, он запускается при первом открытии набора данных и при каждом его перемещении. В DBGrid это будет при каждом щелчке по строке, на полосе прокрутки или при использовании клавиатуры (Home, Edn, Up, Down, PgUp, PgDown) ... и т. Д.

Вы могли бы даже динамически назначить его, если бы вы использовали один и тот же набор данных в разных формах (в Create / Free или Show / Close):

procedure TForm1.myAfterScroll(DataSet: TDataSet); 
begin
   //do your thing here
   if oldAfterScroll<>nil then
      oldAfterScroll(DataSet);
end;

constructor TForm1.Create(AOwner: TComponent);
begin
   oldAfterScroll:=DBGrid1.DataSet.OnAfterScroll;
   DBGrid1.DataSet.OnAfterScroll:=myAdrerScroll;
end;

destructor TForm1.Free;
begin
   DBGrid1.DataSet.OnAfterScroll:=oldAfterScroll;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...