function _Max(const A, B : integer) : integer;
begin if A > B then result := A else result := B; end;
function _Min(const A, B : integer) : integer;
begin if A < B then result := A else result := B; end;
procedure TForm1.TrackBarMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with (Sender as TTrackBar) do
begin
case Orientation of
trHorizontal :
begin
Position := _Max(_Min(round( (Max/(Width)) * X), Max),Min);
end;
trVertical :
begin
Position := _Max(_Min(round( (Max/(Height)) * Y), Max),Min);
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.OnMouseUp := TrackBarMouseUp;
end;
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 14 juil. 2007 à 13:00
"Impossible n'est pas f0xi"
Bien vu !
Mais...
En gardant ta manière, j'ai modifié l'algorithme pour améliorer le comportement.
Je placé le code dans OnMouseDown, mais ça se discute.
Ça donne :
procedure TForm1.TrackBarMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
with (Sender as TTrackBar) do
begin
case Orientation of
trHorizontal :
Position := Round ( ((X - 11) * Max) / (Width - 22) );
trVertical :
Position := Round ( ((Y - 11) * Max) / (Height - 22) );
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.OnMouseDown := TrackBarMouseDown;
end;
De part le fonctionnement d'un TrackBar ce n'est pas possible de le faire avec précision sauf si la propriété Max correspond à Width. Sinon dans le meilleur des cas la fonction GetCursorPos peut te permettre de le position de facon approximative avec la procedure OnChange.
cs_morinxav2
Messages postés67Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention 6 octobre 20114 14 juil. 2007 à 22:50
Bonsoir,
C'est beau de voir des Professionnels en action.
Merci beaucoup
Etant autodidacte, je viens de comprendre en plus de la reponse a ma question, comment on pouvait ajouter un evenement manquant a un composant existant et dynamiquement parlant.
Encore un Grand Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
florenth
Messages postés1023Date d'inscriptiondimanche 1 août 2004StatutMembreDernière intervention17 août 20083 16 juil. 2007 à 15:13
@japee: je serais curieux d savoir d'où viens la valeur "11" que tu soustrais dans le code ...
C'est une histoire de largeur du bidule qu'on déplace avec la souris ou je suis complètement à côté ?
Sinon... et pourquoi pas dans le OnMouseMove alors ? ça peut être plus convivial dans certains cas (à condition que le code du OnChange ne prenne pas 5 sec à s'exécuter)
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 16 juil. 2007 à 19:47
@florenth :
11 est la valeur de x quand le curseur se trouve sur la première graduation (position = 0).
D'après mes observations, cette valeur ne change pas quelle que soit la dimension du TTrackbar... Bon, ça reste peut-être à vérifier selon les évolutions de l'OS ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 16 juil. 2007 à 21:25
si j'ai mis le code dans le MouseUp c'est qu'il y a une raison.
si je n'ai pas pris en compte la marge et appliquer un min/max c'est aussi pour certaines raisons. :)