Volume windows + trackbar

bobstien Messages postés 38 Date d'inscription lundi 4 avril 2005 Statut Membre Dernière intervention 1 mars 2007 - 28 mars 2006 à 07:13
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 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

4 réponses

Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
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...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.

<hr size="2" width="100%">
0
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
28 mars 2006 à 16:54
Oui tu as raison f0xi. Ca doit être mon habitude à tout vouloir faire (trops) vite...

Matt


<HR width="100%" SIZE=2>
La paresse est la mère du génie...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
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.

<hr size="2" width="100%">
0
Rejoignez-nous