Comment faire un scroll de texte fluide à 100% qui ne saccade pas?
Quel Timer utiliser et quel composant graphique?
Version imprimable
Comment faire un scroll de texte fluide à 100% qui ne saccade pas?
Quel Timer utiliser et quel composant graphique?
Bonjour,
Je dirais un TImage avec un dessin du texte par DraText ou TextOut. La propriétée DoubleBuffering doit être à true.
oui ou l'équivalent: incrémenter(x,y) d'un textout contenu dans le caneva d'un bitmap par un événement ontimer et faire un draw dans une paintbox sur la fiche . Utilise un intervalle timer assez court pour éviter le scintillement. principe d'une animation simple...
:lol:
tiens, vite fait:
:lol:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); private { Déclarations privées } y:integer; BITMAP:Tbitmap; public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin timer1.Interval:=10; bitmap:=Tbitmap.create; with bitmap do begin width:=Paintbox1.width; height:=paintbox1.Height; end; end; procedure TForm1.Timer1Timer(Sender: TObject); begin inc(y); bitmap.canvas.TextOut(100,y,'salut'); paintbox1.Canvas.Draw(0,0,bitmap); end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin paintbox1.Canvas.Draw(0,0,bitmap); end; end.
:arf:
Ce que vous avez dit c juste mais sa saccade . Ce ke je veux faire c un scroll ki ne s'arrete jamais (comme les news bars de tv) c pas tellement facile ke vous croyez essayez et vous allez voir!
je pige pas... tu veux que ça tourne en boucles ? Pour cela, il suffit d'une condition sur y en fin de paintbox. explique. si c'est ça, c'est facile comme tout...
c pas sa !!!
Le probleme est le saccade.
Le rolling fait parfois des pauses de milli millisecondes mais tu les remarke avec les yeux . Il faut ke tu le voit 100% fluides pas de perturbation.
tu as compris?
ok, j'avais pas remarqué...----> graphics 32 pour ton animation.
ok g utilisé gr32 avec une timer directx est c bon mais le probleme que le scroll commence a saccadé aprés klk minutes.
Je doute kil ya un "reglage" dans le S.E windows ki force l'execution de l'application sans aucun interruption
oui, une petite fonction api serait la bienvenue... :roll:
ta pa une idée?
non désolé, tu as anticipé tout ce que ce que je pouvais proposer...
là, je vois pas. ceci dit dans les routines d'écran de veille, je me souviens de bout de code qui forçait l'application à faire des poses. donc le contraire doit être possible...
Bonjour,
un code qui fonctionne bien, avec peut-être parfois un petit flicker que je n'arrive pas à éliminer.
Dans la form timage1 est un enfant de Panel1
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, OleCtrls, SHDocVw, Menus, ExtCtrls; type TForm1 = class(TForm) Timer1: TTimer; Panel1: TPanel; Image1: TImage; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } imagecount : integer ; procedure Drawimage(image:Timage;offset : integer); procedure InitImage(image:Timage); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Panel1.color:=clblack ; InitImage(image1) ; imagecount:=1 ; Timer1.Interval:=10 ; end; procedure TForm1.Timer1Timer(Sender: TObject); begin timer1.Enabled:=false ; inc(imagecount) ; drawimage(image1,imagecount) ; timer1.Enabled:=true ; end; procedure TForm1.Drawimage(image:Timage;offset : integer); var i : integer ; begin for i:=1 to 100 do image1.canvas.textout(100*i-offset,10,'<'+inttostr(i)+'>') ; end ; procedure TForm1.InitImage(image:Timage); begin image.Top:=0 ; Image.left:=0 ; image.Width:=clientwidth ; image.Height:=40 ; image.canvas.brush.color:=clblack ; image.canvas.font.color:=clred ; image.canvas.font.size:=14 ; image.canvas.font.name:='Arial' ; image.ControlStyle:=[] ; image.canvas.fillrect(rect(0,0,image1.width,image1.height)) ; end ; end. [/quote]
ya le compo TScrollingCredits de Raoul Snyman qui marche à merveille,
sinon ya aussi des compo dans la jvcl.
Rebonjour,
Pour éliminer le léger flicker, il suffit d'éxécuter à l'init l'instruction (merci à Caine :lol: )
Code:panel1.doublebuffered:=true ;
et si je ne dessine pas sur un panel comment on fait?et en plus keske sa veut dire ce doublebuffered?Code:
1
2panel1.doublebuffered:=true ;
dans mon code j'ai un pointeur qui designe un buffer a kel j'envoie mon scroll . ya ti une methode de faire le double buffering? :roll:
la méthode que je t'avais proposée te permet de dessiner dans un canvas virtuel celui d'un bitmap et d'afficher en une seule fois à l'aide du draw dans la paintbox. un buffer est une zone de mémoire tampon dédiée aux stockages de données en attente de traitement sur un périphérique.
ton bitmap là joue bien le rôle d'un buffer en ce sens qu'il stocke ton code de défilement du textout sans jamais effectuer les calculs de déplacement à l'affichage. tu bascules dans le réel uniquement sur le draw.
le doublebuffer à true fonctionne de la même manière, simplement tu n'as pas à créer ton buffer toi même.
:lol:
J'ai conclus que la meilleur facon est de utiliser les composants gr32 mais reste un petit probleme: le faite de scroller une image de 300000*60 pixels provoke les scintillements :cry:
ya til une idée pr resoudre ce probleme?
eske win charge toute l'image au memoire?