如何在网格单元格中绘制圆圈?

时间:2014-05-02 12:03:44

标签: delphi firemonkey delphi-xe6

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

作为参考,我包括以下代码,仅在第一个单元格中显示该圆圈。但是使用的方法取决于不设置为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实际添加到单元格或任何其他解决方案?

1 个答案:

答案 0 :(得分:1)

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

相反,填充[形状]程序会绘制颜色填充的[形状]。

下面的代码在第一个单元格的中间绘制一个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;