Я такое делал, но чтобы можно было не только кликать, но и перемещать мышь с зажатой клавишей.
Если тебе нужно только нажатие, то всё довольно просто (SG = твой StringGrid):
1. объявляем двумерный массив A (динамический, если размеры сетки заранее неизвестны) размером [0..SG.RowCount-1,0..SG.RowCount-1] с элементами типа Boolean
2. в SG.OnMouseDown пишем код, получающий координаты ячейки под курсором мыши (например,
pt := SG.ScreenToClient(Mouse.CursorPos);
pt := TPoint(SG.MouseCoord(pt.X,pt.Y));
) и присваиваем элементу массива с полученными индексами обратное значение (
A[pt.X,pt.Y] := not A[pt.X,pt.Y];
); главное - не забыть проверить, что pt.X или pt.Y равно -1 (т.е. курсор не находится с области какой-либо ячейки). Ну и, собственно, SG.Invalidate;
3. SG.DefaultDrawing = false
4. в SG.OnDrawCell пишем
with (Sender as TStringGrid).Canvas do begin
if A[ACol,ARow] = true then
Brush.Color := clBlack
else
Brush.Color := clWhite;
FillRect(Rect);
end;