TGifImage .ActiveImage problem (gif trenutni frejm)

1

TGifImage .ActiveImage problem (gif trenutni frejm)

offline
  • Igor Đorđević
  • Pridružio: 28 Sep 2007
  • Poruke: 39
  • Gde živiš: Bor, Srbija

Prinudjen sam da pokusam i ovde, svasta sam probao, Google-ao po netu kao blesav, pregledao sto puta help fajl, faq fajl, demo programe i primere... Ne razumem, nesto sto je naizgled toliko prosto nece pa nece da radi.

Imam problema sa prikazom trenutnog frejma aktivnog gif-a.

Instalirao sam u Delphi TGifImage, i sad u okviru komponente TImage mogu da ubacim gif fajl. Kako TGifImage dodaje jos gomilu mogucnosti za rad sa samim gif-om, postoji i opcija (parametar, kako vec) prikaza aktivnog frejma, a sintaksa ide
TGifPainter(slika1.Picture.Graphic).ActiveImage : integer;, gde je slika1 naziv komponente TImage na formi (u TImage je ucitan gif).

Ocigledno imam problem da pozovem ovaj parametar, tj. probao sam i sa tajmerom, koji bi na recimo svakih 0.5 sekundi izvrsavao nesto tipa
Label1.Caption := IntToStr(TGifPainter(slika1.Picture.Graphic).ActiveImage); Label1.Refresh;, gde je Label1 labela u kojoj zelim da se ispisuje broj trenutnog frejma.

Nemam problema sa pokretanjem programa, sve radi osim sto se broj frejmova ne ispisuje, tj. sa ovakvom procedurom (tajmer na 0.5 sec) se u labelu prilikom prvog ontimer dogadjaja upise -1 (sto bi trebalo da je prvi frejm, ne znam zasto ali tako ga prikazuje), i tu i ostane, na -1.

Evo primera iz FAQ fajla, samo da napomenem da ne umem da ga umetnem u svoj kod tako da radi Sad

Citat:I can't figure out (after spending a long time reading the help
and looking at the demo code) how to get the index of the current
frame in an animated gif. This would be very useful in order make a
text comment in a memo when a certain frame is played thereby
synchronizing text and gif.
Is there a way to get the frame number currectly displayed?


To display the frame number of an animated GIF file:


procedure TForm1.Button1Click(Sender: TObject); begin   if OpenPictureDialog.Execute then   begin     Image.Picture.Assign(nil);     FrameLabel.Caption := '';     Image.Picture.LoadFromFile(OpenPictureDialog.FileName);     if (Image.Picture.Graphic is TGifImage) then       TGifImage(Image.Picture.Graphic).OnPaint := OnGifPaint;   end; end; procedure TForm1.OnGifPaint(Sender: TObject); var   ai: Integer; begin   ai := (Sender as TGIFPainter).ActiveImage;   FrameLabel.Caption := IntToStr(ai);   FrameLabel.Refresh; end;

U primeru koji dolazi uz TGifImage (GifExplorer) se lepo ispisuje broj frejmova za sliku za koju ja pokusavam da ispisem to isto na svojoj formi, ali ocito da negde gresim, moze li mi neko pomoci...?

Evo kako izgleda deo koda iz primera Exlporer...

// Update status bar (on animate) procedure TFormExplorer.OnAnimate(Sender: TObject); begin   if not(Sender is TGIFPainter) then     exit;   if (TGIFPainter(Sender).ActiveImage < 0) then   begin     StatusBar.Panels[1].Text := '';   end else   begin     StatusBar.Panels[1].Text := ' Frame '+IntToStr(TGIFPainter(Sender).ActiveImage+1) +       ' of '+IntToStr(TGIFPainter(Sender).Image.Images.Count);     StatusBar.Update;   end; end;

Ja sam se potrudio da objasnim svoj problem, ne znam koliko sam u tome uspeo i koliko ste me razumeli, ali ako vam je potrebna jos neka informacija, kod, sta vec, kazite.

Hvala unapred, propadoh uz ovo Sad



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Prvo sto mi pada na pamet je da ti ActiveImage vraca pravi rezultat samo ako se poziva iz OnPaint event-a. Gledam onaj tvoj kod i ne mogu da vidim nikakvu gresku.

Mozes da probas da u tom njihovom primeru da izvuces deo koda koji je zaduzen za uzimanje trenutnog indeksa pa da ga pozoves na klik dugmeta i da vidis sta ce se desiti. Ako ti vrati -1 znaci da ne mozes da citas tu vrednost kad hoces nego samo u odredjenim event-ima.



offline
  • Igor Đorđević
  • Pridružio: 28 Sep 2007
  • Poruke: 39
  • Gde živiš: Bor, Srbija

To i mene nervira, sve izgleda sasvim korkektno, a ne radi >(

Koji god njihov primer da uzmem, iskopiram kod, ne radi. Prijavljuje mi razne design ili runtime greske.

Cak i ovaj kod izaziva pucanje programa prilikom pritiska dugmeta, ne znam zasto...

StatusBar.Panels[1].Text := ' Frame '+IntToStr(TGIFPainter(Sender).ActiveImage+1) +       ' of '+IntToStr(TGIFPainter(Sender).Image.Images.Count);     StatusBar.Update;

s tim sto sam ja samo promenio i umesto status bara stavio labelu, a umesto ovog njihovog "Sender" (unutar TGIFPainter) stavio stvarni naziv slike, jer se u njihovom primeru ovo "Sender" menja shodno ucitanom gif fajlu... Ili ne? Nista mi nije jasno.

FrameLabel.Caption := ' Frame '+IntToStr(TGIFPainter(Image.Picture.Graphic).ActiveImage+1) + ' of '+IntToStr(TGIFPainter(Image.Picture.Graphic).Image.Images.Count);     FrameLabel.Update;

Ova procedura radi, to je ono sto sam i pre probao samo sa tajmerom, isto je i sa dugmetom. Gde god bila animacija u trenutku pritiska dugmeta labela uzima vrednost -1, kao da ActiveImage samo sadrzi broj prvog frejma..?

procedure TForm1.Button1Click(Sender: TObject); begin     FrameLabel.Caption := IntToStr(TGIFPainter(Image.Picture.Graphic).ActiveImage+1);     FrameLabel.Update; end;

I kako onda uopste da koristim ovu mogucnost? Nemam vise ni jednu ideju, i sto vise isprobavam sve se vise nerviram, jer sam svasta probao jedno sto puta.

Pokusavao sam sa OnPaint dogadjajem forme (TImage nema ovu mogucnost), ali nista nisam postigao. Cak sam postavio globalnu promenjivu koja sluzi kao brojac prolaza kroz proceduru, i ona raste, a ono ActiveImage stoji zakovano na -1.

E sad, primetio sam nesto interesantno... Ovaj globalni brojac (okida se na OnPaint forme) stigne do 30 kad animacija obrne ceo krug, a toliko i ima frejmova unutar gifa! Znaci, mogao bi na neki takav nacin da sredim brojac frejmova, ali... Kad ukljucim [goDirectDraw] kako animacija ne bi treperila, onda se vise procedura OnPaint ne okida, oba brojaca stoje na pocetnim vrednostima (0 i -1).

Forma nema okidac OnAnimate, pa mi nije jasno kako su oni to sredili u svom primeru. Pretrazio sam sve .pas fajlove unutar tog primera, i nigde nisam nasao proceduru koja bi evenutalno okidala ovaj dogadjaj/proceduru.

Evo njihove procedure:

// Update status bar (on animate) procedure TFormExplorer.OnAnimate(Sender: TObject); begin   if not(Sender is TGIFPainter) then     exit;   if (TGIFPainter(Sender).ActiveImage < 0) then   begin     StatusBar.Panels[1].Text := '';   end else   begin     StatusBar.Panels[1].Text := ' Frame '+IntToStr(TGIFPainter(Sender).ActiveImage+1) +       ' of '+IntToStr(TGIFPainter(Sender).Image.Images.Count);     StatusBar.Update;   end; end;

OnAnimate se jos pojavljuje ovde...

1) procedure OnAnimate(Sender: TObject); // u delu deklaracija

2) // Set event handlers - u okviru procedure TFormExplorer.FormCreate(Sender: TObject);
GIF.OnPaint := OnAnimate;
GIF.OnEndPaint := OnAnimate;
GIF.OnProgress := OnProgress;
GIF.OnWarning := OnWarning;
GIF.DrawBackgroundColor := clWindow;

3) // Set event handlers - u okviru procedure TFormExplorer.MenuFileClick(Sender: TObject);
GIF.OnPaint := OnAnimate;
GIF.OnEndPaint := OnAnimate;
GIF.OnProgress := OnProgress;
GIF.OnWarning := OnWarning;

To je sve u istom .pas fajlu. Sta uopste okida ovaj dogadjaj OnAnimate? I jos da napomenem da se u njihovom primeru animacija iscrtava uz koriscenje DirectDraw metode, a ipak se ciklicno prikazuje broj frejmova (od prvog do zadnjeg, pa ponovo...).

Dopuna: 16 Jan 2008 2:06

Evo i odgovora sa drugog foruma:

Citat:Negde grešiš, ne koristiš metode kako je predviđeno ili koristiš drugi dcu unit te komponente od onoga koji koristi njihov primer. Savetujem ti da kreneš od početka, novi projekat, prazna forma i ta komponenta. Ako to ne pomogne onda kreni u suprotnom smeru, od dema komponente i skidaj redom sve dodatne stvari dok ne dođeš do klot forme i primera koji radi.

Znam ja sve to, ali ne ide, pa ne ide... Probao sam vec dvesta puta sa praznom formom, ali je problem sto to TGifImage nije komponenta, vec samo dodaje raznorazne mogucnosti za rad sa gifovima default komponenti TImage, a sve mogucnosti su malko sturo objasnjene. Sve ja lepo postavim, nije to nuklearna fizika, jedna labela, jedno dugme i TImage u koji ucitam gif, prekopiram njihov kod (svojim komponentama dam imena kao sto su u kodu) i nista... Brojac frejmova ostaje ili neaktivan (kao da nista ne okida proceduru) ili konstantno pokazuje broj prvog frejma (-1).

Probao sam i sa njihovim primerom, ali je nemoguce skidati komponente, jer je svaka povezana sa svakom (a ima ih puno), pa nema sanse da ispratim gde se sta pojavljuje i sta sve i gde treba prepraviti kad izbacim neku komponentu. Nema veze... Koristim debugger, korak po korak, red po red koda, i sve lepo ispratim do one OnAnimate procedure, ali tu nastaje problem. Nikako ne mogu da skontam sta nju okida. Debugger se zaustavi na proceduri pre nje (kad se ucita gif slicica), i onda se ceka desavanje unutar samog programa. Obzirom da dok radi debugger prozor programa se ne vidi ceo, sve stane. E sad, cim malo pomerim prozor koda i u vidno polje mi udje gif slicica (nalazi se negde pri sredini prozora programa), tog trenutka se okida OnAnimate procedura i debugger nastavlja sa radom u kodu programa...

Na dalje je sve istorija, kod njih radi ono sto kod mene nece, vrednost TGifPainter(Image.Picture.Graphic).ActiveImage se dodeljuje labeli (tj. u ovom primeru statusbar-u), i sve ide glatko, u statusbar-u se ispisuje broj frejma, u krug od prvog do poslednjeg kako animacija tece.

Ovo je cetvrti dan kako gubim vreme pokusavajuci da provalim kako prikazati broj frejma... Ni vece sitnice, ni veceg problema. Poludecu.

Deder mi pojasni ovo za dcu unit komponente. Kako biram koji cu koristiti? Oni u svom primeru, u folderu imaju tri dcu fajla - about, main i speed (.pas fajlovi su about, main, speed i splitter, ali se u njima ne pojavljuje niti OnAnimate, niti ActiveImage, pa mi nikako nije jasno gde je deifinisano sta okida OnAnimate proceduru, niti kako njima radi brojac frejmova).

Evo i TGifImage fajla, zajedno sa Explorer primerom: [url=https://www.mycity.rs/must-login.png

Ako neko bude imao vremena da pogleda, bio bih mu zahvalan.

offline
  • srdjos  Male
  • Zaslužni građanin
  • Pridružio: 27 Sep 2005
  • Poruke: 678

ovde:

StatusBar.Panels[1].Text := ' Frame '+IntToStr(TGIFPainter(Sender).ActiveImage+1) +       ' of '+IntToStr(TGIFPainter(Sender).Image.Images.Count);     StatusBar.Update;

dobro pogledaj šta ti je sender preko watch ili evaluate/modify

drugo, postuj ceo tvoj kod da vidimo šta si napravio
verovatno frajmove dobro ne "hendluješ"

offline
  • Igor Đorđević
  • Pridružio: 28 Sep 2007
  • Poruke: 39
  • Gde živiš: Bor, Srbija

Ne prikazuje sta je sender (?)... Watch kao vrednost za sender (isto i za TGIFPainter(Sender)) pokazuje () (praznu zagradu). Isti je slucaj i preko evaluate/modify, a kad kliknem na inspect, pokazuje Sender: TObject edx, pa ispod gomilu metoda

Create System.TObject.Create ($4032DC)
Free System.TObject.Free ($40330C)

... itd.

Inace kao vrednost za TGIFPainter(Sender).ActiveImage lepo pokazuje broj trenutnog frejma.

Evo i mog koda, za probu sam poceo od prazne forme i ubacio komponente TImage (Name = Image1) (u koju ucitam gif u design time), Button (Button1 - klikom na dugme bi trebalo ispisati trenutni frejm) i Label (Label1 - labela u ciju se Caption upisuje vrednost frejma). Najprostije sto moze.

unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, StdCtrls, GIFImage, ExtCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Image1: TImage;     Label1: TLabel;     procedure Button1Click(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end; var   Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin   Label1.Caption := IntToStr(TGifPainter(Image1.Picture.Graphic).ActiveImage); end; end.

Po logici bi trebalo da se prilikom pritiska na dugme u labeli pojavi broj trenutnog frejma, ali uvek se pojavljuje -1, ma gde god animacija trenutno bila.

Moguce da je fora sa ovim "Sender", ali kako da uopste znam sta je to, kad program ne prikazuje vrednost, vec samo () ... ?

offline
  • srdjos  Male
  • Zaslužni građanin
  • Pridružio: 27 Sep 2005
  • Poruke: 678

BugA ::Ne prikazuje sta je sender (?)... Watch kao vrednost za sender (isto i za TGIFPainter(Sender)) pokazuje () (praznu zagradu). Isti je slucaj i preko evaluate/modify, a kad kliknem na inspect, pokazuje Sender: TObject edx, pa ispod gomilu metoda


prikazuje šta je sender
() ti znači da je objekt kreiran i da možeš
pristupati njegovim atributima

to lako možeš videti ako u evaluate dodaš

Sender.ClassName

pošalji ceo kod što si napisao
zajedno sa deklaracijom frejmova i svega ostalog

i pitanje, šta je za tebe frejm (frame)
šta podrazumevaš pod frejmom

offline
  • Igor Đorđević
  • Pridružio: 28 Sep 2007
  • Poruke: 39
  • Gde živiš: Bor, Srbija

Aha, hvala Smile

Kad ukucam Sender.ClassName, izbaci mi vrednost (Result) 'TGIFPainter' (sa sve tim navodnicima), a za Sender.ClassType pokazuje TGIFPainter. Sta nam ovo sad znaci, moze li se nekako videti od cega uzima TGIFPainter? Kad u evaulate stavim TGIFPainter, ne pokazuje nista (result ostaje prazan), a kada dodam TGIFPainter(Sender).ActiveImage, pojavi se broj trenutnog frejma.

Pa to je ceo kod, ne znam na kakvu deklaraciju frejmova mislis? Nisam to ja deklarisao, to je unutar GifImage. Jedino da postavim kompletan kod njihovog primera...? Malko je podugacak, a ima ga u onom gore .zip fajlu, kao main.pas u folderu Explorer.

Frejm (u ovom slucaju) je slicica koja je sastavni deo gif animacije - recimo da se ucitana gif animacija sastoji od trideset slicica (frejmova) koje cine tu animaciju, redom se smenjujuci. Meni treba procedura koja ce u toku animacije, kako se redom unutar gif-a smenjuju slicice, ispisivati broj aktivne slicice, tj. broj trenutnog frejma. Trebalo bi da je to sadrzano u okviru TGifPainter(Image1.Picture.Graphic).ActiveImage (Image1 je naziv komponente TImage u koju ucitamo gif), pa da se samo to dodeli nekoj promenljivoj, ili se jednostavno odatle ispise, ali izgleda da nije to bas tako prosto.

offline
  • srdjos  Male
  • Zaslužni građanin
  • Pridružio: 27 Sep 2005
  • Poruke: 678

aha, taj frejm, e mene budale, sorry

moram instalirati pa probati
jedna od varijantije da nisi dobro instalirao i da
Image1.Picture.Graphic ne pristupa kako
pristupa u njihovim primerima

pogledaj da li ima neke veze sa tim koju verziju
delphija podržava 6,7, ....

offline
  • Igor Đorđević
  • Pridružio: 28 Sep 2007
  • Poruke: 39
  • Gde živiš: Bor, Srbija

Taman posla, hvala na trudu Smile

Ne znam, mozda i nisam dobro instalirao, mada postoji detaljno 'korak po korak' uputstvo, i nije neki postupak, ali ko zna. Nego valjda onda ne bih ni mogao da ucitam gif u TImage, ne znam da li se moglo desiti da se neki delovi lepo instaliraju, a neki ne.

Pise tamo da je i za verziju 7 (izmedju ostalih).

Ali kako njima onda radi, ako nesto nije lepo instalirano, da li oni dodatno negde u svom primeru definisu TGifImage? Ja to nisam uspeo da nadjem, ali obzirom da sebe jos uvek mogu smatrati pocetnikom, pogotovo kad je Delphi u pitanju, mozda mi je nesto i promaklo.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Palo mi je jos nesto na pamet... uzevsi u obzir da se GIF slicica animira, mozda se ta animacija izvrsava u nekom drugom thread-u i zbog toga ne mozes da uhvatis aktivni frejm kad ti se prohte?

Da li si probao da uzmes trenutni frejm u OnPaint event-u kao sto oni u primeru rade?

Ko je trenutno na forumu
 

Ukupno su 779 korisnika na forumu :: 36 registrovanih, 5 sakrivenih i 738 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: AK - 230, aleksmajstor, Andrija357, atmel, Atomski čoban, BORUTUS, BraneS, bufanje, dankisha, darios, draganca, dragoljub11987, GandorCC, Georgius, HrcAk47, ivan1973, Karla, krkalon, lucko1, milenko crazy north, mnn2, MrNo, Nobunaga, Panter, rodoljub, royst33, Srki94, Toper, vathra, voja64, YugoSlav, Zi0mek, Zikapk, zillbg, Zimbabwe, šumar bk2