2

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

在此处输入图像描述

如果我选择一个单元格,它将被着色,clGrey如果我再次选择它,它将再次被着色为白色。我想计算所有clGrey颜色的细胞。

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

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;
4

3 回答 3

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;
于 2013-09-03T08:18:27.173 回答
3

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

于 2013-09-03T07:12:16.510 回答
1

UniversumsMatrix 由您填写。为什么没有一个 Sum 变量,当您将值设置为 TRUE 时该变量会增加?您甚至不必费心计算绘图网格中的单元格吗?

于 2013-09-03T07:33:29.823 回答