De Delphi 2007 vers Delphi 2010 [Résolu]

Signaler
Messages postés
6
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2009
-
Messages postés
6
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2009
-
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.

Merci à tous ceux qui voudront bien m'éclairer.

Bien cordialement.

5 réponses

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
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 ?

Cordialement, Bacterius !
Messages postés
6
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2009

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.
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
byte(..) est un transtypage vers le type byte et non une fonction.



function GetEventShift(Shift: TShiftState): Integer;
begin
Result := ord(Shift);
end;
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
9
...

Cordialement, Bacterius !
Messages postés
6
Date d'inscription
jeudi 11 novembre 2004
Statut
Membre
Dernière intervention
15 octobre 2009

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.