AddressOf-Operator
Ein unärer Operator, durch den die Adresse der Prozedur, der er vorangestellt ist, an eine API-Prozedur übergeben wird, die an dieser Stelle in der Liste der Argumente einen Funktionszeiger erwartet.
Syntax
AddressOf-Prozedurname
Der erforderliche procedurename gibt die Prozedur an, deren Adresse übergeben wird. Sie muss eine Prozedur in einem Standardmodul in dem Projekt darstellen, in dem der Aufruf erfolgt.
Hinweise
Wenn ein Prozedurname in einer Argumentliste angezeigt wird, wird in der Regel die Prozedur ausgewertet, und die Adresse des Rückgabewerts der Prozedur wird übergeben. AddressOf ermöglicht es, die Adresse der Prozedur an eine Windows-API-Funktion in einer Dynamic Link Library (DLL) zu übergeben, anstatt den Rückgabewert der Prozedur zu übergeben. Die API-Funktion kann dann die Adresse verwenden, um die Basic-Prozedur aufzurufen, einen Prozess, der als Rückruf bezeichnet wird. Der AddressOf-Operator wird nur im Aufruf der API-Prozedur angezeigt.
Sie können zwar mit AddressOf Prozedurzeiger zwischen Basic-Prozeduren übergeben, doch können Sie mit einem solchen Zeiger keine Funktion innerhalb von Basic aufrufen. Dies bedeutet beispielsweise, dass eine in Basic geschriebene Klasse keinen Rückruf an ihren Controller mit einem solchen Zeiger durchführen kann. Wird AddressOf verwendet, um einen Prozedurzeiger zwischen Prozeduren in Basic zu übergeben, muss der Parameter der aufgerufenen Prozedur als As Long eingegeben werden.
Die Verwendung von AddressOf kann zu unvorhersehbaren Ergebnissen führen, wenn Sie mit dem Konzept von Funktionsrückrufen nicht vollständig vertraut sind. Sie müssen wissen, wie der Basic-Teil des Rückrufs und der Code der DLL funktioniert, an den Sie die Funktionsadresse übergeben. Das Debuggen solcher Interaktionen ist schwierig, da das Programm im gleichen Prozess wie die Entwicklungsumgebung ausgeführt wird. In manchen Fällen ist ein systematisches Debuggen vielleicht nicht möglich.
Hinweis
[!HINWEIS] Sie können eigene Prototypen für Rückruffunktionen in DLLs erstellen, die mit Microsoft Visual C++ (oder ähnlichen Tools) kompiliert werden. Damit AddressOf mit dem Prototyp funktioniert, muss dieser die Aufrufkonvention __stdcall verwenden. Die Standardaufrufkonvention (__cdecl) kann mit AddressOf nicht verwendet werden.
Da sich der Aufrufer eines Rückrufs nicht in Ihrem Programm befindet, ist es wichtig, dass ein Fehler in der Rückrufprozedur nicht zurück an den Aufrufer weitergegeben wird. Fügen Sie hierzu die On Error Resume Next-Anweisung am Anfang der Rückrufprozedur ein.
Beispiel
Im folgenden Beispiel wird ein Formular mit einem Listenfeld erstellt, das eine alphabetisch sortierte Liste der Schriften im System enthält.
Erstellen Sie ein Formular mit einem Listenfeld, um diesen Beispielcode auszuführen. Der Code für das Formular lautet wie folgt:
Option Explicit
Private Sub Form_Load()
Module1.FillListWithFonts List1
End Sub
Fügen Sie den folgenden Code in ein Modul ein. Das dritte Argument in der Definition der EnumFontFamilies-Funktion ist ein Long -Argument, das eine Prozedur darstellt. Das Argument muss die Adresse der Prozedur und nicht den Wert enthalten, den die Prozedur zurückgibt. Im Aufruf von EnumFontFamilies benötigt das dritte Argument den AddressOf -Operator, um die Adresse der EnumFontFamProc-Prozedur zurückzugeben, wobei es sich um den Namen der Rückrufprozedur handelt, den Sie beim Aufruf der Windows-API-Funktion EnumFontFamilies angeben. Windows ruft EnumFontFamProc einmal für jede Schriftartenfamilie im System auf, wenn AddressOf EnumFontFamProc an EnumFontFamilies übergeben wird. Das letzte an EnumFontFamilies übergebene Argument gibt das Listenfeld an, in dem die Informationen angezeigt werden.
'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
Siehe auch
Support und Feedback
Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.