Задать вопрос
@KTG

Delphi. DBGridEh. Как получить данные ячейки при наведении на неё курсора мыши?

Хочу при наведении на ячейку DBGridEh получать ID записи и что бы в правой части ячейки появлялась кнопка.
Кнопка одна для всех записей, представляет из себя TPanel в инвизе с событием OnClick.

Я навожу курсор мыши на ячейку, панель перемещается в нужно место, меняет свойство Visible и Enable на true, в её событии нажатия обрабатываю запись с ID в этой же ячейки. (Выбранная запись в DBgridEh не меняется).

Нашел такой способ:
procedure TFSprav.DBGridEh2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 grCoord: TGridCoord;
 aGrid: TCrackDBGrid;
 NewActiveRecord, oldActiveRecord: integer;
 delta: string;
begin
  aGrid := TCrackDBGrid(Sender);
  grCoord := aGrid.MouseCoord(X, Y);
    aGrid.DataSource.DataSet.DisableControls;
      oldActiveRecord := aGrid.DataLink.ActiveRecord; // запоминаем текущую строку (отображаемую) не номер записи
      newActiveRecord := grCoord.Y - aGrid.DataLink.ActiveRecord; // получаем положение строки на которой наведена мышка.
    aGrid.DataLink.MoveBy(newActiveRecord);
    delta := aGrid.DataLink.DataSet.FieldByName('Name').AsString;
   if grCoord.X > 0 then
    begin
     caption := delta;
    end;
   aGrid.DataLink.ActiveRecord := oldActiveRecord; // возвращаем положение к изначальной строке
   aGrid.DataSource.DataSet.EnableControls;
end;


Но возникла трудность.
На DataSource стоит обработчик события OnDataChange, который передает ID выбранной в гриде записи в параметры другого ADOQuery.

По отдельности оба методы работают, а вместе - нет. Программа залипает в тот момент когда происходит MoveBy у DataSet при изменении положения курсора, он вызывает событие OnDataChange, что при перерисовке видимо опять получает положение мыши и вызывает MoveBy и так по кругу, пока курсор мыши не уберу с грида.

Как поправить?
  • Вопрос задан
  • 2918 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@KTG Автор вопроса
type
  TCrackDBGrid = class(TDBGridEh)
  end;
...
var
  MoveFlag: integer;
...
procedure TFSprav.DBGridEh2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
 grCoord: TGridCoord;
 aGrid: TCrackDBGrid;
 NewActiveRecord, oldActiveRecord: integer;
 delta: string;
begin
  if MoveFlag <> 1 then
    begin
      MoveFlag := 1;
      aGrid := TCrackDBGrid(Sender);
        grCoord := aGrid.MouseCoord(X, Y);
        aGrid.DataSource.DataSet.DisableControls;

          oldActiveRecord := aGrid.DataLink.ActiveRecord; 
          newActiveRecord := grCoord.Y - aGrid.DataLink.ActiveRecord; 

      aGrid.DataLink.MoveBy(newActiveRecord);
      delta := aGrid.DataLink.DataSet.FieldByName('Name').AsString;

      if grCoord.X > 0 then
        begin
         caption := delta;
        end;

     aGrid.DataLink.ActiveRecord := oldActiveRecord;
     aGrid.DataSource.DataSet.EnableControls;

      MoveFlag := 0;
    end;
end;


procedure TFSprav.dsMainCatDataChange(Sender: TObject; Field: TField);
begin
  if MoveFlag = 0 then
  begin
  qCat.Active := false;
    qCat.Parameters.ParamByName('id_MainCat').Value := dsMainCat.DataSet.FieldByName('id').AsInteger;
  qCat.Active := true;
  end;

end;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
streetflush
@streetflush
Ну дак в момент MoveBy
DBGridEh2.OnMouseMove := nil
а после манипуляций
DBGridEh2.OnMouseMove := DBGridEh2MouseMove
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
aGrid := TCrackDBGrid(Sender);
Не надо ломать DBGridEh.
А перемещаться нужно не по сетке, а по записям, используя Bookmark для фиксации позиции и MoveBy для её изменения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы