Comment puis-je implémenter un OnMouseEnter/Leave sur les items de ma collection?
Mon composant est une statutBar, et je voudrais que lorsque je passe sur un panel, il change de couleur....
Comment puis-je implémenter un OnMouseEnter/Leave sur les items de ma collection?
Mon composant est une statutBar, et je voudrais que lorsque je passe sur un panel, il change de couleur....
Bonjour,
De mémoire il faut que tu gère ça dans OnMouseMove de la barre.
Je pourrai confirmer ce soir, j'ai utilisé une statusbar pour gérer des boutons dedans.
Yan.
devYan.
Ca serait pas un code de ce style ?:
A celà j'ajouterai 2 fonction pour savoir sur quel panel on est et quel est son index...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 TPanelItem = class(TCollectionItem) protected procedure CMMouseEnter(var Msg: TMessage); message CM_MouseEnter; procedure CMMouseLeave(var Msg: TMessage); message CM_MouseLeave; ... TMyStatusBar = class (TCustomControl) protected procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);override;
Mais peut-être que Sjrd est dans le coin ?
En tout cas merci pour ta réponse Devyan
Re-bonjour,
En fait le problème est que les TStatusPanels de la TStatusBar n'on pas de "vie réelle" en tant que contrôle (ou élément fenêtré comme un TPanel si tu préfères, ce sont des TCollectionItems <- TPersistent <- TObject)
OnMouseEnter n'est généré que lorsque tu entre dans la zone de la TStatusBar et pas lorsque tu te déplace horizontalement DANS la barre d'état.
le TStatusPanel n'a de disponible que sa largeur re-
Donc tu vas devoir faire le calcul tout seul à chaque fois.
Personnellement j'ai réglé le problème comme ceci pour la gestion du Hint :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 procedure TForm1.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var i, o: Integer; h: String; begin o := 1; h := StatusBar1.Hint; try StatusBar1.Hint := ''; for i := 0 to StatusBar1.Panels.Count - 1 do begin inc(o, StatusBar1.Panels[i].Width); with StatusBar1.Panels[i] do if (Y >= 3) and (Y <= 14) and (X >= (o - Width)) and (X < o) then begin case TStatusBarPanels(i) of sbpBtnFirst .. sbpBtnLast : begin case TStatusBarPanels(i) of sbpBtnFirst : StatusBar1.Hint := ActionFirst.Hint; . . . sbpBtnLast : StatusBar1.Hint := ActionLast.Hint; else ; end; end; sbpPFileName : StatusBar1.Hint := _Actual.FileName; else ; end; end; finally if (h <> StatusBar1.Hint) then Application.CancelHint; end;
Yan.
devYan.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager