Evenement image avec timer

Résolu
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008 - 4 mai 2007 à 14:58
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 - 6 mai 2007 à 18:47
salut,

 j'ai besoin d'aide pour un script tout bête mais malgré qu'il soit tout bête j'ai des difficultés !!
Donc, je cherche à faire un script de telle sorte à ce que lorsque l'on 
 clique sur une image (par exemple : l'image <<oeil0.bmp>> représente un oeil ) l'image change à intervalle régulier de tel sorte à ce que les changements soit visibles!!
 exemple on clic sur l'oeil et l'oeil cligne des yeux, et cet évènement est traduit par 5 images de 0 à 4 :

exemple de script sans timer pour un résultat similaire :
 
procedure TFrmMain.Image5Click(Sender: TObject);
var
  i : Integer;
begin
  i := 0;
  while i < 450 do
    begin
    Inc(i);
    Image5.Picture.LoadFromFile(Dir + 'oeil'+inttostr(i div 100)+'.bmp');
    Image5.Refresh;
    end;
  while i > 0 do
    begin
    Dec(i);
    Image5.Picture.LoadFromFile(Dir + 'oeil'+inttostr(i div 100)+'.bmp');
    Image5.Refresh;
    end;
end;

11 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 16:03
Salut,

Il te faut:
<li>Une var globale, FEtatOeil: Integer, dans la section privadte de ta fiche;</li><li>Un TImage, ImgOeil, qui représente ton oeil.
</li><li>Un TTimer (onglet système), AnimTimer sur la même fiche avec :</li><li>Enabled := False</li><li>Interval := 200 (ou ce que tu veux)</li><li>OnTimer: le code ci dessous</li><li>Un bouton, BtnBeginAnim pour débuter l'animation.</li><li>5 bitmaps nommés Oeil0.bmp, Oeil1.bmp .... Oeil4.bmp qui sont les états de l'oeil
</li>OnClick du bouton :
<hr size ="2" width="100%" />FEtatOeil := 0;
AnimTimer.Enabled := True;

OnTimer du AnimTimer :
ImgOeil.Picture.LoadFromFile(Format('%sOeil%d.bmp', [Dir, FEtatOeil]));
ImgOeil.Refresh;
Inc(FEtatOeil);
AnimTimer.Enabled := FEtatOeil <= 4;

Et quand tu cliques sur le bouton, l'animation se met en marche !

A+
Flo
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 19:57
@gabs: dans u listbox c'est pareil. Tu invalide le Listbox dans le OnTimer (Listbox.Invalidate) et dans le OnDrawItem tu dessines ton image.
Par contre, je ne sias pas ce qu'est ImgVu. Bon, c'est un TImage, mais à quoi sert-il vraiment si c'est sur le listbox que tu veux qu'il s'anime ?

A mon avis, tu devrais charger les bitmaps en mémoire et les dessiner directement sur le listbox. Regarde du côté de la classe TBitmap et TCanvas. Il y a plein de possibilités...

@Cari: que veux-tu, il laisse toujours trainer ses pieds n'importe où... ça devait bien arriver. Mais t'inquiète pas pour le parfum, il lui reste encore une source odorante ...
3
Utilisateur anonyme
4 mai 2007 à 16:06
Salut

Technique avec un Timer :

procedure TForm1.Image1Click(Sender: TObject);
begin
ImageTimer.Enabled:=true;
indexImage:=0;
end;

procedure TForm1.ImageTimerTimer(Sender: TObject);
Var
NameFile:String;
begin
Inc(IndexImage);
If IndexImage>5 then IndexImage:=0;
NameFile:='C:\'+IntToStr(IndexImage)+'.bmp';
Image.Picture.LoadFromFile(nameFile);
Image.Refresh;
end;

-------------------------------------

Sans Timer : Tu utilises une technique de bourrin qui doit faire exploser le CPU.

Autre solution à la style Made In Bourrin

procedure TFrmMain.Image5Click(Sender: TObject);
//On renomme les composants
var
  i : Integer;
begin
  i := 0;
  while i < 450 do
    begin
    Inc(i);
    Image5.Picture.LoadFromFile(Dir + 'oeil'+inttostr(i div 100)+'.bmp');
    Image5.Refresh;
    If i=449 then i:=0;
    end;
End;
0
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 mai 2007 à 16:17
Ahh tiens, je t'ai recoupé l'herbe sous le pied ! Le pauvre, il a plus de pieds maintenant...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 mai 2007 à 17:49
Ca, c'est triste!
Surtout qu'il avait l'habitude de nous poster des sources parfumés tapés avec les orteils...
0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
4 mai 2007 à 18:33
super ça marche !!
j'ai opté pour la méthode à florenth.

En revanche, un peu plus compliqué, est ce qu'on peut faire la même chose dans une listbox dans l'évènement :

ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);

je parviens sans problème a mettre l'image en revanche, j aimerais que lorsque que l'on clic dessus l'image à l'index de la listbox s'anime tout comme vu précédemment !
donc je présume qu'il faut quelque chose de ce genre :

if (odSelected in state) then
  begin
  ListBox1.Canvas.Brush.Color := $00CC00DD;
  ListBox1.Canvas.FillRect(Rect);
//
// evenement sur l'image pour faire oeil0 => oeil1 => oeil2 => oeil3 => oeil4
//
  ListBox1.Canvas.Draw(Rect.Left, Rect.Top, imgVu.picture.graphic);
  end
else
  begin
  ListBox1.Canvas.Brush.Color := $00FFFFFF;
  ListBox1.Canvas.FillRect(Rect);
  end;
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 mai 2007 à 18:43
avec un timer c'est simple :

var
  PicturesIndex : integer = 0;
  Pictures : array[0..4] of record
     name : string;
     exists: boolean;
  end;
  PicturesPath  : string;

const
  PicturesCount = length(Pictures);

procedure TForm1.FormCreate(Sender: TObject);
var N : integer;
begin
  Timer1.Interval := 1000 div 20;

  PicturesPath := ExtractFilePath(ParamStr(0))+'images\';

  for N := 0 to PicturesCount-1 do
  with Pictures[N] do
  begin
    Name   := PicturesPath + 'oeil'+inttostr(N)+'.bmp';
    Exists := FileExists(Name);
  end;
End;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  with Pictures[PicturesIndex] do
  begin
    if Exists then
    begin
       Image5.Picture.LoadFromFile(Name);
       Image5.Invalidate;
    end;
  end;
  PicturesIndex := (PicturesIndex + 1) mod PicturesCount;
end;

0
gabs77 Messages postés 379 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 8 octobre 2008
4 mai 2007 à 18:59
salut foxi,

merci pour ce script, il est assez interessant mais ne répond pas à mon problème de listbox !!! 
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
4 mai 2007 à 23:04
@ florenth: Oui, mais à force de le couper...
...
...
Boaf... On lui offrira un chapeau pour son anniversaire.
0
Utilisateur anonyme
5 mai 2007 à 16:41
Oué oué tu as de la chance que le réseau à ce moment là il plantait : la page à 25 minutes pour se rafraichir : Gabs77 tu me dois 25 minutes en heures supplémentaires : je vais te faire racker.

Sinon on peut utiliser un TImageList : c'est meme fait pour ca.

@Cari : je veux bien un sombréro ouep mais avec le transat qui va avec
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
6 mai 2007 à 18:47
@36-15 :  J't'imagine bien...
Une tête dans le fond du trasat avec un sombrero!
T'as tj eu la folie des grandeurs!

Tu préfères pas un béret basque?
0
Rejoignez-nous