Delphi StringGrid HighLight行和列

时间:2015-07-30 13:19:15

标签: delphi

我有一个StringGrid,我在固定行上着色,列在单击单元格的位置。所以到目前为止看起来像这样:

enter image description here

为了做到这一点,我使用了这段代码:

procedure TForm2.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  md: integer;
begin
  with sg do
    begin
   Canvas.Brush.Color:= clwhite;
   if ((sg.Row = ARow)and(ACol=0)) or ((sg.Col = ACol)and(ARow=0)) then
      Canvas.Brush.Color:= $00FFDE9B; //your highlighted color
   Canvas.FillRect(Rect);
   Canvas.TextOut(0, Rect.top + 4, cells[ACol, ARow]);
  end;
  if gdSelected in State then
    sg.Canvas.DrawFocusRect(Rect);
end;

当然还有OnMouseDown中的无效。

procedure TForm2.sgMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  sg.invalidate;
end;

现在,我想为顶部的所有选定行着色。因此,与图像一样,选择了4个单元格,但固定区域中只有一个单元格为蓝色(Col 4)。我希望所有相应的固定单元格都是蓝色的。 (在这种情况下:第4栏,第5栏,第6栏,第7栏)

有什么想法吗?

修改

这个想法是用鼠标选择时显示选择,而不是用SHIFT + Click

1 个答案:

答案 0 :(得分:1)

改善不大

procedure TForm3.sgDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
  md: integer;
begin
  with sg do
    begin

   Canvas.Brush.Color:= clwhite;

   if ( (Arow >=selection.Top) and (Arow<=selection.Bottom) and(ACol=0)) or
      ( (ACol>=selection.Left) and (Acol<=selection.Right) and(ARow=0)) then
         Canvas.Brush.Color:= $00FFDE9B; //your highlighted color
   Canvas.FillRect(Rect);
   Canvas.TextOut(0, Rect.top + 4, cells[ACol, ARow]);
  end;
  if gdSelected in State then
    sg.Canvas.DrawFocusRect(Rect);
end;

procedure TForm3.sgMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
      if (ssLeft in shift) then sg.Invalidate;
end;

这将突出显示行whitout帮助函数。