bobstien
Messages postés38Date d'inscriptionlundi 4 avril 2005StatutMembreDernière intervention 1 mars 2007
-
28 mars 2006 à 07:13
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
28 mars 2006 à 19:33
Bonjour, j ai un programme dans lequel je peux régler le son à l'aide
d' un trackbar. Lorsque je modifie ce trackbar, le volume principal
windows diminue ou augmente et le track bar prinipal prend la meme
position que celui de mon apli. Mon problème c est que j aimerais bien
pouvoir changer le son depuis le trackbar principal windows et que
celui de mon apli prenne la même position, mais je n y arrive pas...
Merci d'avance
Matt 261
Messages postés1173Date d'inscriptionmercredi 2 novembre 2005StatutMembreDernière intervention10 septembre 20113 28 mars 2006 à 10:39
Salut,
moi je ferais comme ça : un timer (avec interval 1 ms) qui récupère le volume de Windows et qui règle la position de la TrackBar en fonction de cela.
Exemple : (version (très) simplifiée)
Procedure Timer1Timer....
begin ici ton code pour changer le son
SonWin := Le_son_de_Windows
TrackBar1.Position := SonWin //Il faut peut-être le transformer (IntToStr,...)
end ;
Ce n'est pas très précis mais donne moi le code dont tu te sers pour changer le volume (il y en a 500 000) et j'essayerais de te faire un truc un peu mieux fait...
@+ Matt
<HR width ="100%" SIZE=2>
La paresse est la mère du génie...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 28 mars 2006 à 16:27
pas besoin d'un interval si petit!
astuce : pour obtenir un rafraichissement de methode peu gourmand et suffisament fluide il faut regler l'interval du timer pour obtenir 15 a 25 passe par secondes.
soit : timer.interval := 1000 div 25 (au plus grand) ou 1000 div 15 (au plus petit).
c'est comme les FPS pour la video, entre 15 et 25 FPS le refresh est suffisament important pour que ça reste fluide.
ce qui nous donne un interval compris entre 40 < i > 65 millisecondes.
a 50ms nous aurons 20 passes/secondes, ce qui est deja bien raisonnable.
cela ne sert a rien d'avoir 1000 passes/secondes, ça occuperais le CPU pour rien.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 28 mars 2006 à 19:33
c'est tout comme les boucles qui necessite un appel a Application.ProcessMessage;
on appeleras pas ProcessMessage a chaque boucle, on ferat :
for X := 1 to 10000 do begin
// on appel une fois sur 2
if (X mod 2) = 0 then Application.ProcessMessage;
// on appel une fois sur 5
if (X mod 5) = 0 then Application.ProcessMessage;
end;
parce que de trop nombreux appel ralentissent les routines.
interval trop petit, trop d'appel a processmessage ect...
dans un timer on pourrat egalement faire la meme chose :
var X : integer = 0;
procedure Timer1.Timer1OnTimer(Sender : TObject);
begin
if X > 1000 then X := 0;
inc(X);
if (X mod 2) then Application.ProcessMessage;
end;
ce qui fait que, si on a regler l'interval a 50 ms, on traiteras les messages en file d'attente toute les 100 ms ou toute les 250ms (x mod 5).
ce qui est largement raisonnable, tout en handicapant pas trop les performances de notre methode.
cela permet aussi d'accumuler un certains nombres de messages dans la file d'attente et donc de ne pas appeler ProcessMessage pour rien.
Les messages sont de maniere generale traités assé rapidement, donc ça nous permet de gagner des precieuses secondes dans nos methodes tout en gardant une application relativement fluide meme en pleine charge.