【问题标题】:TStringGrid: Is it possible to find out the 'State' of a cell?TStringGrid:是否可以找出单元格的“状态”?
【发布时间】:2016-08-12 10:20:17
【问题描述】:

我想为 TStringGrid 实现一个 FillCell 过程。我想用颜色填充某个单元格,但前提是未选择单元格(行)。

procedure TMyStrGrid.FillCell(Rect: TRect; aColor: TColor);
begin
 //if NOT (gdSelected in State) then    <---- how do I obtain the 'State' here?
   begin
    Canvas.Brush.Color:= aColor;
    Canvas.FillRect(Rect);
   end;
end;

这只是一个练习 :) 我正在尝试找出非常复杂的 VCL.Grids.pas。

【问题讨论】:

  • 你什么时候打电话给FillCell?响应哪个事件? OnDrawCell 提供绘制状态。
  • OnDraw。我知道您要建议什么:将 State 作为参数传递。但我想知道是否可以在不将 State 作为参数传递的情况下找到它。
  • 你到底为什么要这么做?您已经有了正确的解决方案。传递参数。
  • @DavidHeffernan-这是我目前的解决方案。我只是好奇。我查看了 VCL.Grids.pas,试图弄清楚该怎么做,但我做不到。
  • 为什么不在 OnSelectCell 事件中存储当前选中的行呢?然后在需要时使用存储的 rownr。

标签: delphi graphics vcl delphi-xe7 tstringgrid


【解决方案1】:

根据 cmets,您正在从 OnDrawCell 处理程序调用此函数。 OnDrawCell 处理程序传递了一个 TGridDrawState 参数,该参数指定是否选择单元格。事件处理程序是这种形式:

TDrawCellEvent = procedure (Sender: TObject; ACol, ARow: Longint;
  Rect: TRect; State: TGridDrawState) of object;

您在问是否可以忽略TGridDrawState 并稍后以某种方式恢复信息。原则上是可以的:

  • 您有可用的行和列。这会识别单元格,您可以检查该单元格是否在当前选择中。
  • 如果您还想忽略行和列,则可以检查提供的TRect。将其映射回行和列,然后根据当前选择再次检查。

坦率地说,在我看来,您正在尝试做的事情很愚蠢。为您提供绘制状态是有充分理由的。它有你需要的信息。使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多