如何计算DrawGrid中的彩色单元格?

时间:2013-09-03 06:50:39

标签: delphi drawing cells

我使用TDrawGrid组件绘制网格。 46Y x 70X

enter image description here

如果我选择一个单元格,它将用clGrey着色,如果我再次选择它,它将再次以白色着色。我想要计算所有clGrey couloured细胞。

我的以下代码是我尝试过的,但没有用。

procedure TForm2.RasterDrawGridSelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  UniversumsMatrix[ACol, ARow] := not UniversumsMatrix[ACol, ARow];

    begin
    if RasterDrawGrid.Brush.Color = clGrey then begin
      Zellenstand := Zellenstand - 1
    end
    else
      Zellenstand := Zellenstand +1 ;
  end;
end;

procedure TForm2.RasterDrawGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if UniversumsMatrix[ACol, ARow] then
    RasterDrawGrid.Canvas.Brush.Color := clGray // Grauer der lebendigen Hintergrund
  else
    RasterDrawGrid.Canvas.Brush.Color := clWhite; // Weißer Hintergrund
    RasterDrawGrid.Canvas.FillRect(Rect);
end;

3 个答案:

答案 0 :(得分:6)

处理计数器的一种更有效的方法是使用相应的setter和getter将数组包装在一个类中,并仅通过setter和getter访问数组。

Type
  TUniverseClass = Class
  Private
    FArray: Array [0 .. 71, 0 .. 45] of Boolean;
    FLivingCount: Integer;
    function GetXY(X, Y: Integer): Boolean;
    procedure SetXY(X, Y: Integer; const Value: Boolean);
  Public
    Property XYValue[X, Y: Integer]: Boolean Read GetXY Write SetXY;
    Property LivingCount: Integer Read FLivingCount;

  End;

var
  UniverseClass: TUniverseClass;

  { UniverseClass }

function TUniverseClass.GetXY(X, Y: Integer): Boolean;
begin
  Result := FArray[X, Y];
end;

procedure TUniverseClass.SetXY(X, Y: Integer; const Value: Boolean);
begin
  if FArray[X, Y] <> Value then
    if Value then
      Inc(FLivingCount)
    else
      Dec(FLivingCount);
  FArray[X, Y] := Value;
end;
// example call
procedure TForm1.Button1Click(Sender: TObject);
begin
  UniverseClass.XYValue[0, 0] := true;
  Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));
  UniverseClass.XYValue[1, 1] := true;
  Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));
  UniverseClass.XYValue[0, 0] := false;
  Memo1.Lines.Add(IntToStr(UniverseClass.LivingCount));

end;

initialization

UniverseClass := TUniverseClass.Create;

finalization

UniverseClass.Free;

答案 1 :(得分:3)

看起来在UniversumsMatrix中你已经有了布尔值。只需计算真或假值。

答案 2 :(得分:1)

UniversumsMatrix由你填补。为什么没有一个Sum变量,当你将值设置为TRUE时,该变量会增加?你甚至不用打算在绘制网格中计算细胞?