2016-04-12 9 views
1

У меня есть компонент StringGrid в Delphi. Я бы хотел поймать, когда пользователь нажимает на фиксированные ячейки (заголовок).Delphi XE3 stringgrid событие со стационарной ячейкой не срабатывает

Когда я связал событие FixedCellClick с сеткой, событие может обнаружить только щелчок левой кнопкой мыши. Если я попробую сделать это с помощью правой кнопки, ничего не произойдет.

procedure TForm1.StringGrid1FixedCellClick(Sender: TObject; ACol, ARow: Integer); 
begin 
    ShowMessage(''); 
end; 

Какое решение?

ответ

2

Как вы нашли, события Click обычно связаны с действиями левой кнопки мыши. Для управления событиями кнопки мыши более широко используются события Mouse.

В этом случае вы можете использовать событие OnMouseButtonDown.

Примечание: Это не точно соответствуют «щелчок», так как это происходит в ответ на начальной мыши вниз события, а не надежно реагировать на мышь-вниз прослежены по-а-мышь- в той же области контроля.

Однако, это часто достаточно хорошо.

OnMouseButtonDown событие включает в себя параметр, который идентифицирует Button участвует и мышь X и Y позиций. Он также включает ShiftState для обнаружения состояний клавиш Ctrl и/или Shift во время события (если это необходимо).

Вы можете использовать их для обнаружения правой кнопки мыши нажата в ваших фиксированных строк/столбцов:

procedure TfrmMain.StringGrid1MouseDown(Sender: TObject; 
             Button: TMouseButton; 
             Shift: TShiftState; 
             X, Y: Integer); 
var 
    grid: TStringGrid; 
    col, row: Integer; 
    fixedCol, fixedRow: Boolean; 
begin 
    grid := Sender as TStringGrid; 

    if Button = mbRight then 
    begin 
    grid.MouseToCell(X, Y, col, row); 

    fixedCol := col < grid.FixedCols; 
    fixedRow := row < grid.FixedRows; 

    if (fixedCol and fixedRow) then 
     // Right-click in "header hub" 

    else if fixedRow then 
     // Right-click in a "column header" 

    else if fixedCol then 
     // Right-click in a "row header" 

    else 
     // Right-click in a non-fixed cell 
    end; 
end; 
1

TStringGrid является жестко запрограммированным для запуска события OnFixedCellClick только для щелчков левой кнопки мыши. Для щелчков правой кнопки нет события. Вам придется либо изменить исходный код TStringGrid, либо вывести пользовательский компонент из TStringGrid, чтобы вы могли переопределить виртуальный метод MouseUp().