Эквивалент Firemonkey MouseToCell

В Delphi VCL, если бы я хотел увидеть, над какой ячейкой (столбцом и строкой) TStringGrid находится моя мышь, я бы использовал MouseToCell. Этот метод больше не используется в Delphi (XE2) для приложений FireMonkey. Кто-нибудь знает, как я могу определить ячейку, над которой находится моя мышь? OnMouseMove имеет значения X и Y, но это координаты экрана, а не координаты ячейки.

Большое спасибо.


person Ian Francis    schedule 24.09.2013    source источник


Ответы (2)


На самом деле в TCustomGrid есть метод MouseToCell, от которого StringGrid наследует, но он закрытый. Глядя на его источник, он использует методы ColumnByPoint и RowByPoint, которые, к счастью, общедоступны.

«Столбец» возвращает TColumn или ноль, если столбца нет. «Строка» возвращает положительное целое число или -1, если строки нет. Кроме того, первая строка не заботится о количестве строк, она просто учитывает высоту строки и возвращает номер строки на основе этого, даже если строк нет. Кроме того, я должен отметить, что поведение в заголовке сетки ошибочно. В любом случае пример примера может быть таким:

procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  Col: TColumn;
  C, R: Integer;
begin
  Col := StringGrid1.ColumnByPoint(X, Y);
  if Assigned(Col) then
    C := Col.Index
  else
    C := -1;
  R := StringGrid1.RowByPoint(X, Y);

  Caption := Format('Col:%d Row:%d', [C, R]);
end;
person Sertac Akyuz    schedule 25.09.2013

TStringGrid имеет методы ColumnByPoint и RowByPoint.

ColumnByPoint и RowByPoint идут по координатам сетки строк. Итак, если вы используете OnMouseOver струнной сетки, параметры X и Y уже будут в координатах струнной сетки.

Вот как отобразить строку и столбец (на основе 0) в сетке строк OnMouseOver:

var
  row: Integer;
  col: TColumn;
  colnum: Integer;
begin
  row := StringGrid1.RowByPoint(X, Y);
  col := StringGrid1.ColumnByPoint(X, Y);
  if Assigned(col) then
  begin
    colnum := col.Index;
  end
  else
  begin
    colnum := -1;
  end;
  Label1.Text := IntToStr(row) + ':' + IntToStr(colnum);
end;

Обратите внимание, что -1 будет отображаться за пределами строк и столбцов.

person Marcus Adams    schedule 25.09.2013
comment
Большое спасибо ребята :) - person Ian Francis; 25.09.2013
comment
@SertacAkyuz, обычно ТАК показывает мне, когда есть другой ответ, пока я пишу свой. На этот раз нет. Я решил, что, поскольку я потратил на это так много времени, и в нем есть дополнительная информация, я бы просто оставил его. - person Marcus Adams; 25.09.2013
comment
@Маркус - Хорошо. Спасибо, что рассказали. Мне было немного любопытно.. :) - person Sertac Akyuz; 25.09.2013