benfluorex
Messages postés6Date d'inscriptionjeudi 11 novembre 2004StatutMembreDernière intervention15 octobre 2009
-
12 oct. 2009 à 11:46
benfluorex
Messages postés6Date d'inscriptionjeudi 11 novembre 2004StatutMembreDernière intervention15 octobre 2009
-
15 oct. 2009 à 13:18
Bonjour,
Je ne comprend pas bien le fonctionnement de la fonction suivante
qui vient de l'unit AxCtrls
(ActiveX Controls Unit Copyright (c) 1995,99 Inprise Corporation)
function GetEventShift(Shift: TShiftState): Integer;
const
ShiftMap: array[0..7] of Byte = (0, 1, 4, 5, 2, 3, 6, 7);
begin
Result := ShiftMap[Byte(Shift) and 7];
end;
ni pourquoi Byte(Shift) qui était un transtypage correct
avec Delphi 2007 ne l'est plus avec Delphi 2010,
ni de manière générale ce qu'est la fonction Byte.
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 12 oct. 2009 à 12:46
Cette fonction (je suppose) renvoie un indice correspondant au type TShiftState : il renverra 0 pour le premier élément de TShiftState, 1 pour le 2eme, etc ... Byte transtype le type TShiftState en type byte (octet), ce n'est pas une fonction (ne génère aucun code). Essaye "ord" à la place de "byte" à tout hasard ?
benfluorex
Messages postés6Date d'inscriptionjeudi 11 novembre 2004StatutMembreDernière intervention15 octobre 2009 13 oct. 2009 à 11:42
Je remercie Bacterius pour sa réponse.
Je crois avoir compris pourquoi le code Byte(Shift) ne marchait pas avec delphi 2010.
Dans Delphi 2007 TShifState = Set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMidlle, ssDouble) soit 7 éléments.
Dans Delphi 2010 2 éléments ont été rajoutés ssTouch et ssPen soit 9 éléments.
Byte s'applique, à priori, à des ensembles ne dépassant pas 8 éléments de base.
Une remarque sous Delphi 2007:
Byte(ssShift) retourne 0 comme Ord(ssShift)
s := [] Byte(s) retourne 0
s := [ssShift] Byte(s) retourne 1.
Bien cordialement.
benfluorex
Messages postés6Date d'inscriptionjeudi 11 novembre 2004StatutMembreDernière intervention15 octobre 2009 15 oct. 2009 à 13:18
Bonjour,
Merci à foxi pour son post.
Shift est de type TShiftState déclaré dans Classes
TShiftState = set of (ssShift,ssAlt,ssCtrl,ssLeft,ssRight,ssMiddle,ssDouble)
Si Ord(ssCtrl) donne le même résultat que Byte(ssCtrl) soit 2,
Ord ne semble pas pouvoir s'appliquer à un TShiftState qui est un ensemble, par exemple Shift := [ssShift,ssCtrl];
La solution maladroite, partielle et provisoire, que j'ai trouvé pour rendre compatible la fonction GetEventShift, uniquement dans le contexte de mon utilisation, avec D2010 est la suivante:
function Ma_GetEventShift(Shift: TShiftState): Integer;
begin
Result := 0;
if ssShift in Shift then Result := Result + 1;
if ssCtrl in Shift then Result := Result + 2;
if ssAlt in Shift then Result := Result + 4;
// result=7 indique que les 3 touches du clavier sont préssées.
end;
Encore une fois merci de l'aide apportée.
Bien cordialement.