Anzeigen eines animierten GIFs mit TGIFImage 2.2 von Anders Melander
-
Mit der o.a. Lib kann man prima GIFs laden und bsp. einen TImage zuweisen und dann anzeigen. Mir gehr es jetzt um die Anzeige animierter GIFs. Das sollte, wenn ich die *.hlp richtig verstanden habe entweder so
TGIFImage *gif=new TGIFImage(); gif->LoadFromFile("schmetterling.gif"); TRect rc(0,0,gif->Width,gif->Height); TGIFPainter *tp=new TGIFPainter(gif,Canvas,rc,TGIFDrawOptions()<<goTransparent); tp->Start();oder so
TGIFImage *gif=new TGIFImage(); gif->LoadFromFile("schmetterling.gif"); TRect rc(0,0,gif->Width,gif->Height); gif->Paint(Canvas,rc,TGIFDrawOptions()<<goTransparent);möglich sein. Leider passiert im ersten Fall nichts, im zweiten Fall ist kurz das Bild zu sehen und eine EAccessViol. Exception im Delphicode der Klasse TGIFImage.
procedure TGIFPainter.DoOnTerminate(Sender: TObject); begin // It shouldn't really be nescessary to protect PainterRef in this manner // since we are running in the main thread at this point, but I'm a little // paranoid about the way PainterRef is being used... with Image.Painters.LockList do try // Zap pointer to self and remove from painter list if (PainterRef <> nil) and (PainterRef^ = self) then PainterRef^ := nil; finally Image.Painters.UnLockList; end;(in der Zeile "with Image...)
Obwohl der Thread ja nun noch nicht terminiert wurde.Hat jemand Infos dazu?? Wie gesagt, geht es nicht um das Laden und anzeigen, sondern um das anzeigen eines animierten GIFs.
Oder kennt jeman diese kostenpflichtige Komponenten
http://www.tmssoftware.com/advpic.htm
Die BCB6 Demo läuft leider nicht im BCB 2006.
-
Die Gif- Komponente klinkt sich doch in TPicture ein.
Wenn Du in ein Image eine Gif- Datei laden laesst, wird diese automatisch angezeigt.
mit (TGIFImage*) (Image1->Picture->Graphic))->AnimationSpeed=WASWASI
kann das Tempo festgelegt werden - WasWasI ist irgendeine Zahl.
-
Bei mir klinkt sich nichts ein. Es ist auch keine Komponente, sondern eine extra Klasse.
In einem TImage (TPicture) kann ich kein GIF laden.
Vermute du meinst eine andere Komponente??
-
Habe den Code jetzt mal als Komponente isntalliert. Dann gibt es tatsächlich im TImage die Möglichkeit ein GIF zu laden -> theoretisch -> Die ganze IDE stürzt bei dem Versuch ab
-
Nenene.
Du musst in Dein Projekt die Unit GifImage.PAS einbinden.
Die wird mit compiliert. Danach hat sich das Teil in TPicture/ TImage eingeklinkt!
NICHT als eigene Komponente installieren! Ausser Du schreibst eine Kompo drumrum.
-
Klar, das war der erste Weg, die PAS eingebunden.
Naja, wie dem auch sei -> geht nicht
-
1. Die GifImage.pas mus dem Projekt HINZUGEFUEGT werden.
2. Die GifImage.hpp muss includiert werden.(Die HPP entsteht beim Compilieren der PAS- Datei!)
Ein einfaches Projekt sollte so aussehen:
Im TImage ist (Entwurfszeit) ein GIG- Bild eingefügt.************************************************************* Unit1.h ************************************************************* //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include "GIFImage.hpp" //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TImage *Image1; void __fastcall Image1Click(TObject *Sender); private: // Anwenderdeklarationen public: // Anwenderdeklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif ************************************************************* Unit1.cpp ************************************************************* //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "GIFImage" #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1Click(TObject *Sender) { Image1->Picture->LoadFromFile ("Hier LW, Pfad und Dateiname einer existierenden GIF- Datei"); } //--------------------------------------------------------------------------- ************************************************************* Projekt1.cpp ************************************************************* //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop USERES("Project1.res"); USEFORM("Unit1.cpp", Form1); USEUNIT("..\Source\GifImage\gifimage.pas"); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } return 0; } //---------------------------------------------------------------------------
-
Danke, das Vorgehen funktioniert leider nur mit einem NICHT animierten GIF. Bei einer Animation -> keine Rückmeldung des Programmes. Vielleicht zuviele Änderungen in BCB2006
-
Also:
1. einfache GIFs werden geladen und angezeigt.
2. Bei Animierten kommt keine Reaktion.Wird da gar nix angezeigt?
wird nur nicht animiert - das "Start-" Bild wird nur gezeigt?
Kommt ne Exception?Im Code hatte ich das einschalten der Animation vergessen! Das hatte ich in vorherigem Beitrag :
(TGIFImage*) (Image1->Picture->Graphic))->AnimationSpeed=WASWASI
das sollte nur nicht gesetzt werden, wenn gar kein animiertes GIF geladen wird.
-
1. Joo,
2. Joo, keine Exception, keine Rückmeldung-> abschiessen über TaskmanagerWird die Zeile mit dem Speedwert vor dem Laden gesetzt gibt es jetzt eine EAViolation Exception (in der Zeile if(Value <> FAnimationSpeed))
procedure TGIFImage.SetAnimationSpeed(Value: integer); begin if (Value < 0) then Value := 0 else if (Value > 1000) then Value := 1000; if (Value <> FAnimationSpeed) then begin FAnimationSpeed := Value; // Use the FPainters threadlist to protect FDrawPainter from being modified // by the thread while we mess with it with FPainters.LockList do try if (FDrawPainter <> nil) then FDrawPainter.AnimationSpeed := FAnimationSpeed; finally // Release the lock on FPainters to let paint thread kill itself FPainters.UnLockList; end; end; end;Wird die Zeile mit dem Speedwert nach dem Laden gesetzt -> naja kommt da wohl nicht hin, da wieder Absturz -> keine Rückmeldung