Evenement image avec timer [Résolu]

gabs77 380 Messages postés mardi 6 décembre 2005Date d'inscription 8 octobre 2008 Dernière intervention - 4 mai 2007 à 14:58 - Dernière réponse : Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention
- 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;
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 mai 2007 à 16:03
3
Merci
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

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de florenth
Meilleure réponse
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 mai 2007 à 19:57
3
Merci
@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 ...

Merci florenth 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de florenth
Utilisateur anonyme - 4 mai 2007 à 16:06
0
Merci
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;
Commenter la réponse de Utilisateur anonyme
florenth 1105 Messages postés dimanche 1 août 2004Date d'inscription 17 août 2008 Dernière intervention - 4 mai 2007 à 16:17
0
Merci
Ahh tiens, je t'ai recoupé l'herbe sous le pied ! Le pauvre, il a plus de pieds maintenant...
Commenter la réponse de florenth
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 4 mai 2007 à 17:49
0
Merci
Ca, c'est triste!
Surtout qu'il avait l'habitude de nous poster des sources parfumés tapés avec les orteils...
Commenter la réponse de Caribensila
gabs77 380 Messages postés mardi 6 décembre 2005Date d'inscription 8 octobre 2008 Dernière intervention - 4 mai 2007 à 18:33
0
Merci
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;
Commenter la réponse de gabs77
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 4 mai 2007 à 18:43
0
Merci
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;

Commenter la réponse de f0xi
gabs77 380 Messages postés mardi 6 décembre 2005Date d'inscription 8 octobre 2008 Dernière intervention - 4 mai 2007 à 18:59
0
Merci
salut foxi,

merci pour ce script, il est assez interessant mais ne répond pas à mon problème de listbox !!! 
Commenter la réponse de gabs77
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 4 mai 2007 à 23:04
0
Merci
@ florenth: Oui, mais à force de le couper...
...
...
Boaf... On lui offrira un chapeau pour son anniversaire.
Commenter la réponse de Caribensila
Utilisateur anonyme - 5 mai 2007 à 16:41
0
Merci
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
Commenter la réponse de Utilisateur anonyme
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 6 mai 2007 à 18:47
0
Merci
@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?
Commenter la réponse de Caribensila

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.