Hallo Leute,
ich habe mir heute das Dll-Tutorial von @BugFix angeschaut. Da schreibt er u.a. (es ist wohl schon etwas her):
Mit Einführung der Version 3.3.10.0 gab es Syntaxänderungen. Dadurch ist ein geänderter Zugriff auf Strukturelemente möglich. Die Bsp. sind dahingehend angepasst.
Die Verwendung der Punktnotation(Strukturname.Feld) ist zwar syntaktisch möglich, ganz offiziell aber kein sicherer Zugriffsstandard. Sollte es also damit mal nicht klappen, ist auf die Standardsyntax zurückzugreifen.
Ist das noch aktuell? Im engl. Forum habe ich dazu nur eine Diskussion von 2014 entdeckt und dann nochmal diese Aussage von trancexx.
Mir gefällt die kurze Schreibweise und ich habe das mit einem Beispiel zu einem Listview-Klick getestet. Ich wollte mal schauen, ob es Nachteile dabei gibt und habe einen Fehler provoziert.
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <GuiImageList.au3>
#include <GuiListView.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
Global $g_idListView, $g_hStatusBar
Example()
Func Example()
Local $hGUI
; Create GUI
Local $hGUI = GUICreate("", 400, 300)
$g_idListView = GUICtrlCreateListView(" ", 2, 2, 394, 268)
GUICtrlCreateListViewItem("item2", $g_idListView)
GUICtrlCreateListViewItem("item1", $g_idListView)
GUICtrlCreateListViewItem("item3", $g_idListView)
$g_idListView = GUICtrlGetHandle($g_idListView) ; get the handle for use in the notify events
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
; Loop until the user exits.
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()
EndFunc ;==>Example
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
$hWndListView = $g_idListView
If Not IsHWnd($g_idListView) Then $hWndListView = GUICtrlGetHandle($g_idListView)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
$test = DllStructGetData($tInfo, "Index")
_DebugPrint("Index-Wert: " & $test & " @error: " & @error)
$test = DllStructGetData($tInfo, "Nonsens")
_DebugPrint("Nonsens-Wert: " & $test & " @error: " & @error)
$test = $tInfo.Index
_DebugPrint("Index-Wert: " & $test & " @error: " & @error)
$test = $tInfo.Nonsens
_DebugPrint("Nonsens-Wert: " & $test & " @error: " & @error)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _DebugPrint($s_Text, $sLine = @ScriptLineNumber)
ConsoleWrite( _
"!===========================================================" & @CRLF & _
"+======================================================" & @CRLF & _
"-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $s_Text & @CRLF & _
"+======================================================" & @CRLF)
EndFunc ;==>_DebugPrint
Alles anzeigen
In der besagten Diskussion behauptete einer, die Kurzschreibweise sei nicht nur kürzer, sondern in der Ausführung viel schneller. Im Code frage ich aber nicht nur nach Index sondern gleich darauf nach Nonsens, was natürlich Quatsch ist und eine Fehlermeldung bringt. Überrascht hat mich, dass auch bei der Punkt-Notation @error den Wert 2 bekommen hat (in der Funktion DllStructGetData bedeutet error 2 = Element out of range or unknown. - was ja passt).
Sieht so aus, als wird im Hintergrund weiter DllStructGetData ausgeführt, oder?
Kann man das nun sicher benutzen, oder sollte man das meiden? Hat jemand aktuellere Informationen?