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.