Also wenn ich das richtig sehe, darf an also in Macros weder das "Doppelhäkchen" noch die "Raute" im Code nutzen, in Macros mit Parameter. Muß ich beides mit "Hilfsmacros" darstellen!?
Ähem, jetzt wo ich schreibe, sehe ich das es doch geht, oder auch nicht!? Bin doch etwas verwirrt. In der Hilfe steht das Beispiel
Code: Alles auswählen
Beispiel: Fortgeschrittenes mehrzeiliges Makro
Macro DoubleQuote
"
EndMacro
Macro Assert(Expression)
CompilerIf #PB_Compiler_Debugger ; 'Assert' (Erklärung) nur im Debug-Modus aktivieren
If Expression
Debug "Assert (Line " + Str(#PB_Compiler_Line) + "): " + DoubleQuote#Expression#DoubleQuote
EndIf
CompilerEndIf
EndMacro
Assert(10 <> 10) ; Wird nichts anzeigen
Assert(10 <> 15) ; Sollte die Erklärung anzeigen
In der Debugzeile wird ja doch das DoubleQuote genutzt, aber nicht überall. Wieso kann man nicht
Code: Alles auswählen
Debug "Assert (Line " + Str(#PB_Compiler_Line) + "): " + "#Expression#"
schreiben?
Muß das Hilfsmacro immer dann nehmen, wenn der zu ersetzende Ausdruck innerhalb von Häkchen steht? Weshalb?
Was ist mit der Raute? Bei der Konstante passiert nichts und "Expression" ist es ein Verbindungszeichen. Welche regel gibt es da? Ich kapiere das noch nicht.
Folgendes:
Code: Alles auswählen
Macro DoubleQuote
"
EndMacro
Macro Assert(Expression,w)
CompilerIf #PB_Compiler_Debugger ; 'Assert' (Erklärung) nur im Debug-Modus aktivieren
If Expression
Debug "wAssert (Line " + Str(#PB_Compiler_Line) + "): " + DoubleQuote#Expression#DoubleQuote
EndIf
CompilerEndIf
EndMacro
Assert(10 <> 10,kkk) ; Wird nichts anzeigen
Assert(10 <> 15,kkk) ; Sollte die Erklärung anzeigen
Was muß ich machen, damit das "w" in der Debugzeile durch die Übergabe ersetzt wird? Habe das bisher nicht hinbekommen. Es klappt einfach nicht.
Es sollte also "kkkAssert (Line....." ausgegeben werden.
Wenn ich die korrekte Übersetzung sehen würde, könnte das mein Verständis doch um einige erweitern
Um zu meinem eigenen Code zu kommen will ich Folgenden Code in ein Macro umwandeln
Code: Alles auswählen
SizeOfBQI_BatteryUniqueID = 1
dwOut = 0
bqi\InformationLevel = #BatteryUniqueID
ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID = _AllocateMemory(SizeOfBQI_BatteryUniqueID*2+2)
Repeat
ReturnDeviceIoControl2 = DeviceIoControl_(hBattery, #IOCTL_BATTERY_QUERY_INFORMATION, @bqi, SizeOf(bqi), ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID,SizeOfBQI_BatteryUniqueID*2+2, @dwOut, #Null)
ReturnGetLastErrorDeviceIoControl2 = GetLastError_()
setlasterror_(0)
If dwOut = 0 And (ReturnGetLastErrorDeviceIoControl2 = #ERROR_INSUFFICIENT_BUFFER Or ReturnGetLastErrorDeviceIoControl2 = #ERROR_MORE_DATA)
SizeOfBQI_BatteryUniqueID + 1
ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID = _ReAllocateMemory(ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID,SizeOfBQI_BatteryUniqueID*2+2)
EndIf
Until (dwOut <> 0 And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_MORE_DATA And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_INSUFFICIENT_BUFFER) Or (ReturnGetLastErrorDeviceIoControl2 <> 0 And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_INSUFFICIENT_BUFFER And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_MORE_DATA)
If ReturnDeviceIoControl2 <> 0 And ReturnGetLastErrorDeviceIoControl2 = 0
Else
ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID_ERROR = ReturnGetLastErrorDeviceIoControl2
EndIf
If ReturnGetLastErrorDeviceIoControl2 <> 0
ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID_ERROR = ReturnGetLastErrorDeviceIoControl2
Debug "BQI_BatteryUniqueID_ERROR: " + Str(ll_EnumeratingBatteryDevices()\BQI_BatteryUniqueID_ERROR)
EndIf
Macro macro_bqi_GetUniCodePointerData(InformationLevelName)
...
EndMacro
Da man leider nicht sehen kann, an welcher Stelle ein Fehler ist, wenn man das Programm startet, komme ich nicht (mit Sicherheit) weiter.
Nach einigem testen würde ich es so machen, bin mir aber nicht sicher:
Code: Alles auswählen
Macro macro_bqi_GetUniCodePointerData(InformationLevelName)
SizeOfBQI_#InformationLevelName = 1
Debug "SizeOfBQI_BatterySerialNumber= " + Str(SizeOfBQI_BatterySerialNumber)
dwOut = 0
bqi\InformationLevel = #InformationLevelName
Debug " bqi\InformationLevel= " + Str( bqi\InformationLevel)
ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName = _AllocateMemory(SizeOfBQI_#InformationLevelName*2+2)
Debug DoubleQuote ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName= DoubleQuote + Str( ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName)
Repeat
ReturnDeviceIoControl2 = DeviceIoControl_(hBattery, #IOCTL_BATTERY_QUERY_INFORMATION, @bqi, SizeOf(bqi), ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName,SizeOfBQI_#InformationLevelName*2+2, @dwOut, #Null)
ReturnGetLastErrorDeviceIoControl2 = GetLastError_()
setlasterror_(0)
If dwOut = 0 And (ReturnGetLastErrorDeviceIoControl2 = #ERROR_INSUFFICIENT_BUFFER Or ReturnGetLastErrorDeviceIoControl2 = #ERROR_MORE_DATA)
SizeOfBQI_BatteryUniqueID + 1
ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName = _ReAllocateMemory(ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName,SizeOfBQI_#InformationLevelName*2+2)
EndIf
Until (dwOut <> 0 And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_MORE_DATA And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_INSUFFICIENT_BUFFER) Or (ReturnGetLastErrorDeviceIoControl2 <> 0 And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_INSUFFICIENT_BUFFER And ReturnGetLastErrorDeviceIoControl2 <> #ERROR_MORE_DATA)
If ReturnDeviceIoControl2 <> 0 And ReturnGetLastErrorDeviceIoControl2 = 0
Else
ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName#_ERROR = ReturnGetLastErrorDeviceIoControl2
EndIf
If ReturnGetLastErrorDeviceIoControl2 <> 0
ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName#_ERROR = ReturnGetLastErrorDeviceIoControl2
Debug DoubleQuote#BQI_#InformationLevelName#_ERROR: DoubleQuote + Str(ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName#_ERROR)
EndIf
EndMacro
Wie ich gerade sehe, ist die Zeile
Code: Alles auswählen
Debug DoubleQuote#BQI_#InformationLevelName#_ERROR: DoubleQuote + Str(ll_EnumeratingBatteryDevices()\BQI_#InformationLevelName#_ERROR)
nicht korrekt, denn nach dem ersten DoubleQuote wird im Ausgabefenster das Zeichen "#" mit ausgegeben, besser gesagt, die Ausgabe fängt in dieser Zeile mit dem "#" an.
1. Win10
PB6.1