Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#4

AW: Animierte gif in Stringgridzelle

  Alt 18. Aug 2017, 10:43
TImage ist eine sichtbare Komponente und dient als Container für eine beliebige darzustellende Grafik.
Wenn diese Funktionalität aber nicht benötigt wird, ist es sinnvoller direkt das TGifImage zu benutzen.

So könnte ich mir das vorstellen, vereinfacht, ungetestet:
Delphi-Quellcode:
TForm1 = class(TForm)
{...}
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  procedure DoTimer(Sender: TObject);
private
  FImgExplosion: TGifImage;
  FImgExplosionIndex: Cardinal;
  procedure DrawCellText(ACanvas: TCanvas; ARect: TRect; AText: String);
end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  FImgExplosion := TGIFImage.Create;
  FImgExplosion.LoadFromFile('C:\Users\Danny\Google Drive\Schiffe versenken\sound\explosion.gif');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FImgExplosion.Free;
end;

procedure TForm1.DoTimer(Sender: TObject);
begin
  Inc(FImgExplosionIndex);
  if FImgExplosionIndex >= FImgExplosion.Images.Count then
    FImgExplosionIndex := 0;

  FeldPlayer.Invalidate; // ToDo: nur Bereiche die neu zu zeichnen sind - InvalidateRect
end;

procedure TForm1.DrawCellText(ACanvas: TCanvas; ARect: TRect; AText: String);
var
  X, Y: Integer;
begin
  {links ausgerichtet}
  X := ARect.Left + ACanvas.TextWidth(' ');
  {vertikal zentriert}
  Y := (ARect.Top + ARect.Bottom - ACanvas.TextHeight(AText)) div 2;
  ACanvas.TextRect(ARect, X + 1, Y + 1, AText);
end;

procedure TForm1.FeldPlayerDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  {Hintergrund}
  FeldPlayer.Canvas.FillRect(Rect);
  {Text}
  DrawCellText(FeldPlayer.Canvas, ARect, FeldPlayer.Cells[ACol, ARow]);
  {Animation}
  if FImgExplosionIndex < FImgExplosion.Images.Count then
    FImgExplosion.Images[FImgExplosionIndex].Draw(FeldPlayer.Canvas, Rect, True, True);
end;
TDrawGrid ist TStringGrid vorzuziehen wenn man entweder keine Text anzuzeigen hat oder der Text z.B. in DatenObjekten gespeichert ist und das Grid nur die Anzeige und Bearbeitung übernimmt.

Geändert von Blup (18. Aug 2017 um 13:17 Uhr)
  Mit Zitat antworten Zitat