AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Animierte gif in Stringgridzelle

Animierte gif in Stringgridzelle

Ein Thema von Danny92 · begonnen am 16. Aug 2017 · letzter Beitrag vom 18. Aug 2017
Antwort Antwort
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Animierte gif in Stringgridzelle

  Alt 16. Aug 2017, 15:04
Ich möchte eine animierte GIF in eine StringGrid-Zelle laden.
Das Laden an sich hab ich mit Image1.Picture.Graphic schon hinbekommen. Auch die Transparenz in Image1 ist da.
Aber wenn ich das im OnDrawCell-Ereignis des StringGrids1 mit StringGrid1.Canvas.Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic) einfüge,
ist die GIF im Standbild, statt animiert, außerdem ist es in den Zellen nicht mehr transparent. Also in Image1 ist es animiert und transparent, aber in den einzelnen Zellen weder noch..

Delphi-Quellcode:
procedure TForm1.FormClick(Sender: TObject);
var
  GIFimg: TGIFImage;
begin
  GIFImageDefaultAnimate := True;
  GIFimg:= TGIFImage.Create;
  gifimg.AnimationSpeed:=1000;
  try
    GIFimg.LoadFromFile('C:\Users\Danny\Google Drive\Schiffe versenken\sound\explosion.gif');
    Image1.Picture.Assign(GIFimg);
  finally
    GIFimg.Free;
  end;
  (Image1.Picture.Graphic as TGIFImage).Animate := True;
  //feldplayer.Repaint;
  FeldPlayer.Repaint;
end;
Delphi-Quellcode:
procedure TForm1.FeldPlayerDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   (Image1.Picture.Graphic as TGIFImage).Animate := True;
  FeldPlayer.Canvas.Draw(Rect.Left,Rect.Top,Image1.Picture.Graphic);
  (Image1.Picture.Graphic as TGIFImage).Animate := True;
  //FeldPlayer.Canvas.StretchDraw(Rect,Image1.Picture.Bitmap);
end;
Weiß da jemand schnell Abhilfe, wie sich das (schnell & einfach) realisieren lässt? Danke!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.349 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Animierte gif in Stringgridzelle

  Alt 16. Aug 2017, 16:10
Weiß da jemand schnell Abhilfe, wie sich das (schnell & einfach) realisieren lässt? Danke!
Nein, schnell und einfach geht das nicht.

Für die Transparenz musst du den kompletten Zelleninhalt selbst zeichnen.
1. Hintergrund (z.B. weiß)
2. eine Bild des Gif in der jeweils gültigen Animationsphase
3. Den Zelleninhalt (in der Regel Text)

Um die Animation darzustellen wird ein Timer benötigt und die Information, welche Animationsphase als nächstes zu zeichnen ist.
Im OnTimer können alle Zellenbereiche, in denen eine Animation dargestellt wird, mit InvalidateRect der Region zum Neuzeichnen hinzugefügt werden.
Das OnPaint-Ereignis wird danach automatisch durch Windows ausgelöst.
  Mit Zitat antworten Zitat
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Animierte gif in Stringgridzelle

  Alt 16. Aug 2017, 16:49
Geht das auch einfacher?
Zum Beispiel das Image1 vor dem StringGrid1 stehen zu lassen?

Geht das mit einem DrawGrid einfacher?
Oder auch eine Idee wäre, das Image im Vordergrund zu haben, über dem StringGrid an irgendeiner Stelle. Geht das einfacher? Wie soll ich denn sonst die gif in ihre einzelnen Bilder aufdröseln? im Timer1-Intervall-Ereignis hab ich Image1.Picture.Assign(gifimg.Images[2]) schon versucht...

Geändert von Danny92 (16. Aug 2017 um 20:50 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.349 Beiträge
 
Delphi 10.4 Sydney
 
#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
Benutzerbild von Danny92
Danny92

Registriert seit: 18. Aug 2014
55 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Animierte gif in Stringgridzelle

  Alt 18. Aug 2017, 10:48
Ja das sieht schon ganz gut aus. Nur das Problem ist: ich will die Datei, die GIF, nicht von der Platte laden müssen. Am Ende darf nur noch die Hauptanwendung übrig bleiben. Das heißt ich hab die Datei in der Resource schon eingebunden. Aber so ähnlich mit einem Timer und dann alle paar Millisekunden ins StringGrid reinladen - so hab ich das auch gelöst. Es ging ja nicht anders. Danke!
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.349 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Animierte gif in Stringgridzelle

  Alt 18. Aug 2017, 13:10
Das ist schon wieder ein ganz anderes Problem. Dafür könnte man z.B. eine Resourcedatei erstellen, ins Projekt einbinden und die Grafiken mit LoadFromResource laden.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf