Einzelnen Beitrag anzeigen

junale

Registriert seit: 22. Dez 2004
Ort: Kaiserslautern
15 Beiträge
 
#1

Wieder mal: Einzelne Zellen in einem Grid zeichnen

  Alt 23. Mär 2005, 14:12
Hi,

Ich habe ein TDrawGrid, in welchem ein (variables) 19 auf 19 Raster (durch die Komponente) erzeugt wird. Parallel existiert ein (variables) Array[0..18, 0..18] in dem die Farben der Spielsteine hinterlegt sind. Wenn ich nun einen Stein mit folgendem Code "bewege" werden nicht alle Steine erneut gezeichnet // gelöscht.

Waran kann das liegen?

Wenn ich das "Refresh" in der Routine MoveItem einfüge (momentan auskommentiert), dann wird die Bewegung der Spielsteine sehr langsam, sobald ein paar Steine gleichzeitig bewegt werden müssen.

Durch die Suche hier im Forum habe ich InvalidateCell probiert -> wird auch nicht besser.

Delphi-Quellcode:
type
  TGameBoard = class (TDrawGrid)
  private
    fFields: Array of Array of TGameItems;
    ...
  protected
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); override;
  public
    ...
    procedure MoveItem (aRow, aCol: Integer; Dir: TGravitation);
  published
    ...
  end;

...

procedure TGameBoard.MoveItem (aRow, aCol: Integer; Dir: TGravitation);
var
  ToRow, ToCol: Integer;
begin
  case Dir of
    grBottom: begin ToRow := Succ(aRow); ToCol := aCol; end;
    grLeft: begin ToRow := aRow; ToCol := Pred (aCol); end;
    grRight: begin ToRow := aRow; ToCol := Succ (aCol); end;
    grTop: begin ToRow := Pred(aRow); ToCol := aCol; end;
  end;

  fFields[ToRow, ToCol] := fFields[aRow, aCol];
  fFields[aRow, aCol] := giNone;
  InvalidateCell (aRow, aCol);
  InvalidateCell (ToRow, ToCol);
// Refresh;
end;

procedure TAEJGameBoard.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
  procedure PaintCoin (CoinColor: TColor);
  begin
    Canvas.Pen.Color := clGray;
    Canvas.Brush.Color := CoinColor;
    Canvas.Ellipse (aCol * (DefaultColWidth + GridLineWidth) + 2, aRow * (DefaultRowHeight + GridLineWidth)+ 2, Succ (aCol) * (DefaultColWidth + GridLineWidth) - 2, Succ (aRow) * (DefaultRowHeight + GridLineWidth) - 2);
  end;
begin
  inherited;
  case fFields[aRow, aCol] of
    giCoinBlack: PaintCoin (clBlack);
    giCoinBlue: PaintCoin (clBlue);
    giCoinRed: PaintCoin (clRed);
  end;
end;
  Mit Zitat antworten Zitat