Partager via


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.