De Delphi 2007 vers Delphi 2010

Résolu
benfluorex Messages postés 6 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 15 octobre 2009 - 12 oct. 2009 à 11:46
benfluorex Messages postés 6 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 15 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.

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

Bien cordialement.

5 réponses

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

Cordialement, Bacterius !
3
benfluorex Messages postés 6 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 15 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.
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 oct. 2009 à 22:05
byte(..) est un transtypage vers le type byte et non une fonction.



function GetEventShift(Shift: TShiftState): Integer;
begin
Result := ord(Shift);
end;
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
15 oct. 2009 à 05:34
...

Cordialement, Bacterius !
0

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

Posez votre question
benfluorex Messages postés 6 Date d'inscription jeudi 11 novembre 2004 Statut Membre Dernière intervention 15 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.
0
Rejoignez-nous