【问题标题】:How can I draw a circle in a grid's cell?如何在网格的单元格中画一个圆圈?
【发布时间】:2014-06-19 02:43:51
【问题描述】:

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

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

【问题讨论】:

  • 我不明白你的困难。您不能将画笔和钢笔属性设置为您需要的任何东西吗?你不能调整边界以绘制任何你想要的地方吗?
  • FireMonkey 网格单元会定期回收,这意味着您需要定期重新绘制圆圈。我建议您为您的单元格创建一个自定义类,其样式包含一个可以随意显示/隐藏/重新着色的 TCircle。每次调用 ApplyStyle 或 SetData 时,您的单元格都需要进行适当的设置,并且您需要确定要显示的内容(例如,通过传入的数据或用作回调的事件)。我的网站monkeystyler.com/guide 涵盖了大部分内容
  • @MikeSutton 是的,我把你的指南完全弄红了。为什么一种风格会比在画布上绘画更好,它们不是几乎一样吗?与样式相比,我认为画布上的绘制调用不会创建额外的控件。
  • @RobKennedy FMX 中没有画布和画笔属性。虽然我已经通过 FillEllipse 命令和对边界对象的一些计算修改成功地制作了那个椭圆/圆。
  • 自己画画是一件很辛苦的事情。让 FMX 为您做到这一点。

标签: delphi firemonkey delphi-xe6


【解决方案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;

【讨论】:

    猜你喜欢
    • 2010-11-04
    • 1970-01-01
    • 2019-12-04
    • 2012-11-12
    • 2021-03-11
    • 1970-01-01
    • 2018-04-24
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多