Trackbar position avec la souris

Résolu
cs_morinxav2
Messages postés
67
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
6 octobre 2011
- 13 juil. 2007 à 23:56
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
- 16 juil. 2007 à 21:25
Bonsoir,

Comment peut on positionner le curseur d'un trackbar a l'endroit ou l'on clique avec la souris?

Merci d'avance

7 réponses

f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
14 juil. 2007 à 10:26
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TTrackBar = class(ComCtrls.TTrackBar)
  published
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
  end;

  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
  public
    procedure TrackBarMouseUp(Sender: TObject; Button: TMouseButton;
                                Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

  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;

end.
3
japee
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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;

Bonne prog'
3
Utilisateur anonyme
14 juil. 2007 à 01:13
Salut,

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.

@++
0
cs_morinxav2
Messages postés
67
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
6 octobre 2011
4
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth
Messages postés
1023
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
17 août 2008
2
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)

++
0
japee
Messages postés
1727
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
6 novembre 2021
8
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 ?
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
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. :)
0