Имитировать щелчок мышью по ячейке в TDBGrid

Как можно имитировать щелчок мышью по какой-либо ячейке в TDBGrid?


person userPro    schedule 25.08.2016    source источник
comment
@RBA: похоже, это не отвечает на конкретный вопрос ОП?   -  person MartynA    schedule 25.08.2016
comment
Зачем вам нужно имитировать щелчок в ячейке? Если вы знаете строку и столбец, с которыми вам нужно работать, просто напишите код для этого. Затем, если вы хотите, чтобы то же самое происходило при фактическом щелчке по ячейке, просто вызовите этот код в обработчике OnCellClick. Или вы не знаете, как это сделать?   -  person MartynA    schedule 25.08.2016
comment
@MartynA иногда возникает проблема, когда я пытаюсь удалить запись .. Но когда я выбираю какую-либо ячейку в моей текущей строке, удаление выполняется! ..   -  person userPro    schedule 25.08.2016
comment
ИМО, вы делаете что-то не так, когда удаляете запись, и теперь вы хотите сделать что-то еще хуже, чтобы решить эту проблему.   -  person kobik    schedule 25.08.2016
comment
Если это связано с проблемой, с которой вы столкнулись в этом q stackoverflow.com/questions/39118837/, вам лучше разобраться в сути этой проблемы и исправить ее. Кстати, с учетом того, что вы сказали, прежде чем продолжить то, что я сказал в своем ответе на этот вопрос, попробуйте вызвать `DBGrid1.Perform(WM_LButtonUp, 0, 0) и посмотреть, будет ли дальше выполняться ваше удаление.   -  person MartynA    schedule 25.08.2016
comment
Я обновил свой ответ, включив в него более простой код, не связанный с событием OnCellClick.   -  person MartynA    schedule 25.08.2016


Ответы (1)


Обновление:

Этот код должен делать то, что вы хотите:

type
  TMyDBGrid = class(TDBGrid);

function TForm1.GetCellRect(ACol, ARow : Integer) : TRect;
begin
  Result := TmyDBGrid(DBGrid1).CellRect(ACol, ARow);
end;

procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift:
    TShiftState; X, Y: Integer);
var
  Coords : TGridCoord;    
begin
  Coords := DBGrid1.MouseCoord(X, Y);
  Caption := Format('Col: %d, Row: %d', [Coords.X, Coords.Y]);
end;

procedure TForm1.SimulateClick(ACol, ARow : Integer);
type
  TCoords = packed record
    XPos : SmallInt;
    YPos : SmallInt;
  end;
var
  ARect : TRect;
  Coords : TCoords;
begin
  ARect := GetCellRect(ACol, ARow);
  Coords.XPos := ARect.Left;
  Coords.YPos := ARect.Top;
  DBGrid1.Perform(WM_LButtonUp, 0, Integer(Coords));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SimulateClick(StrToInt(edX.Text), StrToInt(edY.Text));
end;

Функция MouseCoord TDBGrid преобразует пару координат (X, Y) в номер столбца (TGridCoord.X) и номер строки ((TGridCoord.Y).

Событие OnMouseUp отображает результаты вызова DBGrid1.MouseCoord для входных аргументов X и Y.

SimulateClick имитирует щелчок по ячейке сетки. Он использует GetCellRect для получения координат (в DBGrid) верхнего левого угла указанной ячейки, а затем вызывает Perform(WM_LButtonUp,...) в DBGrid, передавая координаты в аргументе LParam.

Наконец, Button1Click вызывает SimulateClick, используя значения Col и Row из пары TEdit. Это приводит к срабатыванию события OnMouseUp и отображению номера столбца и строки, так что вы можете убедиться, что это имеет тот же эффект, что и щелчок мышью по соответствующей ячейке.

person MartynA    schedule 25.08.2016
comment
когда я использую DBGrid1.Perform(WM_LButtonDown, 0, Integer(Coords)); перед «UP», я получаю то, что мне нужно .. ячейка с Coords выбирается и становится «сфокусированной» .. thx! - person userPro; 25.08.2016
comment
@userPro: Рад, что ты разобрался. На самом деле, я хотел бы вернуться к вашему вопросу об удалении записи и посмотреть, сможем ли мы решить эту проблему - я отправлю вам кое-что в своем ответе с некоторыми предложениями / вопросами по вашему вопросу. - person MartynA; 25.08.2016