Opérateur AddressOf
Opérateur unaire qui entraîne le passage de l'adresse de la procédure qu'il précède à une procédure d'API qui attend un pointeur de fonction à cette position dans la liste d'arguments.
Syntaxe
AddressOfnom_procédure
L'argument procedurename obligatoire indique la procédure dont l'adresse doit être passée. Il doit représenter une procédure dans un module standard du projet dans lequel l’appel est effectué.
Remarques
Lorsqu’un nom de procédure apparaît dans une liste d’arguments, la procédure est généralement évaluée et l’adresse de la valeur de retour de la procédure est passée. AddressOf permet de passer l’adresse de la procédure à une fonction d’API Windows dans une bibliothèque de liens dynamiques (DLL), au lieu de transmettre la valeur de retour de la procédure. La fonction API peut ensuite utiliser l’adresse pour appeler la procédure De base, un processus appelé rappel. L’opérateur AddressOf apparaît uniquement dans l’appel à la procédure d’API.
Bien que vous puissiez utiliser AddressOf pour passer les pointeurs de procédure entre les procédures Basic, vous ne pouvez pas appeler une fonction au moyen d'un tel pointeur dans Basic. Cela signifie, par exemple, qu’une classe écrite en basic ne peut pas effectuer un rappel à son contrôleur à l’aide d’un tel pointeur. Si vous utilisez AddressOf pour passer une procédure entre des procédures dans Basic, le paramètre de la procédure appelée doit être de type As Long.
L'utilisation de l'opérateur AddressOf peut entraîner des résultats imprévisibles si vous ne comprenez pas le concept des rappels de fonction. Vous devez comprendre comment fonctionne la partie Basic d'un rappel, ainsi que le code du fichier DLL dans lequel vous passez l'adresse de votre fonction. Le débogage de ces interactions est difficile, car le programme s’exécute dans le même processus que l’environnement de développement. Dans certains cas, le débogage systématique est impossible.
Remarque
Vous pouvez créer vos propres prototypes de fonction de rappel dans des fichiers DLL compilés avec Microsoft Visual C++ (ou des outils similaires). Pour fonctionner avec AddressOf, votre prototype doit utiliser la convention d'appel __stdcall. La convention d'appel par défaut (__cdecl) ne fonctionne pas avec AddressOf.
Étant donné que l’appelant d’un rappel n’est pas dans votre programme, il est important qu’une erreur dans la procédure de rappel ne soit pas propagée à l’appelant. Pour cela, insérez l'instruction On Error Resume Next au début de la procédure de rappel.
Exemple
Cet exemple crée un formulaire avec une zone de liste contenant une liste dans l'ordre alphabétique de toutes les polices disponibles dans votre système.
Pour exécuter cet exemple, créez un formulaire contenant une zone de liste. Le code du formulaire est le suivant :
Option Explicit
Private Sub Form_Load()
Module1.FillListWithFonts List1
End Sub
Insérez le code suivant dans un module. Le troisième argument dans la définition de la fonction EnumFontFamilies est un Long qui représente une procédure. L'argument doit contenir l'adresse de la procédure, plutôt que la valeur renvoyée par la procédure. Dans l'appel à la fonction EnumFontFamilies, le troisième argument nécessite l'opérateur AddressOf pour renvoyer l'adresse de la procédure EnumFontFamProc, qui est le nom de la procédure de rappel spécifié lors de l'appel de la fonction Windows API, EnumFontFamilies. Windows appelle EnumFontFamProc une fois pour chacune des familles de polices sur le système lorsque vous passez AddressOf EnumFontFamProc à EnumFontFamilies. Le dernier argument passé à EnumFontFamilies indique la zone de liste dans laquelle s'affichent les informations.
'Font enumeration types
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64
Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(LF_FACESIZE) As Byte
End Type
Type NEWTEXTMETRIC
tmHeight As Long
tmAscent As Long
tmDescent As Long
tmInternalLeading As Long
tmExternalLeading As Long
tmAveCharWidth As Long
tmMaxCharWidth As Long
tmWeight As Long
tmOverhang As Long
tmDigitizedAspectX As Long
tmDigitizedAspectY As Long
tmFirstChar As Byte
tmLastChar As Byte
tmDefaultChar As Byte
tmBreakChar As Byte
tmItalic As Byte
tmUnderlined As Byte
tmStruckOut As Byte
tmPitchAndFamily As Byte
tmCharSet As Byte
ntmFlags As Long
ntmSizeEM As Long
ntmCellHeight As Long
ntmAveWidth As Long
End Type
' ntmFlags field flags
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&
' tmPitchAndFamily flags
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4
Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0
' EnumFonts Masks
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4
Declare Function EnumFontFamilies Lib "gdi32" Alias _
"EnumFontFamiliesA" _
(ByVal hDC As Long, ByVal lpszFamily As String, _
ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
ByVal hDC As Long) As Long
Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _
ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
EnumFontFamProc = 1
End Function
Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
LB.Clear
hDC = GetDC(LB.hWnd)
EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
ReleaseDC LB.hWnd, hDC
End Sub
Voir aussi
Assistance et commentaires
Avez-vous des questions ou des commentaires sur Office VBA ou sur cette documentation ? Consultez la rubrique concernant l’assistance pour Office VBA et l’envoi de commentaires afin d’obtenir des instructions pour recevoir une assistance et envoyer vos commentaires.