StringGrid Cells Delphi

Я написал некоторый код, который окрашивает отдельные ячейки в моей сетке строк в моем приложении delphi в соответствии со списком данных.

Теперь мне нужно написать код в OnDblClick событие в моей цепочке строк, которое определяет, будет ли ячейка окрашена, и затем будет продолжаться в соответствии с найденным результатом. Например:

DOUBLE CLICK CELL  
IS CELL COLOURED  
  YES > PROCEED A  
  NO > PROCEED B

1 ответ

Сохраните цвет в тот момент, когда вы рисуете его в предопределенном TStringGrid.Objects имущество. Когда вам нужно получить его, вы можете получить его обратно из Column а также Row координаты. Вот тривиальный пример, который хранит либо clWhite или же clBlack в Objects для ячейки в зависимости от того, является ли столбец с нечетным номером, и просто отображает сохраненное значение в виде строки, когда ячейка выбрана. Это должно помочь вам начать.

procedure TForm1.FormCreate(Sender: TObject);
var
  r, c: Integer;
const
  ColorSel: array[Boolean] of TColor = (clWhite, clBlack);
begin
  StringGrid1.RowCount := 10;
  StringGrid1.ColCount := 6;
  for c := 1 to StringGrid1.ColCount - 1 do
    for r := 1 to StringGrid1.RowCount - 1 do
    begin
      StringGrid1.Cells[c, r] := Format('C: %d R: %d', [c, r]);
      StringGrid1.Objects[c, r] := TObject(ColorSel[Odd(c)]);
    end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  ShowMessage(ColorToString(TColor(StringGrid1.Objects[ACol, ARow])));
end;

Вы можете использовать это в OnMouseUp Событие легко обнаружить, какой цвет в клетке. Удалить StringGrid1SelectCell (используя инспектор объектов, просто удалите значение для события) и добавьте его как OnMouseUp событие для сетки вместо:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Col, Row: Integer;
begin
  StringGrid1.MouseToCell(X, Y, Col, Row);
  if (Col > -1) and (Row > -1) then
    ShowMessage(ColorToString(TColor(StringGrid1.Objects[Col, Row])));
end;

Обработка двойного щелчка становится довольно легкой (спасибо @TLama за большую помощь):

procedure TForm1.StringGrid1DblClick(Sender: TObject);
var
  IsDefaultColor: Boolean;
  CurrCellColor: TColor;
  CurrCol, CurrRow: Integer;
begin
  // Save typing by grabbing the currently selected cell col/row
  CurrCol := StringGrid1.Col;   
  CurrRow := StringGrid1.Row;

  // Get the stored color for the selected cell
  CurrCellColor := TColor(StringGrid1.Objects[CurrCol, CurrRow]);

  // See if it's been painted a different color than the default
  IsDefaultColor := (CurrCellColor = StringGrid1.Color);

  if not IsDefaultColor then
    HandleDifferentColorCell
  else
    HandleNormalColorCell;
end;

Обратите внимание, что если вы решите не изменять цвет ячейки, вам все равно следует назначить цвет ячейки по умолчанию для Objects[Column, Row] так что там есть что-то значимое, чтобы избежать неправильного преобразования при извлечении значения.

Другие вопросы по тегам