Bonjour,
un soupçon d'explications, en s'appuyant sur cette jolie image :
de gauche à droite 24 TPanel's, qui embarquent chacun une TCheckBox, et à droite toute 3 TLabeledEdit's pour afficher les valeurs R, G et B.
Entre ces deux parties on voit les sommets de 3 TrackBar's pour les informations H, S et L.
Bien.
Pour parcourir dans un sens ou dans l'autre ces panneaux, j'utilise les flèches gauche et droite du clavier, c'est tellement plus sympa et plus rapide, et donc je gère l'événement OnKeyDown, et c'est là que je vous conseille d'arrêter de fumer et d'attacher votre ceinture, on arrive dans une zone de turbulences...
En effet, selon le sens de parcours, les logs montrent qu'un événement est généré complètement en dehors de mon contrôle, si si !
J'ai planté des lignes de log partout dans mon code (True pour avoir l'heure), je le résume ainsi :
Ce bloc n'existe pas dans le déplacement vers la droite à 10:17:23, très bien, je n'en veux pas, il ne devrait pas exister dans le déplacement vers la gauche, et pourtant il est là !, sorti de nulle part...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // j'appuie sur "flèche droite" 10:17:23 deb FormKeyDown, key 39 10:17:23 fin FormKeyDown // j'attends 2 secondes et j'appuie sur "flèche gauche" 10:17:25 deb FormKeyDown, key 37 10:17:25 fin FormKeyDown // le saut de ligne ici c'est juste visuel pour séparer le bloc suivant 10:17:25 deb ComputeHSLcolor, gestion événements des trackbars HSL 10:17:25 ComputeHSLcolor après test d''entrée 10:17:25 deb SetupRGBcounters 10:17:25 fin SetupRGBcounters 10:17:25 fin ComputeHSLcolor
La détection du sens de circulation, dans la sous-procédure SetupColonne de FormKeyDown :
et le case de détection de la touche enfoncée, dans le begin...end; de FormKeyDown :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 previusPanel := currentPanel; // 2 TPanel's de travail id := StrToInt(Copy(currentPanel.Name,6,Length(currentPanel.Name)-1)); if sens = 0 then begin // on recule dec(id); if id = -1 then id := 23; end else begin // on avance inc(id); if id = 24 then id := 0; end; currentPanel := TPanel(gpbxColonnes.Controls[id]);
J'ai écrit "sorti de nulle part" car si j'ai mis un point d'arrêt à l'entrée de la proc ComputeHSLcolor (c'est elle qui gère les événements des 3 trackbars) pour demander l'affichage de la pile d'appels, tout ce que j'y vois c'est qu'il y aurait un événement concernant un TrackBar, oui, mais je n'y touche pas, ni ma souris ni mon code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 log('FormKeyDown, avant case, Key '+inttostr(Key), True); case Key of 37: SetupColonne(0); // en arrière à gauche 39: SetupColonne(1); // en avant à droite 72: begin verrouHSL:=True; trkH.SetFocus;end; // h 76: begin verrouHSL:=True; trkL.SetFocus;end; // l 83: begin verrouHSL:=True; trkS.SetFocus;end; // s 70: ; // f en attente 78: begin verrouHSL:=True; ckbxGris.SetFocus;end; // n end; log('FormKeyDown, après case, Key '+inttostr(Key), True); log('fin FormKeyDown', True); end;
Alors ?
Le seul endroit où il y a une instruction trkH.Position:=une_valeur c'est dans la proc SetupHSLcurseurs, qui n'est pas appelée (point d'arrêt inefficace).
Cette proc est équipée des mêmes lignes de log que les autres, et il n'y a rien dans le log la concernant.
Alors ?
Sur cette image on voit bien en bas ligne 8 l'événement concernant un trackbar, ok, mais il sort d'où ? Qui a tripoté mon trackbar dans mon dos ?
En cliquant sur cette ligne 8 on se retrouve là, et un point d'arrêt sur la 1re ligne ligne puis F9 pour continuer et flèche à gauche à nouveau, même pas je fais une copie d'écran, c'est juste incompréhensible.
Bref, je suis sec comme une éponge au soleil, là.
Je compte sur vous, parce que mine de rien, ce gag met le bronx dans la gestion des couleurs je vous dis pas...
Bon dimanche et joyeuses Pâques,
EDIT :
un examen attentif de la première image tout en haut montre que le trackbar H a le focus, et ce dès l'affichage de la fiche après F9. Comment ? Pourquoi ? La seule ligne pouvant le lui donner est dans le case, Key 72 = touche "h" appuyée, et je jure de ne pas avoir appuyé sur cette touche.
En désespoir de cause, je tente un truc de malade, forcer l'ActiveControl dans l'inspecteur d'objets, qui est vide, au GroupBox contenant les TPanel's et là, ô miracle, ça tombe en marche !
À la réflexion, je vais plutôt le mettre dans le FormCreate, des fois que dans l'inspecteur d'objets ça saute (parfois constaté).
Je vais tester dans tous les sens avant de cocher , je pourrais tout aussi bien supprimer totalement ce post mais je préfère le garder pour l'édification des générations futures…
Bon sang, le diable se cache vraiment dans les détails !
Oui, je sais, il y a une faute d'orthographe non corrigée, j'ai écrit Previus au lieu de Previous, mais c'est pour l'alignement vertical :
Vous imaginez ça comm' ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (previusPanel.Controls[0] as TCheckBox).Checked:=False; (currentPanel.Controls[0] as TCheckBox).Checked:=True;
Non mais allô quoi,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 (previousPanel.Controls[0] as TCheckBox).Checked:=False; (currentPanel.Controls[0] as TCheckBox).Checked:=True;
Partager