2

我试图在网格的单元格中显示一个充满绿色/红色的指示性圆圈,而没有描边颜色。网格显示了许多其他类似的实体,但也可以有一个数值而不是预期的圆圈。

作为参考,我包含以下代码以仅在第一个单元格中显示该圆圈。但是使用的方法取决于笔画类型,不设置为 TBrushKind.None 并且也不提供自定义填充颜色、边距或填充功能:-

procedure TUI.CR_UL_UsersGridDrawColumnCell
          (       Sender : TObject;
            const Canvas : TCanvas;
            const Column : TColumn;
            const Bounds : TRectF;
            const Row    : Integer;
            const Value  : TValue;
            const State  : TGridDrawStates );
begin

  if ( Column.Index = 0 ) and ( Row = 0 ) then
  begin  
    Canvas.DrawEllipse ( Bounds, 100 );   
  end
  else
    CR_UL_UsersGrid.DefaultDrawColumnCell 
    ( Canvas, Column, Bounds, Row, Value, State );

end;

如果可能的话,有没有办法将 TCircle 实际添加到单元格或任何其他解决方案?

4

1 回答 1

1

所有 Draw[shape] 程序仅绘制相关 [shape] 的轮廓,因此如果笔刷类型设置为 None,则不会绘制任何内容。

相反,Fill[shape] 程序绘制有问题的填充颜色 [shape]。

下面的代码在第一个单元格的中间绘制了一个 5x5 的圆圈。Bounds rect 的尺寸被修改为 5x5 像素,并且通过所示的计算也在单元格中居中。条件IsServerAlive确定已连接服务器的状态,因此相应地选择要填充的颜色。

procedure TUI.UsersGridDrawColumnCell
          (       Sender : TObject;
            const Canvas : TCanvas;
            const Column : TColumn;
            const Bounds : TRectF;
            const Row    : Integer;
            const Value  : TValue;
            const State  : TGridDrawStates );
var
  Rect : TRectF;
begin

  if ( Column.Index = 0 ) and ( Row = 0 ) then
  begin

    Rect        := Bounds;
    Rect.Left   := Rect.Left + (( Rect.Width / 2 ) - 2.5 );
    Rect.Right  := Rect.Left + 5;
    Rect.Top    := Rect.Top + (( Rect.Height / 2 ) - 2.5 );
    Rect.Bottom := Rect.Top + 5;

    if IsServerAlive then Canvas.Fill.Color := TAlphaColorRec.Green
    else                  Canvas.Fill.Color := TAlphaColorRec.Red;

    Canvas.Fill.Kind   := TBrushKind.Solid;
    Canvas.FillEllipse ( Rect, 1 );

  end
  else
    UsersGrid.DefaultDrawColumnCell 
    ( Canvas, Column, Bounds, Row, Value, State );

end;
于 2014-05-04T19:37:01.950 回答