1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Kanashius

Beiträge von Kanashius

  • sortieren nach IP

    • Kanashius
    • 26. Juni 2024 um 11:15

    Ich werf noch mal eine andere Lösung in den Ring, die auch den Ansatz von AspirinJunkie verfolgt: Sortieren nach der IP als Zahl. Wobei ich den BinaryString nehme, weil die Zahl manchmal negativ wäre.

    AutoIt
    Local $sLogData = 	"2024/06/23 18:02:36 - Client connected"&@crlf& _
    				"2024/06/23 18:02:36 - action=login pcname=N210708_b mac=5C61994A3157 ip=192.168.178.22 time=18:02:36"&@crlf& _
    				"2024/06/23 18:06:55 - Client connected"&@crlf& _
    				"2024/06/23 18:06:55 - action=logout pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:06:55"&@crlf& _
    				"2024/06/23 18:10:30 - Client connected"&@crlf& _
    				"2024/06/23 18:10:30 - action=login pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:10:30"&@crlf& _
    				"2024/06/23 18:13:50 - Client connected"&@crlf& _
    				"2024/06/23 18:13:50 - action=logout pcname=N210708_B mac=5C61994A3157 ip=192.168.178.22 time=18:13:50"&@crlf& _
    				"2024/06/23 18:18:20 - Server started and listening on port 8085"
    
    Local $arLogData = _parseLog($sLogData)
    
    ; Example for reading the data
    For $i = 0 to UBound($arLogData)-1 Step 1
    	ConsoleWrite(($i+1)&". For sorting: "&$arLogData[$i][0]&@crlf)
    	ConsoleWrite(($i+1)&". LogDate: "&$arLogData[$i][1].logDate&@crlf)
    	ConsoleWrite(($i+1)&". LogTime: "&$arLogData[$i][1].logTime&@crlf)
    	ConsoleWrite(($i+1)&". Action: "&$arLogData[$i][1].action&@crlf)
    	ConsoleWrite(($i+1)&". PCName: "&$arLogData[$i][1].pcname&@crlf)
    	ConsoleWrite(($i+1)&". Mac: "&$arLogData[$i][1].mac&@crlf)
    	ConsoleWrite(($i+1)&". IP: "&$arLogData[$i][1].ip&@crlf)
    	ConsoleWrite(($i+1)&". Time: "&$arLogData[$i][1].time&@crlf)
    Next
    
    Func _parseLog($sLog)
    	Local $arData = StringRegExp($sLog, "(?<date>\d{4}\/\d{2}\/\d{2})\s(?<time>\d{2}:\d{2}:\d{2}\s)-\saction=(?<action>\S+)\spcname=(?<pcname>\S+)\smac=(?<mac>\S+)\sip=(?<ip>(?<ip1>\d+)\.(?<ip2>\d+)\.(?<ip3>\d+)\.(?<ip4>\d+))\stime=(?<time2>\d{2}:\d{2}:\d{2})", 3)
    	Local $arResult[UBound($arData)/11][2] ; intIp, dataMap
    	For $i=0 to UBound($arData)-1 Step 11
    		Local $mData[]
    		$mData.logDate = $arData[$i]
    		$mData.logTime = $arData[$i+1]
    		$mData.action = $arData[$i+2]
    		$mData.pcname = $arData[$i+3]
    		$mData.mac = $arData[$i+4]
    		$mData.ip = $arData[$i+5]
    		$mData.time = $arData[$i+10]
    		Local $iUnsignedIntIp = BitOR(BitShift(Int($arData[$i+6]), -24), BitShift(Int($arData[$i+7]), -16), BitShift(Int($arData[$i+8]), -8), Int($arData[$i+9]))
    		$arResult[$i/11][0] = _toBinaryString($iUnsignedIntIp)
    		$arResult[$i/11][1] = $mData
    	Next
    	return $arResult
    EndFunc
    
    Func _toBinaryString($iNumber)
    	Local $sBinaryNumber = ""
    	For $i=31 to 0 Step -1
    		$sBinaryNumber&=BitAND(BitShift($iNumber, $i), 1)
    	Next
    	return $sBinaryNumber
    EndFunc
    Alles anzeigen

    Du bekommst also nach dem parsen ein Array mit 2 Werten, dem BinaryString der IP zum sortieren und eine Map mit allen Werten.

  • Ablaufdatum für kompilierte exe

    • Kanashius
    • 20. Juni 2024 um 18:32

    Da du spezifisch auf das BIOS eingehst:
    Du könntest schauen, ob sich die BIOS-Version in der Zwischenzeit geändert hat.

    Einfach in der CMD "systeminfo" eingeben und mal durchschauen, dort gibt es einen Eintrag dafür. Das kannst du dann mit AutoIt auch automaitisert auslesen.

  • Selbstständig? EDVler im Bereich Rechnungserstellung?

    • Kanashius
    • 19. Juni 2024 um 21:55

    Ich hab das Dokument mal überflogen. Es schaut nach recht einfachem XML aus. Also eigentlich nicht so das große Problem, ist halt fleißarbeit, alles zu berücksichigen/abzudecken.

    Da ich selbst schon mit dem EPUB (Ebook)-Standard gearbeitet habe, erst mit AutoIt (improvisiert) und später mit Java ordentlich, sprech ich mal aus Erfahrung: Solche Umfangreichen Projekte würde ich nicht mit AutoIt machen...
    Es ist um ein vielfaches einfacher und auch übersichtlicher, Objektorientiert zu arbeiten, wobei jedes Objekt einzelnen XML-Teilen entspricht und die dann eine Funktion haben, sich selbst in XML zu serializieren (umzuwandeln).
    Dann kann man den Standard durchgehen und muss sich nur die einzelnen XML-Elemente anschauen, was sie beinhalten und dementsprechend Felder (Variablen im Objekt) anlegen, die jeweils dem gewollten entsprechen => Attribute, einzelne andere XML-Objekte oder ganze Listen von anderen Objekten. Dabei erstellt man dann einen Baum und kann am Ende dem obersten (root) Element serializieren und erhält das fertige Dokument. Dadurch ist jedes Element quasi gekapselt und man kann den Überblick behalten und auch ggf. Änderungen einfach und schnell umsetzen.
    Ich hab das ganze auch noch so gemacht, dass alles Java-Observable Variablen sind, was dafür sorgt, dass sich alles automatisch aktualisert. Ich kann also in meiner GUI Elemente ändern und überall, wo das Element verwendet wird, steht automatisch immer der aktuellste Wert.
    Das ganze kann dann auch ohne große Schwierigkeiten wieder deserialisiert (wieder von XML in unsere Objekte umgewandelt) werden, indem es eine Methode gibt, die das macht und jedes Parent-Objekt weiß ja, was für Elemente dort enthalten sein können und ruft dann an den anderen Objekte die passende deserialisierungs Methode auf.

    Kann man das ganze auch in AutoIt mit z.B. Maps umsetzen? Ja. Würde ich es machen/empfehlen? Nein. Am vielversprechensten wäre dann der Ansatz, mit Maps zu arbeiten und für jedes Objekt eine Datei zu erstellen, die dann includiert wird,...

  • QEmu GUI - erstellen virtuelles Image

    • Kanashius
    • 8. Juni 2024 um 23:59

    Das hier sollte machen was du möchtest:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    
    Global $bInOneGui = False
    Global $mGui = _guiCreate()
    
    While True
    	If _handleGuiMessages() Then ExitLoop
    WEnd
    
    Func _guiCreate()
    	Local Const $arBtnDefs = [ _
    								["Pegasos 2", "pics/PegasosII.ico", "Pegasos_II.bat", true, Default], _
    								["AmigaOne", "pics/AmigaOne.ico", "AmigaOne.bat", true, "Example.txt"], _
    								["Sam460ex", "pics/Sam460ex.ico", "Sam460.bat", true, Default], _
    								["Other", "pics/Sam460ex.ico", "other.bat", false, Default] _
    							 ]
    	Local $mGui[], $arButtonCtrlIds[UBound($arBtnDefs)][3]
    	$mGui.btnDef = $arBtnDefs
    
    	Local $iWidth = 300, $iHeight = 130+UBound($arBtnDefs)*50
    	$mGui.hGui = GUICreate("AmigaNG Starter v0.1", $iWidth, $iHeight)
    	GuiSetIcon("pics/amigaos.ico", 0)
    	;BACKGROUND PIC
    	;GuiCtrlCreatePic("pics/boingball.jpg", -1, -1, 300, 280)
    
    	Local $sName = FileGetVersion( "qemu-system-ppc.exe", "ProductName")<>""?FileGetVersion( "qemu-system-ppc.exe", "ProductName"):"QEMU"
    	GUICtrlCreateLabel($sName, 112, 15, 71, 31)
    	Local $sVersion = FileGetVersion( "qemu-system-ppc.exe", "ProductVersion")
    	GUICtrlCreateLabel($sVersion<>""?$sVersion:"- Not installed", 149, 15, 71, 31)
    
    	; start create vm buttons
    	For $i=0 to UBound($arBtnDefs)-1 Step 1
    		Local $iTop = 50*($i+1)
    		$arButtonCtrlIds[$i][0] = GUICtrlCreateButton($arBtnDefs[$i][0], 15, $iTop, 164, 34, $BS_ICON)
    		GUICtrlSetImage($arButtonCtrlIds[$i][0], $arBtnDefs[$i][1])
    		If $arBtnDefs[$i][3] Then $arButtonCtrlIds[$i][1] = GUICtrlCreateButton ("Edit", 185, $iTop+2, 50, 30)
    		If $arBtnDefs[$i][4]<>Default Then $arButtonCtrlIds[$i][2] = GUICtrlCreateButton ("Example", 237, $iTop+2, 50, 30)
    	Next
    	$mGui.buttons = $arButtonCtrlIds
    	; end create vm buttons
    
    	;Start Create Image Buttons
    	If $bInOneGui Then
    		Local $iImageTop = $iHeight-50
    		GUICtrlCreateLabel("Create HDD Image:", 25, $iImageTop-20)
    		$mGui.inputRam = GUICtrlCreateInput('2048', 25, $iImageTop, 50, 20)
    		GUICtrlCreateLabel("MB", 80, $iImageTop+5)
    		$mGui.inputPathQemu = GUICtrlCreateInput('', 115, $iImageTop, 50, 20)
    		$mGui.buttonPath = GUICtrlCreateButton("...", 170, $iImageTop, 40, 20)
    		$mGui.buttonOk = GUICtrlCreateButton("OK",  215, $iImageTop, 40, 20)
    	Else
    		$mGui.buttonImageGui = GUICtrlCreateButton("Create Image", 10, $iHeight-55, $iWidth-20, 25)
    
    		Local $iGuiImageWidth = 400, $iGuiImageHeight = 80, $mImageGui[]
    		$mImageGui.hGui = GUICreate("Create HDD Image", $iGuiImageWidth, $iGuiImageHeight) ; create controls on the new gui now
    		Local $iTop = 10
    		$mImageGui.inputRam = GUICtrlCreateInput('2048', 10, $iTop, 50, 20)
    		GUICtrlCreateLabel("MB", 65, $iTop+5)
    		$iTop+=30
    		$mImageGui.inputPathQemu = GUICtrlCreateInput('', 10, $iTop, $iGuiImageWidth-120, 20)
    		$mImageGui.buttonPath = GUICtrlCreateButton("...", $iGuiImageWidth-100, $iTop, 40, 20)
    		$mImageGui.buttonOk = GUICtrlCreateButton("OK",  $iGuiImageWidth-50, $iTop, 40, 20)
    
    		$mGui.imageGui = $mImageGui
    		GUISwitch($mGui.hGui) ; Create controls after this line on the main gui again
    	EndIf
    	;End Create Image Buttons
    
    	;start shell output gui
    	$mGui.buttonQemuHelp = GUICtrlCreateButton("Show "&$sName&" Help", 10, $iHeight-85, $iWidth-20, 25)
    
    	Local $mShellGui[], $iShellGuiWidth = 800, $iShellGuiHeight = 600
    	$mShellGui.hGui = GUICreate("Shell output", $iShellGuiWidth, $iShellGuiHeight, -1, -1, -1, -1, $mGui.hGui)
    	$mShellGui.editOutErr = GUICtrlCreateEdit("", 10, 10, $iShellGuiWidth-20, $iShellGuiHeight-20, _
    											  BitOR($ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_MULTILINE))
    	$mGui.shellGui = $mShellGui
    	GUISwitch($mGui.hGui) ; Create controls after this line on the main gui again
    	;end shell output gui
    
    	$mGui.menuFile = GUICtrlCreateMenu("&QEmu")
    	$mGui.menuExit = GUICtrlCreateMenuItem("Exit", $mGui.menuFile)
    	$mGui.menuHelp = GUICtrlCreateMenu("?")
    	$mGui.menuInfo = GUICtrlCreateMenuItem("Info", $mGui.menuHelp)
    	GUISetState(@SW_SHOW, $mGui.hGui)
    	return $mGui
    EndFunc
    
    Func _handleGuiMessages()
    	Local $arMsg = GUIGetMsg(1)
    	; Handle input on the main gui
    	If $arMsg[1] = $mGui.hGui Then
    		Switch $arMsg[0]
    			Case $GUI_EVENT_CLOSE, $mGui.menuExit
    				return True
    			Case $mGui.menuInfo
    				MsgBox($MB_SYSTEMMODAL, "Info", "AmigaNG Starter v0.1" & @CRLF & @CRLF & "by Falke_34")
    			Case $mGui.buttonPath
    				GUICtrlSetData($mGui.imageGui.inputPathQemu, _imageSelectPath($mGui.hGui))
    			Case $mGui.buttonImageGui
    				GUISetState(@SW_SHOW, $mGui.imageGui.hGui)
    			Case $mGui.buttonOk
    				_imageCreate(Int(GUICtrlRead($mGui.inputRam)), GUICtrlRead($mGui.inputPathQemu))
    				If @error Then MsgBox(16, "Error creating image", "Error: "&@error&" Ext: "&@extended)
    			Case $mGui.buttonQemuHelp
    				GUISetState(@SW_SHOW, $mGui.shellGui.hGui)
    				Local $sCommand = "qemu-system-ppc.exe -machine help"
    				; Local $sCommand = @ComSpec & ' /c test.bat'
    				_runWait($sCommand, @ScriptDir, @SW_SHOW, "_handleGuiMessages", "_shellShowOutErr")
    				If @error=0 And @extended=1 Then return True ; Exit, when main gui was closed in callback
    				If @error Then
    					GUISetState(@SW_HIDE, $mGui.shellGui.hGui)
    					MsgBox(16, "Error running", "Error running: "&$sCommand&@crlf&"Error code: "&@error&" Ext: "&@extended)
    				EndIf
    				; Enable to remove gui, when done
    				; GUISetState(@SW_HIDE, $mGui.shellGui.hGui)
    				; GUICtrlSetData($mGui.shellGui.editOutErr, "")
    		EndSwitch
    		; Check if one of the buttons from our array was clicked and handle that
    		If $arMsg[0]<>0 Then
    			For $i=0 to UBound($mGui.buttons)-1 Step 1
    				For $j=0 to UBound($mGui.buttons, 2)-1 Step 1
    					If $arMsg[0]=$mGui.buttons[$i][$j] Then
    						Local $subIndex = ($j=0 or $j=1)?2:4
    						If $j=0 Then _run($mGui.btnDef[$i][$subIndex])
    						If $j=1 Then _edit($mGui.btnDef[$i][$subIndex])
    						If $j=2 Then _edit($mGui.btnDef[$i][$subIndex])
    						Local $iError = @error
    						Local $iExt = @extended
    						If $iError Then MsgBox(16, "Error executing code", "Error running/editing/showing """&$mGui.btnDef[$i][$subIndex]&""" Error: "&$iError&" Ext: "&$iExt)
    						return True
    					EndIf
    				Next
    			Next
    		EndIf
    	EndIf
    	; Handle input on the image gui
    	If $arMsg[1] = $mGui.imageGui.hGui Then
    		Switch $arMsg[0]
    			Case $GUI_EVENT_CLOSE
    				GUISetState(@SW_HIDE, $mGui.imageGui.hGui)
    				GUICtrlSetData($mGui.imageGui.inputPathQemu, "")
    			Case $mGui.imageGui.buttonPath
    				GUICtrlSetData($mGui.imageGui.inputPathQemu, _imageSelectPath($mGui.imageGui.hGui))
    			Case $mGui.imageGui.buttonOk
    				_imageCreate(Int(GUICtrlRead($mGui.imageGui.inputRam)), GUICtrlRead($mGui.imageGui.inputPathQemu))
    				If @error Then
    					MsgBox(16, "Error creating image", "Error: "&@error&" Ext: "&@extended)
    				Else
    					GUISetState(@SW_HIDE, $mGui.imageGui.hGui)
    					GUICtrlSetData($mGui.imageGui.inputPathQemu, "")
    				EndIf
    		EndSwitch
    	EndIf
    	If $arMsg[1] = $mGui.shellGui.hGui Then
    		Switch $arMsg[0]
    			Case $GUI_EVENT_CLOSE
    				GUISetState(@SW_HIDE, $mGui.shellGui.hGui)
    				GUICtrlSetData($mGui.shellGui.editOutErr, "")
    		EndSwitch
    	EndIf
    	return False
    EndFunc
    
    Func _shellShowOutErr($sData, $bError)
    	If $bError Then
    		GUICtrlSetData("Error: "&$mGui.shellGui.editOutErr, $sData, 1)
    	Else
    		GUICtrlSetData($mGui.shellGui.editOutErr, $sData, 1)
    	EndIf
    EndFunc
    
    Func _runWait($sCommand, $sWorkingDir=@ScriptDir, $iShowFlag=@SW_SHOW, $sCallbackHandler=Default, $sCallbackSTDOUT=Default, $bBinary=False)
    	Local $iFlag = 0
    	If $sCallbackSTDOUT<>Default Then $iFlag = BitOR($iFlag, 2, 4)
    	Local $iPID = Run($sCommand, $sWorkingDir, $iShowFlag, $iFlag)
    	If @error Then return SetError(1, @error, False)
    	While ProcessExists($iPID)
    		If $sCallbackSTDOUT<>Default Then
    			Local $sOut = StdoutRead($iPID, False, $bBinary)
    			If @error Then ExitLoop
    			If @extended>0 Then Call($sCallbackSTDOUT, $sOut, False)
    		EndIf
    		If $sCallbackSTDOUT<>Default Then
    			Local $sErr = StderrRead($iPID, False, $bBinary)
    			If @error Then ExitLoop
    			If @extended>0 Then Call($sCallbackSTDOUT, $sErr, True)
    		EndIf
    		If $sCallbackHandler<>Default Then
    			If Call($sCallbackHandler) Then return SetError(0, 1, True)
    		EndIf
    	WEnd
    	return True
    EndFunc
    
    Func _run($sFile)
    	Run($sFile)
    	If @error Then return SetError(1, @error, False)
    	return True
    EndFunc
    
    Func _edit($sFile)
    	Run("notepad.exe "&$sFile)
    	If @error Then return SetError(1, @error, False)
    	return True
    EndFunc
    
    Func _imageSelectPath($hGui = 0, $sStartFolder=@ScriptDir)
    	Local $sFolder = FileSelectFolder("Select folder", $sStartFolder, 0, "", $hGui)
    	If @error or $sFolder="" Then return SetError(1, 0, "")
    	return $sFolder
    EndFunc
    
    Func _imageCreate($iRam, $sPath)
    	If $iRam<1 Then return SetError(1, 0, False)
    	If $sPath="" Then return SetError(2, 0, False)
    	Local $sCommand = 'qemu-img.exe create -f raw "'&$sPath&'" '&$iRam&'M'
    	ConsoleWrite("Execute: "&$sCommand&@crlf)
    	Run($sCommand, @ScriptDir)
    	If @error Then Return SetError(3, @extended, False)
    	return True
    EndFunc
    Alles anzeigen
  • QEmu GUI - erstellen virtuelles Image

    • Kanashius
    • 7. Juni 2024 um 16:14

    Du kannst dafür Run nutzen, musst nur den Pfad passend mit " escapen, falls dort Leerzeichen vorkommen. Mit GuiCtrlRead kannst du den Inhalt der controls auslesen. Siehe _imageCreate in Zeile 153. Dort kannst du auch weitere Abfragen hinzufügen, die die InputFelder erfüllen müssen.
    (Sollte funktionieren, ich hab aber qemu nicht installiert => kanns nicht testen)

    Hier das ganze einmal mit den Controls in der Main Gui und einmal in einem extra Fenster (kann mit $bInOneGui oben im Script geändert werden).

    Ich hab dabei auch das ganze überarbeitet. Neue Buttons/VMs können in der $arBtnDefs in Zeile 11 hinzugefügt werden und funktionieren dann automatisch (mit Gui-Größen-Anpassung,... ). Dabei werden Arrays genutzt um die Infos zu speichern und später auch die Control-Ids zu speichern.
    Ich hab dabei Maps verwendet um die GuiInfos zu speichern, weil ich das lieber mag => Man hat nicht so viele globale variablen, find ich übersichtlicher.

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <MsgBoxConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    
    Global $bInOneGui = False
    
    _main()
    
    Func _guiCreate()
    	Local Const $arBtnDefs = [ _
    								["Pegasos 2", "pics/PegasosII.ico", "Pegasos_II.bat", true, Default], _
    								["AmigaOne", "pics/AmigaOne.ico", "AmigaOne.bat", true, "Example.txt"], _
    								["Sam460ex", "pics/Sam460ex.ico", "Sam460.bat", true, Default], _
    								["Other", "pics/Sam460ex.ico", "other.bat", false, Default] _
    							 ]
    	Local $mGui[], $arButtonCtrlIds[UBound($arBtnDefs)][3]
    	$mGui.btnDef = $arBtnDefs
    
    	Local $iWidth = 300, $iHeight = 130+UBound($arBtnDefs)*50
    	$mGui.hGui = GUICreate("AmigaNG Starter v0.1", $iWidth, $iHeight)
    	GuiSetIcon("pics/amigaos.ico", 0)
    	;BACKGROUND PIC
    	;GuiCtrlCreatePic("pics/boingball.jpg", -1, -1, 300, 280)
    
    	Local $sName = FileGetVersion( "qemu-system-ppc.exe", "ProductName")
    	GUICtrlCreateLabel($sName<>""?$sName:"QEMU", 112, 15, 71, 31)
    	Local $sVersion = FileGetVersion( "qemu-system-ppc.exe", "ProductVersion")
    	GUICtrlCreateLabel($sVersion<>""?$sVersion:"- Not installed", 149, 15, 71, 31)
    
    	; start create vm buttons
    	For $i=0 to UBound($arBtnDefs)-1 Step 1
    		Local $iTop = 50*($i+1)
    		$arButtonCtrlIds[$i][0] = GUICtrlCreateButton($arBtnDefs[$i][0], 15, $iTop, 164, 34, $BS_ICON)
    		GUICtrlSetImage($arButtonCtrlIds[$i][0], $arBtnDefs[$i][1])
    		If $arBtnDefs[$i][3] Then $arButtonCtrlIds[$i][1] = GUICtrlCreateButton ("Edit", 185, $iTop+2, 50, 30)
    		If $arBtnDefs[$i][4]<>Default Then $arButtonCtrlIds[$i][2] = GUICtrlCreateButton ("Example", 237, $iTop+2, 50, 30)
    	Next
    	$mGui.buttons = $arButtonCtrlIds
    	; end create vm buttons
    
    	;Start Create Image Buttons
    	If $bInOneGui Then
    		Local $iImageTop = $iHeight-50
    		GUICtrlCreateLabel("Create HDD Image:", 25, $iImageTop-20)
    		$mGui.inputRam = GUICtrlCreateInput('2048', 25, $iImageTop, 50, 20)
    		GUICtrlCreateLabel("MB", 80, $iImageTop+5)
    		$mGui.inputPathQemu = GUICtrlCreateInput('', 115, $iImageTop, 50, 20)
    		$mGui.buttonPath = GUICtrlCreateButton("...", 170, $iImageTop, 40, 20)
    		$mGui.buttonOk = GUICtrlCreateButton("OK",  215, $iImageTop, 40, 20)
    	Else
    		$mGui.buttonImageGui = GUICtrlCreateButton("Create Image", 10, $iHeight-55, $iWidth-20, 25)
    
    		Local $iGuiImageWidth = 400, $iGuiImageHeight = 80, $mImageGui[]
    		$mImageGui.hGui = GUICreate("Create HDD Image", $iGuiImageWidth, $iGuiImageHeight) ; create controls on the new gui now
    		Local $iTop = 10
    		$mImageGui.inputRam = GUICtrlCreateInput('2048', 10, $iTop, 50, 20)
    		GUICtrlCreateLabel("MB", 65, $iTop+5)
    		$iTop+=30
    		$mImageGui.inputPathQemu = GUICtrlCreateInput('', 10, $iTop, $iGuiImageWidth-120, 20)
    		$mImageGui.buttonPath = GUICtrlCreateButton("...", $iGuiImageWidth-100, $iTop, 40, 20)
    		$mImageGui.buttonOk = GUICtrlCreateButton("OK",  $iGuiImageWidth-50, $iTop, 40, 20)
    
    		$mGui.imageGui = $mImageGui
    		GUISwitch($mGui.hGui) ; Create controls after this line on the main gui again
    	EndIf
    	;End Create Image Buttons
    
    	$mGui.menuFile = GUICtrlCreateMenu("&QEmu")
    	$mGui.menuExit = GUICtrlCreateMenuItem("Exit", $mGui.menuFile)
    	$mGui.menuHelp = GUICtrlCreateMenu("?")
    	$mGui.menuInfo = GUICtrlCreateMenuItem("Info", $mGui.menuHelp)
    	GUISetState(@SW_SHOW, $mGui.hGui)
    	return $mGui
    EndFunc
    
    Func _main()
    	Local $mGui = _guiCreate()
    	Local $iMsg = 0
    	While 1
    		$arMsg = GUIGetMsg(1)
    		; Handle input on the main gui
    		If $arMsg[1] = $mGui.hGui Then
    			Switch $arMsg[0]
    				Case $GUI_EVENT_CLOSE, $mGui.menuExit
    					ExitLoop
    				Case $mGui.menuInfo
    					MsgBox($MB_SYSTEMMODAL, "Info", "AmigaNG Starter v0.1" & @CRLF & @CRLF & "by Falke_34")
    				Case $mGui.buttonPath
    					GUICtrlSetData($mGui.imageGui.inputPathQemu, _imageSelectPath($mGui.hGui))
    				Case $mGui.buttonImageGui
    					GUISetState(@SW_SHOW, $mGui.imageGui.hGui)
    				Case $mGui.buttonOk
    					_imageCreate(Int(GUICtrlRead($mGui.inputRam)), GUICtrlRead($mGui.inputPathQemu))
    					If @error Then MsgBox(16, "Error creating image", "Error: "&@error&" Ext: "&@extended)
    			EndSwitch
    			; Check if one of the buttons from our array was clicked and handle that
    			If $arMsg[0]<>0 Then
    				For $i=0 to UBound($mGui.buttons)-1 Step 1
    					For $j=0 to UBound($mGui.buttons, 2)-1 Step 1
    						If $arMsg[0]=$mGui.buttons[$i][$j] Then
    							Local $subIndex = ($j=0 or $j=1)?2:4
    							If $j=0 Then _run($mGui.btnDef[$i][$subIndex])
    							If $j=1 Then _edit($mGui.btnDef[$i][$subIndex])
    							If $j=2 Then _edit($mGui.btnDef[$i][$subIndex])
    							Local $iError = @error
    							Local $iExt = @extended
    							If $iError Then MsgBox(16, "Error executing code", "Error running/editing/showing """&$mGui.btnDef[$i][$subIndex]&""" Error: "&$iError&" Ext: "&$iExt)
    							ExitLoop
    						EndIf
    					Next
    				Next
    			EndIf
    		EndIf
    		; Handle input on the image gui
    		If $arMsg[1] = $mGui.imageGui.hGui Then
    			Switch $arMsg[0]
    				Case $GUI_EVENT_CLOSE
    					GUISetState(@SW_HIDE, $mGui.imageGui.hGui)
    					GUICtrlSetData($mGui.imageGui.inputPathQemu, "")
    				Case $mGui.imageGui.buttonPath
    					GUICtrlSetData($mGui.imageGui.inputPathQemu, _imageSelectPath($mGui.imageGui.hGui))
    				Case $mGui.imageGui.buttonOk
    					_imageCreate(Int(GUICtrlRead($mGui.imageGui.inputRam)), GUICtrlRead($mGui.imageGui.inputPathQemu))
    					If @error Then
    						MsgBox(16, "Error creating image", "Error: "&@error&" Ext: "&@extended)
    					Else
    						GUISetState(@SW_HIDE, $mGui.imageGui.hGui)
    						GUICtrlSetData($mGui.imageGui.inputPathQemu, "")
    					EndIf
    			EndSwitch
    		EndIf
    	WEnd
    EndFunc
    
    Func _run($sFile)
    	Run($sFile)
    	If @error Then return SetError(1, @error, False)
    	return True
    EndFunc
    
    Func _edit($sFile)
    	Run("notepad.exe "&$sFile)
    	If @error Then return SetError(1, @error, False)
    	return True
    EndFunc
    
    Func _imageSelectPath($hGui = 0, $sStartFolder=@ScriptDir)
    	Local $sFolder = FileSelectFolder("Select folder", $sStartFolder, 0, "", $hGui)
    	If @error or $sFolder="" Then return SetError(1, 0, "")
    	return $sFolder
    EndFunc
    
    Func _imageCreate($iRam, $sPath)
    	If $iRam<1 Then return SetError(1, 0, False)
    	If $sPath="" Then return SetError(2, 0, False)
    	Local $sCommand = 'qemu-img.exe create -f raw "'&$sPath&'" '&$iRam&'MB'
    	ConsoleWrite("Execute: "&$sCommand&@crlf)
    	Run($sCommand, @ScriptDir)
    	If @error Then Return SetError(3, @extended, False)
    	return True
    EndFunc
    Alles anzeigen

    Ich hoffe das hilft dir weiter und gibt dir noch mehr Ideen :)
    MfG Kanashius.

  • Guielemente im Array

    • Kanashius
    • 29. Mai 2024 um 01:55

    Hi :)

    Ich hatte mir das ganze auch mal angesehen, und ich muss sagen, dass ich das mit den vielen Werten im Array nicht so schön fand, weils unübersichtlich ist. Insbesondere, weil je nach control die Reihenfolge wechselt (icon/label),... . Ein weiterer Faktor für mich war dabei, dass du dann auch zusatzfunktionen zum ändern des controls genutzt hast (z.B. GuiCtrlSetFont beim Label).

    Also hab ich mir mal alle möglichen GuiCtrlCreate... Funktionen und deren Parameter angeschaut, sowie alle möglichen GuiCtrlSet... funktionen.

    Das hier war mein Ergebnis:

    Code
    GUICtrlCreateGraphic      (                      left, top [, width [, height [, style]]] )
    GUICtrlCreateProgress     (                      left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateSlider       (                      left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateTab          (                      left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateTreeView     (                      left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateButton       ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateCheckbox     ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateCombo        ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateDate         ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateEdit         ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateGroup        ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateInput        ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateLabel        ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateList         ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateListView     ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateMonthCal     ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateObj          ( ObjectVar,           left, top [, width [, height]] )
    GUICtrlCreatePic          ( filename,            left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateRadio        ( "text",              left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateAvi          ( filename, subfileid, left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    GUICtrlCreateIcon         ( filename, iconName,  left, top [, width [, height [, style = -1 [, exStyle = -1]]]] )
    
    ; special stuff
    GUICtrlCreateDummy        ( )
    GUICtrlCreateTabItem      ( "text" )
    GUICtrlCreateTreeViewItem ( "text", treeviewID )
    GUICtrlCreateListViewItem ( "text", listviewID )
    GUICtrlCreateContextMenu  ( [controlID] )
    GUICtrlCreateMenu         ( "submenutext" [, menuID = -1 [, menuentry = -1]] )
    GUICtrlCreateMenuItem     ( "text", menuID [, menuentry = -1 [, menuradioitem = 0]] )
    GUICtrlCreateUpdown       ( inputcontrolID [, style = -1] )
    
    _CTRL_callback
    _CTRL_color
    _CTRL_cursor
    _CTRL_font
    _CTRL_image
    _CTRL_limit
    _CTRL_onEvent
    _CTRL_resizing
    _CTRL_size
    _CTRL_state
    _CTRL_style
    _CTRL_tip
    Alles anzeigen

    Ich hab so eigentlich alle Controls dabei (vllt. noch für das "special stuff" was ändern).

    Dabei ist die Funktion _CTRL_def(ByRef $mCtrlMap, $iType, $iLeft, $iTop, $opt1 = Default, $opt2 = Default, $opt3 = Default... entstanden. Man erstellt eine Map für alle Controls und fügt mit dieser Funktion die Controls hinzu.
    Alle controls brauchen den Typ ($iCTRL_...) und die Position ($iLeft/$iTop). Danach kommen die "opt" parameter. Je nach funktion sind die unterschiedlich: Controls haben 0 bis 2 parameter vor der position, die sind bei mir hier gelandet und werden als $opt1 und $opt2 angegeben.
    Sie können aber auch weggelassen werden. Danach kommen nurnoch die _CTRL_... Funktionen in beliebiger Reihenfolge.

    Beispiel mit allen Möglichkeiten:

    AutoIt
    Global $iWidth = 800, $iHeight = 600
    Global $mCtrls[]
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 10, "Add column", _CTRL_onEvent("_buttonPressed"), _CTRL_style($BS_BOTTOM), _CTRL_tip("Some cool Tip"))
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 40, "Button 2", _CTRL_color(0xFFFFFF, 0x000000), _CTRL_cursor(0))
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 70, "Button 3", _CTRL_size(100, 50), _CTRL_font(10, 700, BitOr(2,8)), _CTRL_image("shell32.dll", 22))
    _CTRL_def($mCtrls,    $iCTRL_INPUT, 10, 130, "", _CTRL_size(Default, 25), _CTRL_limit(5, 1), _CTRL_resizing(BitOR(2, 32)))
    _CTRL_def($mCtrls, $iCTRL_CHECKBOX, 10, 160, "Uncheck me", _CTRL_state($GUI_CHECKED))
    $ctrlListview = _CTRL_def($mCtrls, $iCTRL_LISTVIEW, 0.02, 0.79, "TextColumn", _CTRL_size(0.96, 0.2), _CTRL_callback("_fillListview"))
    
    
    GUICreate("Example", $iWidth, $iHeight)
    _CTRL_gen($mCtrls, $iWidth, $iHeight)
    GUISetState(@SW_SHOW)
    
    ; ...
    
    Func _fillListview($iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 1", $iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 2", $iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 3", $iCtrlId)
    EndFunc
    Alles anzeigen

    Dabei hab ich auch die Möglichkeit eingebaut, die Position in Prozent anzugeben. Wenn die Position oder Size <=1 ist, wird das als Prozent der Breite/Höhe angenommen und entsprechend verarbeitet.
    Deshalb hat die Methode _CTRL_gen(ByRef $mMap, $iWidth = Default, $iHeight = Default) zum generieren der Controls auch einen Width und Height Parameter, der dann angegeben werden muss.

    Umd später noch bei speziellen Controls zu wissen, welches ein Event hatte, wird der Map key des Controls zurückgegeben.
    Beispiel: Local $iCtrlButtonSave = _CTRL_def($mCtrlsA,   $iCTRL_BUTTON,  10, 340, "Save List", _CTRL_size(100, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("Liste speichern"))
    Später kann dann mit Local Local $key = _CTRL_getKey($mCtrlsA, $iCtrlId) von der Autoit-CtrlID auf den Key gemapped werden um dann mit If $key = $iCtrlButtonSave Then eigene Aktionen auszuführen.
    Mit $mCtrlsA[$iCtrlButtonSave].iCtrl kann auch von dem Key auf die AutoIt-CtrlID umgewandelt werden.

    Hier einmal dein Code damit umgesetzt, sowie ein weiteres Beispiel:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <GuiListView.au3>
    
    Global $iCTRL_AVI = 1, $iCTRL_BUTTON = 2, $iCTRL_CHECKBOX = 3, $iCTRL_COMBO = 4, $iCTRL_DATE = 5, $iCTRL_EDIT = 6, $iCTRL_GRAPHIC = 7, $iCTRL_GROUP = 8, $iCTRL_ICON = 9, $iCTRL_INPUT = 10
    Global $iCTRL_INPUT = 11, $iCTRL_LABEL = 12, $iCTRL_LIST = 13, $iCTRL_LISTVIEW = 14, $iCTRL_MONTHCAL = 15, $iCTRL_OBJ = 16, $iCTRL_PIC = 17, $iCTRL_PROGRESS = 18, $iCTRL_RADIO = 19
    Global $iCTRL_SLIDER = 20, $iCTRL_TAB = 21, $iCTRL_TREEVIEW = 22
    
    ; => Example A
    
    Global $mCtrlsA[]
    Local $iCtrlButtonSave = _CTRL_def($mCtrlsA,   $iCTRL_BUTTON,  10, 340, "Save List", _CTRL_size(100, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("Liste speichern"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 210,  30, "Host1", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 210,  70, "Host2", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 210, 110, "Workgroup", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 280,  30, "Fritz", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 280,  70, "IT-Service", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 280, 110, "Lesesaal", _CTRL_size(70, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("nd"))
    _CTRL_def($mCtrlsA,   $iCTRL_BUTTON, 190, 340, "Save and choose file", _CTRL_size(160, 30), _CTRL_onEvent("_buttonPressedA"), _CTRL_tip("sdsds"))
    _CTRL_def($mCtrlsA, $iCTRL_CHECKBOX,  10, 390, "AdminUser", _CTRL_size(90, 20), _CTRL_state($GUI_CHECKED))
    _CTRL_def($mCtrlsA,    $iCTRL_LABEL, 210,  10, "Freie Listen", _CTRL_size(100, 20), _CTRL_font(9, 800, 2))
    _CTRL_def($mCtrlsA,     $iCTRL_ICON, 320, 390, "shell32.dll", 168, _CTRL_size(50, 50), _CTRL_tip("Öffnet die Settings"))
    
    Local $hParent = GUICreate("Button Example", 500, 500)
    ;Opt("GUIOnEventMode", 1)
    ;GUISetOnEvent($GUI_EVENT_CLOSE, "_end", $hParent)
    _CTRL_gen($mCtrlsA)
    GUISetState(@SW_SHOW, $hParent)
    
    Local $bRun = True
    ; Hauptschleife
    While $bRun
    	Local $iMsg = GUIGetMsg()
        Switch $iMsg ; Ereignis abrufen
            Case $GUI_EVENT_CLOSE
                _end()
        EndSwitch
    	If $iMsg<>0 Then
    		For $mCtrl in $mCtrlsA
    			If $mCtrl.iCtrl<>0 And $iMsg = $mCtrl.iCtrl And MapExists($mCtrl, "onEvent") Then Call($mCtrl.onEvent.sFunc, $mCtrl.iCtrl)
    		Next
    	EndIf
    WEnd
    
    Func _buttonPressedA($iCtrl = -1)
    	Local $iCtrlId = (IsDeclared("iCtrl")?$iCtrl:@GUI_CtrlId)
    	Local $key = _CTRL_getKey($mCtrlsA, $iCtrlId)
    	If $key = $iCtrlButtonSave Then
    		MsgBox($MB_OK, "Button Clicked", "Button clicked to save something")
    	Else
    		MsgBox($MB_OK, "Button Clicked", GUICtrlRead($iCtrlId))
    	EndIf
    EndFunc
    
    Func _end()
    	$bRun = False
    EndFunc
    
    
    ; => Example
    
    Global $iWidth = 800, $iHeight = 600
    Global $mCtrls[]
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 10, "Add column", _CTRL_onEvent("_buttonPressed"), _CTRL_style($BS_BOTTOM), _CTRL_tip("Some cool Tip"))
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 40, "Button 2", _CTRL_color(0xFFFFFF, 0x000000), _CTRL_cursor(0))
    _CTRL_def($mCtrls,   $iCTRL_BUTTON, 10, 70, "Button 3", _CTRL_size(100, 50), _CTRL_font(10, 700, BitOr(2,8)), _CTRL_image("shell32.dll", 22))
    _CTRL_def($mCtrls,    $iCTRL_INPUT, 10, 130, "", _CTRL_size(Default, 25), _CTRL_limit(5, 1), _CTRL_resizing(BitOR(2, 32)))
    _CTRL_def($mCtrls, $iCTRL_CHECKBOX, 10, 160, "Uncheck me", _CTRL_state($GUI_CHECKED))
    $ctrlListview = _CTRL_def($mCtrls, $iCTRL_LISTVIEW, 0.02, 0.79, "TextColumn", _CTRL_size(0.96, 0.2), _CTRL_callback("_fillListview"))
    
    
    GUICreate("Example", $iWidth, $iHeight)
    _CTRL_gen($mCtrls, $iWidth, $iHeight)
    GUISetState(@SW_SHOW)
    
    ConsoleWrite("------------RESULT------------"&@crlf)
    ConsoleWrite(_toString($mCtrls)&@crlf)
    ConsoleWrite("----------END RESULT----------"&@crlf)
    
    
    While True
    	Local $iMsg = GUIGetMsg()
    	If $iMsg = -3 Then Exit
    	If $iMsg<>0 Then
    		For $mCtrl in $mCtrls
    			If $mCtrl.iCtrl<>0 And $iMsg = $mCtrl.iCtrl And MapExists($mCtrl, "onEvent") Then Call($mCtrl.onEvent.sFunc)
    		Next
    	EndIf
    WEnd
    
    Func _buttonPressed()
    	ConsoleWrite("Button pressed"&@crlf)
    	_GUICtrlListView_AddColumn($mCtrls[$ctrlListview].iCtrl, "Added column")
    EndFunc
    
    Func _fillListview($iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 1", $iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 2", $iCtrlId)
    	GUICtrlCreateListViewItem("TestItem 3", $iCtrlId)
    EndFunc
    
    Func _CTRL_getKey(ByRef $mMap, $iCtrlId)
    	For $key in MapKeys($mMap)
    		If $mMap[$key].iCtrl = $iCtrlId Then return $key
    	Next
    	return -1
    EndFunc
    
    Func _CTRL_gen(ByRef $mMap, $iWidth = Default, $iHeight = Default)
    	For $key In MapKeys($mMap)
    		Local $mCtrl = $mMap[$key]
    		$mCtrl.iLeftCur = (($iWidth<>Default And $mCtrl.iLeft<=1)?$iWidth*$mCtrl.iLeft:$mCtrl.iLeft)
    		$mCtrl.iWidthCur = (($mCtrl.iWidth<>Default)?(($iWidth<>Default And $mCtrl.iWidth<=1)?$iWidth*$mCtrl.iWidth:$mCtrl.iWidth):(Default))
    		$mCtrl.iTopCur = (($iHeight<>Default And $mCtrl.iTop<=1)?$iHeight*$mCtrl.iTop:$mCtrl.iTop)
    		$mCtrl.iHeightCur = (($mCtrl.iHeight<>Default)?(($iHeight<>Default And $mCtrl.iHeight<=1)?$iHeight*$mCtrl.iHeight:$mCtrl.iHeight):(Default))
    		Switch $mCtrl.iType
    			Case $iCTRL_AVI
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_AVI needs the $opt1 parameter (filename)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					If $mCtrl.param2=Default Then $mCtrl.param2=0
    					$mCtrl.iCtrl = GUICtrlCreateAvi($mCtrl.param1, $mCtrl.param2, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateAvi ($iLeft/$iTop/$opt1 (filename)/$opt2 (subfileid)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_BUTTON
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_BUTTON needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateButton($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateButton ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_CHECKBOX
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_CHECKBOX needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateCheckbox($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateCheckbox ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_COMBO
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_COMBO needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateCombo($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateCombo ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_DATE
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_DATE needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateDate($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateDate ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_EDIT
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_EDIT needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateEdit($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateEdit ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_GRAPHIC
    				$mCtrl.iCtrl = GUICtrlCreateGraphic($mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle)
    				_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateGraphic ($iLeft/$iTop/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			Case $iCTRL_GROUP
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_GROUP needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateGroup($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateGroup ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_ICON
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_ICON needs the $opt1 parameter (filename)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					If $mCtrl.param2=Default Then $mCtrl.param2=-1
    					$mCtrl.iCtrl = GUICtrlCreateIcon($mCtrl.param1, $mCtrl.param2, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateIcon ($iLeft/$iTop/$opt1 (filename)/$opt2 (iconName)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_INPUT
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_INPUT needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateInput($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateInput ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_LABEL
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_LABEL needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateLabel($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateLabel ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_LIST
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_LIST needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateList($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateList ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_LISTVIEW
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_LISTVIEW needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateListView($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateListView ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_MONTHCAL
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_MONTHCAL needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateMonthCal($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateMonthCal ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_OBJ
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_OBJ needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateObj($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateObj ($iLeft/$iTop/$opt1 (ObjectVar)/_CTRL_size)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_PIC
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_PIC needs the $opt1 parameter (filename)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreatePic($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreatePic ($iLeft/$iTop/$opt1 (filename)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_PROGRESS
    				$mCtrl.iCtrl = GUICtrlCreateProgress($mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    				_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateProgress ($iLeft/$iTop/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			Case $iCTRL_RADIO
    				If $mCtrl.param1=Default Then
    					_errCheck("_CTRL_def with $iType $iCTRL_RADIO needs the $opt1 parameter (text)", False, -1, 1, 0, "_exit", $mCtrl.iLineNumber)
    				Else
    					$mCtrl.iCtrl = GUICtrlCreateRadio($mCtrl.param1, $mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    					_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateRadio ($iLeft/$iTop/$opt1 (text)/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				EndIf
    			Case $iCTRL_SLIDER
    				$mCtrl.iCtrl = GUICtrlCreateSlider($mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    				_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateSlider ($iLeft/$iTop/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			Case $iCTRL_TAB
    				$mCtrl.iCtrl = GUICtrlCreateTab($mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    				_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateTab ($iLeft/$iTop/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			Case $iCTRL_TREEVIEW
    				$mCtrl.iCtrl = GUICtrlCreateTreeView($mCtrl.iLeftCur, $mCtrl.iTopCur, $mCtrl.iWidthCur, $mCtrl.iHeightCur, $mCtrl.iStyle, $mCtrl.iStyleEx)
    				_errCheck("Data provided by _CTRL_def caused an error calling GUICtrlCreateTreeView ($iLeft/$iTop/_CTRL_size/_CTRL_style)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    		EndSwitch
    		If Not @error Then
    			If MapExists($mCtrl, "callback") Then Call($mCtrl.callback.sFunc, $mCtrl.iCtrl)
    			_errCheck("Data provided by _CTRL_callback for _CTRL_def caused an error calling Call. Check if the provided function exists and has exactly one parameter ($iCtrlId)", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "color") Then
    				If $mCtrl.color.iTextColor<>Default Then GUICtrlSetColor($mCtrl.iCtrl, $mCtrl.color.iTextColor)
    				_errCheck("Data provided by _CTRL_color for _CTRL_def caused an error calling GUICtrlSetColor", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    				If $mCtrl.color.iBGColor<>Default Then GUICtrlSetBkColor($mCtrl.iCtrl, $mCtrl.color.iBGColor)
    				_errCheck("Data provided by _CTRL_color for _CTRL_def caused an error calling GUICtrlSetBkColor", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			EndIf
    			If MapExists($mCtrl, "cursor") Then GUICtrlSetCursor($mCtrl.iCtrl, $mCtrl.cursor.iCursor)
    			_errCheck("Data provided by _CTRL_cursor for _CTRL_def caused an error calling GuiCtrlSetCursor", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "font") Then GUICtrlSetFont($mCtrl.iCtrl, $mCtrl.font.fSize, $mCtrl.font.iWeight, $mCtrl.font.iAttribute, $mCtrl.font.sFontName, $mCtrl.font.iQuality)
    			_errCheck("Data provided by _CTRL_font for _CTRL_def caused an error calling GUICtrlSetFont", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "image") Then GUICtrlSetImage($mCtrl.iCtrl, $mCtrl.image.sFilename, $mCtrl.image.sIconName, $mCtrl.image.iIconType)
    			_errCheck("Data provided by _CTRL_image for _CTRL_def caused an error calling GUICtrlSetImage", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "limit") Then GUICtrlSetLimit($mCtrl.iCtrl, $mCtrl.limit.iMax, $mCtrl.limit.iMin)
    			_errCheck("Data provided by _CTRL_limit for _CTRL_def caused an error calling GUICtrlSetLimit", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "onEvent") Then GUICtrlSetOnEvent($mCtrl.iCtrl, $mCtrl.onEvent.sFunc)
    			_errCheck("Data provided by _CTRL_onEvent for _CTRL_def caused an error calling GUICtrlSetOnEvent", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "resizing") Then GUICtrlSetResizing($mCtrl.iCtrl, $mCtrl.resizing.iResizing)
    			_errCheck("Data provided by _CTRL_resizing for _CTRL_def caused an error calling GUICtrlSetResizing", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "state") Then GUICtrlSetState($mCtrl.iCtrl, $mCtrl.state.iState)
    			_errCheck("Data provided by _CTRL_state for _CTRL_def caused an error calling GUICtrlSetState", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    			If MapExists($mCtrl, "tip") Then GUICtrlSetTip($mCtrl.iCtrl, $mCtrl.tip.sText, $mCtrl.tip.sTitle, $mCtrl.tip.iIcon, $mCtrl.tip.iOptions)
    			_errCheck("Data provided by _CTRL_tip for _CTRL_def caused an error calling GUICtrlSetTip", False, -1, @error, @extended, "_exit", $mCtrl.iLineNumber)
    		EndIf
    		$mMap[$key] = $mCtrl
    	Next
    EndFunc
    
    Func _CTRL_def(ByRef $mCtrlMap, $iType, $iLeft, $iTop, $opt1 = Default, $opt2 = Default, $opt3 = Default, $opt4 = Default, $opt5 = Default, $opt6 = Default, $opt7 = Default, $opt8 = Default, _
                   $opt9 = Default, $opt10 = Default, $opt11 = Default, $opt12 = Default, $opt13 = Default, $opt14 = Default, $iLineNumber = @ScriptLineNumber)
    	If Not IsMap($mCtrlMap) Then return SetError(1, 0, -1)
    	If Not IsInt($iType) And $iType>=$iCTRL_AVI And $iType<=$iCTRL_TREEVIEW Then return SetError(2, 0, -1)
    	Local $mEntry[]
    	$mEntry.iCtrl = 0
    	$mEntry.iType = $iType
    	$mEntry.iLeft = $iLeft
    	$mEntry.iTop = $iTop
    	$mEntry.param1 = Default
    	$mEntry.param2 = Default
    	$mEntry.iWidth = Default
    	$mEntry.iHeight = Default
    	$mEntry.iStyle = -1
    	$mEntry.iStyleEx = -1
    	$mEntry.iLineNumber = $iLineNumber
    	Local $iStart = 1
    	If $opt1<>Default And Not IsMap($opt1) Then
    		$iStart = 2
    		$mEntry.param1 = $opt1
    	EndIf
    	If $opt2<>Default And Not IsMap($opt2) Then
    		$iStart = 3
    		$mEntry.param2 = $opt2
    	EndIf
    	For $i=$iStart to @NumParams-4 Step 1
    		Local $param = Eval("opt"&$i)
    		If IsMap($param) Then
    			If $param["type"]="size" Then
    				$mEntry.iWidth = $param["iWidth"]
    				$mEntry.iHeight = $param["iHeight"]
    			ElseIf $param["type"]="style" Then
    				$mEntry.iStyle = $param["iStyle"]
    				$mEntry.iStyleEx = $param["iStyleEx"]
    			Else
    				Local $mExtra[]
    				For $key In MapKeys($param)
    					If $key<>"type" Then
    						$mExtra[$key] = $param[$key]
    					EndIf
    				Next
    				$mEntry[$param["type"]] = $mExtra
    			EndIf
    		ElseIf $param<>Default Then
    			ConsoleWrite("Error ("&$iLineNumber&"): The optional parameter 'opt"&$i&"' is not a Map/Default!"&@crlf)
    		EndIf
    	Next
    	return MapAppend($mCtrlMap, $mEntry)
    EndFunc
    
    Func _CTRL_callback($sFunc)
    	Local $mMap[]
    	$mMap.type = "callback"
    	$mMap.sFunc = $sFunc
    	return $mMap
    EndFunc
    
    Func _CTRL_color($iTextColor = Default, $iBackgroundColor = Default)
    	Local $mMap[]
    	$mMap.type = "color"
    	$mMap.iTextColor = $iTextColor
    	$mMap.iBGColor = $iBackgroundColor
    	return $mMap
    EndFunc
    
    Func _CTRL_cursor($iCursorID)
    	Local $mMap[]
    	$mMap.type = "cursor"
    	$mMap.iCursor = $iCursorID
    	return $mMap
    EndFunc
    
    Func _CTRL_font($fSize = 8.5, $iWeight = 0, $iAttribute = 0, $sFontName = "", $iQuality = 0)
    	Local $mMap[]
    	$mMap.type = "font"
    	$mMap.fSize = $fSize
    	$mMap.iWeight = $iWeight
    	$mMap.iAttribute = $iAttribute
    	$mMap.sFontName = $sFontName
    	$mMap.iQuality = $iQuality
    	return $mMap
    EndFunc
    
    Func _CTRL_image($sFilename, $sIconName = -1, $iIconType = 1)
    	Local $mMap[]
    	$mMap.type = "image"
    	$mMap.sFilename = $sFilename
    	$mMap.sIconName = $sIconName
    	$mMap.iIconType = $iIconType
    	return $mMap
    EndFunc
    
    Func _CTRL_limit($iMax, $iMin = 0)
    	Local $mMap[]
    	$mMap.type = "limit"
    	$mMap.iMax = $iMax
    	$mMap.iMin = $iMin
    	return $mMap
    EndFunc
    
    Func _CTRL_onEvent($sFunc)
    	Local $mMap[]
    	$mMap.type = "onEvent"
    	$mMap.sFunc = $sFunc
    	return $mMap
    EndFunc
    
    Func _CTRL_resizing($iResizing)
    	Local $mMap[]
    	$mMap.type = "resizing"
    	$mMap.iResizing = $iResizing
    	return $mMap
    EndFunc
    
    Func _CTRL_size($iWidth = Default, $iHeight = Default)
    	Local $mMap[]
    	$mMap.type = "size"
    	$mMap.iWidth = $iWidth
    	$mMap.iHeight = $iHeight
    	return $mMap
    EndFunc
    
    Func _CTRL_state($iState)
    	Local $mMap[]
    	$mMap.type = "state"
    	$mMap.iState = $iState
    	return $mMap
    EndFunc
    
    Func _CTRL_style($iStyle = -1, $iStyleEx = -1)
    	Local $mMap[]
    	$mMap.type = "style"
    	$mMap.iStyle = $iStyle
    	$mMap.iStyleEx = $iStyleEx
    	return $mMap
    EndFunc
    
    Func _CTRL_tip($sText, $sTitle = Default, $iIcon = 0, $iOptions = 0)
    	Local $mMap[]
    	$mMap.type = "tip"
    	$mMap.sText = $sText
    	$mMap.sTitle = $sTitle
    	$mMap.iIcon = $iIcon
    	$mMap.iOptions = $iOptions
    	return $mMap
    EndFunc
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _toString
    ; Description ...: Returns the content of a variable as String
    ; Syntax ........: _toString($data, $bInformative = True, $sPrefixSep = @TAB, $sSpaceOuter = @crlf, $sSpaceInner = @crlf, $iDepth = 0)
    ; Parameters ....: $data                  - The variable to be converted.
    ;                  $bInformative          - The level of detail. When True, the type of all variables is returned and not only the content
    ;                  $sPrefixSep            - The prefix value used for indentation
    ;                  $sSpaceOuter           - The space between levels of dimensions (Array) or at the beginning of a Map/DllStruct
    ;                  $sSpaceInner           - The space between items of an Array/Map/DllStruct
    ;                  $iDepth                - INTERNAL: The depth level of the call. Used in recursive calls to indent items
    ; Return values .: String
    ; Author ........: Kanashius
    ; ==================================================================================================
    Func _toString(ByRef $data, $bInformative = True, $sPrefixSep = @TAB, $sSpaceOuter = @crlf, $sSpaceInner = @crlf, $iDepth = 0)
    	Local $sPrefix = ""
    	For $i=0 to $iDepth-1
    		$sPrefix &= $sPrefixSep
    	Next
    	If IsArray($data) Then
    		Local $bPrefix = False
    		If StringInStr($sSpaceOuter, @crlf) or StringInStr($sSpaceInner, @crlf) Then
    			$bPrefix = True
    		Else
    			$sPrefixSep = ""
    		EndIf
    		Local $iDimensions = UBound($data, 0)
    		Local $sDim = ""
    		For $i = 1 to $iDimensions Step 1
    			$sDim &= "["&UBound($data, $i)&"]"
    		Next
    		Local $sOut = $sPrefix & ($bInformative ? "Array"&$sDim&" [" : "[") & $sSpaceOuter
    		For $i=0 To UBound($data, 1)-1 Step 1
    			If $iDimensions<2 Then
    				$sOut &= _toString($data[$i], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & (($i<>UBound($data, 1)-1)?"," & $sSpaceInner:$sSpaceOuter)
    			Else
    				$sOut &= ($bPrefix?$sPrefix & $sPrefixSep:"") & "[" & $sSpaceOuter
    				For $j=0 To UBound($data, 2)-1 Step 1
    					If $iDimensions<3 Then
    						$sOut &= _toString($data[$i][$j], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2) & (($j<>UBound($data, 2)-1)?"," & $sSpaceInner:$sSpaceOuter)
    					Else
    						$sOut &= ($bPrefix?$sPrefix & $sPrefixSep & $sPrefixSep:"") & "[" & $sSpaceOuter
    						For $k=0 To UBound($data, 3)-1 Step 1
    							$sOut &= _toString($data[$i][$j][$k], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+3) & (($k<>UBound($data, 3)-1)?"," & $sSpaceInner:$sSpaceOuter)
    						Next
    						$sOut &= ($bPrefix?$sPrefix & $sPrefixSep & $sPrefixSep:"") & "]" & (($j<>UBound($data, 2)-1)?"," & $sSpaceInner:"") & $sSpaceOuter
    					EndIf
    				Next
    				$sOut &= ($bPrefix?$sPrefix & $sPrefixSep:"") & "]" & (($i<>UBound($data, 1)-1)?"," & $sSpaceInner:$sSpaceOuter)
    			EndIf
    		Next
    		$sOut &= ($bPrefix?$sPrefix:"") & "]"
    		return $sOut
    	ElseIf IsBinary($data) Then
    		return $sPrefix & ($bInformative ? 'binary "'&String($data)&'"' : String($data))
    	ElseIf IsBool($data) Then
    		return $sPrefix & ($bInformative ? 'bool "'&StringLower(String($data))&'"' : StringLower(String($data)))
    	ElseIf IsDllStruct($data) Then
    		Local $bPrefix = StringInStr($sSpaceInner, @crlf)
    		Local $sOut = $sPrefix & ($bInformative ? "DllStruct[b"&DllStructGetSize($data)&"]{" : "{") & $sSpaceOuter
    		Local $iCount = 1
    		While True
    			Local $oTmp = DllStructGetData($data, $iCount)
    			If @error Then ExitLoop
    			$sOut &= _toString($oTmp, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1)
    			$iCount += 1
    			$sOut &=  "," & $sSpaceInner
    		WEnd
    		$sOut &= ($bPrefix?$sPrefix:"") & "}"
    		return $sOut
    	ElseIf IsFunc($data) Then
    		return $sPrefix & ($bInformative ? 'function "'&FuncName($data)&'"' : FuncName($data))
    	ElseIf IsFloat($data) Then
    		return $sPrefix &  ($bInformative ? 'float "'&String($data)&'"' : String($data))
    	ElseIf IsHWnd($data) Then
    		return $sPrefix & ($bInformative ? 'hwnd "'&String($data)&'"' : String($data))
    	ElseIf IsInt($data) Then
    		return $sPrefix &  ($bInformative ? 'int "'&String($data)&'"' : String($data))
    	ElseIf IsKeyword($data) Then
    		If $data=Default Then
    			return $sPrefix & ($bInformative ? 'keyword "Default"' : "default")
    		ElseIf $data=Null Then
    			return $sPrefix & ($bInformative ? 'keyword "Null"' : "null")
    		EndIf
    	ElseIf IsMap($data) Then
    		Local $sOut = $sPrefix & ($bInformative ? "Map["&UBound($data)&"] {" : "{") & $sSpaceOuter
    		For $key in MapKeys($data)
    			$sOut &= _toString($key, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & ": " & $sSpaceOuter & _toString($data[$key], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2)
    			$sOut &=  "," & $sSpaceInner
    		Next
    		$sOut &= $sPrefix & "}"
    		return $sOut
    	ElseIf IsNumber($data) Then
    		return $sPrefix &  ($bInformative ? 'number "'&String($data)&'"' : String($data))
    	ElseIf IsObj($data) Then
    		If ObjName($data, 1) = "Dictionary" Then
    			_hasErrorOccurred(False)
    			Local $oErrHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    			Local $iCount = $data.count, $arKeys = $data.keys(), $test = $data.item("")
    			If Not _hasErrorOccurred() Then
    				Local $sOut =  $sPrefix & ($bInformative ? 'Object "'&ObjName($data, 1)&""" Description: """&ObjName($data, 2)&'" ' : ObjName($data, 1)) & "["&$iCount&"]" & "{" &$sSpaceOuter
    				For $key in $arKeys
    					Local $item = $data.item($key)
    					$sOut &= _toString($key, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & ": " & $sSpaceOuter & _toString($item, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2)
    					$sOut &=  "," & $sSpaceInner
    				Next
    				$sOut &= $sPrefix & "}"
    				return $sOut
    			EndIf
    		EndIf
    		return $sPrefix & ($bInformative ? 'Object "'&ObjName($data, 1)&""" Description: """&ObjName($data, 2)&'"' : ObjName($data, 1))
    	ElseIf IsPtr($data) Then
    		return $sPrefix & ($bInformative ? 'pointer "'&String($data)&'"' : String($data))
    	ElseIf IsString($data) Then
    		return $sPrefix & ($bInformative ? 'string "'&$data&'"' : '"'&$data&'"')
    	Else
    		return $sPrefix & ($bInformative ? 'unsupported ('&VarGetType($data)&') "'&String($data)&'"' : String($data))
    	EndIf
    EndFunc
    
    Func _ErrFunc($oError)
    	_hasErrorOccurred(True)
    EndFunc
    
    Func _hasErrorOccurred($bError = Default)
    	Local static $bCurrentError = False
    	If $bError<>Default Then
    		$bCurrentError = $bError
    	EndIf
    	return $bCurrentError
    EndFunc
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _errCheck
    ; Description ...: Checks if the @error is set (function call before this returned an error) and writes the error to the console.
    ; Syntax ........: _errCheck($sMsg = Default, $bFatal = False, $return = -1, $iError = @error, $iExtended = @extended, $sExitCallback = "_exit", $iLine = @ScriptLineNumber)
    ; Parameters ....: $sMsg                  - The message to show in case of an error
    ;                  $bFatal                - If True, the $sExitCallback will be called to exit the application gracefully
    ;                  $return                - The value to be returned by this function
    ;                  $iError                - The @error code
    ;                  $iExtended             - The @extended code
    ;                  $sExitCallback         - The function to call on exit
    ;                  $iLine                 - The ScriptLineNumber, where the error occurred
    ; Return values .: The value specified as $return and it will throw the same @error and @extended codes, the function was called with.
    ; Author ........: Kanashius
    ; ==================================================================================================
    Func _errCheck($sMsg = Default, $bFatal = False, $return = -1, $iError = @error, $iExtended = @extended, $sExitCallback = "_exit", $iLine = @ScriptLineNumber)
    	$sMsg = $sMsg<>Default ? " >> "&$sMsg:""
    	Local $sExtended = $iExtended<>0 ? ":"&$iExtended:""
    	If $iError<>0 Then ConsoleWrite("Error (line "&$iLine&"): "&$iError&$sExtended&$sMsg&@crlf)
    	If $bFatal Then
    		Call($sExitCallback)
    		If @error Then _errCheck("Error using the ""Call"" function, while handling another error: "&@crlf&@Tab&"Error (line "&$iLine&"): "&$iError&$sExtended&$sMsg&@crlf& _
    								 "Check if the function """&$sExitCallback&""" (used for $bFatal errors) exists and has no parameters!"&@crlf)
    	EndIf
    	Return SetError(@error, @extended, $return)
    EndFunc
    Alles anzeigen

    Mit dem Code kann auch beliebig zwischen OnEvent und GuiGetMsg Modus umgeschaltet werden.


    Ich hoffe, das hilft dir weiter und gibt dir noch einen anderen (besseren) Ansatz.

    MfG, Kanashius.

  • Darstellung

    • Kanashius
    • 23. Mai 2024 um 14:19

    Ich würde mehrere Möglichkeiten sehen:

    • Es fehlen Dateien, die benötigt werden Css/Bilder/Videos/Javascript/... => Speicher die Webseite mal vom Browser, dabei sollte ein Ordner angelegt werden, der alle nötigen Dateien beinhaltet (Menü=>Speichern unter)
    • JavaScript wird nicht ausgeführt, wird aber von der Webseite benötigt
    • Die Webseite nutzt neuere HTML/CSS features, die vom Internet Explorer (IE) nicht unterstützt werden => Der Support für Internet Explorer 11 endete am 15. Juni 2022 und der IE ist in neueren Windows versionen deaktiviert und wird vmtl. nicht mehr allzu lange vorhanden sein. Du solltest vmtl. also eh auf den WebDriver (https://github.com/Danp2/au3WebDriver) umstellen.
  • _ConsoleWriteMap

    • Kanashius
    • 21. Mai 2024 um 18:36

    Ich muss zugeben, du hast mich dazu inspiriert, eine _toString Methode umzusetzen (die auch Maps ausgeben kann).

    Das Errorhandling hatte ich schon vor länger da liegen und hab es mit dazu gepackt :)

    Thema

    _toString für alle (AutoIt-) Objekte (und mehr) sowie eine Methode zum Errorhandling

    Ausgabe einer Variable als String, rekursiv für Arrays/Maps/DllStructs/... mit der _toString Methode.
    Es gibt zwei Modi, einmal wird nur der Inhalt der Variablen ausgegeben, im anderen auch Details wie der Typ. Die Einrückung/Formatierung kann ebenfalls mit Parametern angepasst werden.

    Leichteres behandeln von Errorcodes mit der _errCheck Methode, sodass nur noch diese Funktion aufgerufen werden muss und der Fehler automatisch in die Konsole geschrieben wird, ohne ständiges If @error,... .

    …
    Kanashius
    21. Mai 2024 um 18:33
  • _toString für alle (AutoIt-) Objekte (und mehr) sowie eine Methode zum Errorhandling

    • Kanashius
    • 21. Mai 2024 um 18:33

    Ausgabe einer Variable als String, rekursiv für Arrays/Maps/DllStructs/... mit der _toString Methode.
    Es gibt zwei Modi, einmal wird nur der Inhalt der Variablen ausgegeben, im anderen auch Details wie der Typ. Die Einrückung/Formatierung kann ebenfalls mit Parametern angepasst werden.

    Leichteres behandeln von Errorcodes mit der _errCheck Methode, sodass nur noch diese Funktion aufgerufen werden muss und der Fehler automatisch in die Konsole geschrieben wird, ohne ständiges If @error,... .

    AutoIt
    #include-once
    
    ; ==> Beispiel
    
    ConsoleWrite("----------------- String Output -----------------"&@crlf)
    Local $mData[]
    Local $ar1D = [1, 2, 3, 4]
    $mData.arr1D = $ar1D
    Local $ar2D = [[1, 2], [3, 4]]
    $mData.arr2D = $ar2D
    Local $ar3D = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
    $mData.arr3D = $ar3D
    $mData.binary = Binary(0xFF2312302343221)
    $mData.bool = True
    Local $tStruct = DllStructCreate("struct;int var1;byte var2;uint var3;char var4[128];endstruct")
    DllStructSetData($tStruct, "var1", -1)
    DllStructSetData($tStruct, 2, 255)
    DllStructSetData($tStruct, "var3", -1)
    DllStructSetData($tStruct, "var4", "Hello")
    $mData.dllStruct = $tStruct
    $mData.func = _toString
    $mData.float = 0.341234
    $mData.hwnd = WinGetHandle("[ACTIVE]")
    $mData.int = 3213
    $mData.objDictionary = ObjCreate('Scripting.Dictionary')
    $mData.objDictionary.add("1", "eins")
    $mData.objDictionary.add(2, "zwei")
    $mData.object = ObjCreate("MediaPlayer.MediaPlayer.1")
    $mData.pointer = DllStructGetPtr($tStruct)
    $mData.string = "Something"
    ConsoleWrite(_toString($mData, True)&@crlf)
    
    
    ConsoleWrite("----------------- Error Handling -----------------"&@crlf)
    StringRegExp("error", "\d+", 2)
    _errCheck()
    
    StringRegExp("error", "\d+", 2)
    _errCheck("Error using StringRegExp")
    
    ConsoleWrite(_errorFunc()&@crlf)
    
    StringRegExp("Fatal Error", "\d+", 2)
    _errCheck("Fatal RegExp Error", True)
    
    ConsoleWrite("Well, we will not be getting here :("&@crlf)
    
    Func _errorFunc()
    	If True Then return _errCheck("Error to be forwarded", False, 10, 1, 5)
    EndFunc
    
    Func _exit()
    	ConsoleWrite("Exit"&@crlf)
        Exit
    EndFunc
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _toString
    ; Description ...: Returns the content of a variable as String
    ; Syntax ........: _toString($data, $bInformative = True, $sPrefixSep = @TAB, $sSpaceOuter = @crlf, $sSpaceInner = @crlf, $iDepth = 0)
    ; Parameters ....: $data                  - The variable to be converted.
    ;                  $bInformative          - The level of detail. When True, the type of all variables is returned and not only the content
    ;                  $sPrefixSep            - The prefix value used for indentation
    ;                  $sSpaceOuter           - The space between levels of dimensions (Array) or at the beginning of a Map/DllStruct
    ;                  $sSpaceInner           - The space between items of an Array/Map/DllStruct
    ;                  $iDepth                - INTERNAL: The depth level of the call. Used in recursive calls to indent items
    ; Return values .: String
    ; Author ........: Kanashius
    ; ==================================================================================================
    Func _toString(ByRef $data, $bInformative = True, $sPrefixSep = @TAB, $sSpaceOuter = @crlf, $sSpaceInner = @crlf, $iDepth = 0)
    	Local $sPrefix = ""
    	For $i=0 to $iDepth-1
    		$sPrefix &= $sPrefixSep
    	Next
    	If IsArray($data) Then
    		Local $bPrefix = False
    		If StringInStr($sSpaceOuter, @crlf) or StringInStr($sSpaceInner, @crlf) Then
    			$bPrefix = True
    		Else
    			$sPrefixSep = ""
    		EndIf
    		Local $iDimensions = UBound($data, 0)
    		Local $sDim = ""
    		For $i = 1 to $iDimensions Step 1
    			$sDim &= "["&UBound($data, $i)&"]"
    		Next
    		Local $sOut = $sPrefix & ($bInformative ? "Array"&$sDim&" [" : "[") & $sSpaceOuter
    		For $i=0 To UBound($data, 1)-1 Step 1
    			If $iDimensions<2 Then
    				$sOut &= _toString($data[$i], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & (($i<>UBound($data, 1)-1)?"," & $sSpaceInner:$sSpaceOuter)
    			Else
    				$sOut &= ($bPrefix?$sPrefix & $sPrefixSep:"") & "[" & $sSpaceOuter
    				For $j=0 To UBound($data, 2)-1 Step 1
    					If $iDimensions<3 Then
    						$sOut &= _toString($data[$i][$j], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2) & (($j<>UBound($data, 2)-1)?"," & $sSpaceInner:$sSpaceOuter)
    					Else
    						$sOut &= ($bPrefix?$sPrefix & $sPrefixSep & $sPrefixSep:"") & "[" & $sSpaceOuter
    						For $k=0 To UBound($data, 3)-1 Step 1
    							$sOut &= _toString($data[$i][$j][$k], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+3) & (($k<>UBound($data, 3)-1)?"," & $sSpaceInner:$sSpaceOuter)
    						Next
    						$sOut &= ($bPrefix?$sPrefix & $sPrefixSep & $sPrefixSep:"") & "]" & (($j<>UBound($data, 2)-1)?"," & $sSpaceInner:"") & $sSpaceOuter
    					EndIf
    				Next
    				$sOut &= ($bPrefix?$sPrefix & $sPrefixSep:"") & "]" & (($i<>UBound($data, 1)-1)?"," & $sSpaceInner:$sSpaceOuter)
    			EndIf
    		Next
    		$sOut &= ($bPrefix?$sPrefix:"") & "]"
    		return $sOut
    	ElseIf IsBinary($data) Then
    		return $sPrefix & ($bInformative ? 'binary "'&String($data)&'"' : String($data))
    	ElseIf IsBool($data) Then
    		return $sPrefix & ($bInformative ? 'bool "'&StringLower(String($data))&'"' : StringLower(String($data)))
    	ElseIf IsDllStruct($data) Then
    		Local $bPrefix = StringInStr($sSpaceInner, @crlf)
    		Local $sOut = $sPrefix & ($bInformative ? "DllStruct[b"&DllStructGetSize($data)&"]{" : "{") & $sSpaceOuter
    		Local $iCount = 1
    		While True
    			Local $oTmp = DllStructGetData($data, $iCount)
    			If @error Then ExitLoop
    			$sOut &= _toString($oTmp, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1)
    			$iCount += 1
    			$sOut &=  "," & $sSpaceInner
    		WEnd
    		$sOut &= ($bPrefix?$sPrefix:"") & "}"
    		return $sOut
    	ElseIf IsFunc($data) Then
    		return $sPrefix & ($bInformative ? 'function "'&FuncName($data)&'"' : FuncName($data))
    	ElseIf IsFloat($data) Then
    		return $sPrefix &  ($bInformative ? 'float "'&String($data)&'"' : String($data))
    	ElseIf IsHWnd($data) Then
    		return $sPrefix & ($bInformative ? 'hwnd "'&String($data)&'"' : String($data))
    	ElseIf IsInt($data) Then
    		return $sPrefix &  ($bInformative ? 'int "'&String($data)&'"' : String($data))
    	ElseIf IsKeyword($data) Then
    		If $data=Default Then
    			return $sPrefix & ($bInformative ? 'keyword "Default"' : "default")
    		ElseIf $data=Null Then
    			return $sPrefix & ($bInformative ? 'keyword "Null"' : "null")
    		EndIf
    	ElseIf IsMap($data) Then
    		Local $sOut = $sPrefix & ($bInformative ? "Map["&UBound($data)&"] {" : "{") & $sSpaceOuter
    		For $key in MapKeys($data)
    			$sOut &= _toString($key, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & ": " & $sSpaceOuter & _toString($data[$key], $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2)
    			$sOut &=  "," & $sSpaceInner
    		Next
    		$sOut &= $sPrefix & "}"
    		return $sOut
    	ElseIf IsNumber($data) Then
    		return $sPrefix &  ($bInformative ? 'number "'&String($data)&'"' : String($data))
    	ElseIf IsObj($data) Then
    		If ObjName($data, 1) = "Dictionary" Then
    			_hasErrorOccurred(False)
    			Local $oErrHandler = ObjEvent("AutoIt.Error", "_ErrFunc")
    			Local $iCount = $data.count, $arKeys = $data.keys(), $test = $data.item("")
    			If Not _hasErrorOccurred() Then
    				Local $sOut =  $sPrefix & ($bInformative ? 'Object "'&ObjName($data, 1)&""" Description: """&ObjName($data, 2)&'" ' : ObjName($data, 1)) & "["&$iCount&"]" & "{" &$sSpaceOuter
    				For $key in $arKeys
    					Local $item = $data.item($key)
    					$sOut &= _toString($key, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+1) & ": " & $sSpaceOuter & _toString($item, $bInformative, $sPrefixSep, $sSpaceOuter, $sSpaceInner, $iDepth+2)
    					$sOut &=  "," & $sSpaceInner
    				Next
    				$sOut &= $sPrefix & "}"
    				return $sOut
    			EndIf
    		EndIf
    		return $sPrefix & ($bInformative ? 'Object "'&ObjName($data, 1)&""" Description: """&ObjName($data, 2)&'"' : ObjName($data, 1))
    	ElseIf IsPtr($data) Then
    		return $sPrefix & ($bInformative ? 'pointer "'&String($data)&'"' : String($data))
    	ElseIf IsString($data) Then
    		return $sPrefix & ($bInformative ? 'string "'&$data&'"' : '"'&$data&'"')
    	Else
    		return $sPrefix & ($bInformative ? 'unsupported ('&VarGetType($data)&') "'&String($data)&'"' : String($data))
    	EndIf
    EndFunc
    
    Func _ErrFunc($oError)
    	_hasErrorOccurred(True)
    EndFunc
    
    Func _hasErrorOccurred($bError = Default)
    	Local static $bCurrentError = False
    	If $bError<>Default Then
    		$bCurrentError = $bError
    	EndIf
    	return $bCurrentError
    EndFunc
    
    ; #FUNCTION# =======================================================================================
    ; Name ..........: _errCheck
    ; Description ...: Checks if the @error is set (function call before this returned an error) and writes the error to the console.
    ; Syntax ........: _errCheck($sMsg = Default, $bFatal = False, $return = -1, $iError = @error, $iExtended = @extended, $sExitCallback = "_exit", $iLine = @ScriptLineNumber)
    ; Parameters ....: $sMsg                  - The message to show in case of an error
    ;                  $bFatal                - If True, the $sExitCallback will be called to exit the application gracefully
    ;                  $return                - The value to be returned by this function
    ;                  $iError                - The @error code
    ;                  $iExtended             - The @extended code
    ;                  $sExitCallback         - The function to call on exit
    ;                  $iLine                 - The ScriptLineNumber, where the error occurred
    ; Return values .: The value specified as $return and it will throw the same @error and @extended codes, the function was called with.
    ; Author ........: Kanashius
    ; ==================================================================================================
    Func _errCheck($sMsg = Default, $bFatal = False, $return = -1, $iError = @error, $iExtended = @extended, $sExitCallback = "_exit", $iLine = @ScriptLineNumber)
    	$sMsg = $sMsg<>Default ? " >> "&$sMsg:""
    	Local $sExtended = $iExtended<>0 ? ":"&$iExtended:""
    	If $iError<>0 Then ConsoleWrite("Error (line "&$iLine&"): "&$iError&$sExtended&$sMsg&@crlf)
    	If $bFatal Then
    		Call($sExitCallback)
    		If @error Then _errCheck("Error using the ""Call"" function, while handling another error: "&@crlf&@Tab&"Error (line "&$iLine&"): "&$iError&$sExtended&$sMsg&@crlf& _
    								 "Check if the function """&$sExitCallback&""" (used for $bFatal errors) exists and has no parameters!"&@crlf)
    	EndIf
    	Return SetError(@error, @extended, $return)
    EndFunc
    Alles anzeigen

    Ich hoffe, ihr könnt das (gerade zum Debuggen) gut gebrauchen :)

    Output:

    Code
    ----------------- String Output -----------------
    Map[14] {
    	string "arr1D": 
    		Array[4] [
    			int "1",
    			int "2",
    			int "3",
    			int "4"
    		],
    	string "arr2D": 
    		Array[2][2] [
    			[
    				int "1",
    				int "2"
    			],
    			[
    				int "3",
    				int "4"
    			]
    		],
    	string "arr3D": 
    		Array[2][2][2] [
    			[
    				[
    					int "1",
    					int "2"
    				],
    
    				[
    					int "3",
    					int "4"
    				]
    			],
    			[
    				[
    					int "5",
    					int "6"
    				],
    
    				[
    					int "7",
    					int "8"
    				]
    			]
    		],
    	string "binary": 
    		binary "0x213234022331F20F",
    	string "bool": 
    		bool "true",
    	string "dllStruct": 
    		DllStruct[b140]{
    			int "-1",
    			int "255",
    			int "4294967295",
    			string "Hello",
    		},
    	string "func": 
    		function "_TOSTRING",
    	string "float": 
    		float "0.341234",
    	string "hwnd": 
    		hwnd "0x00562EC4",
    	string "int": 
    		int "3213",
    	string "objDictionary": 
    		Object "Dictionary" Description: "Scripting.Dictionary" [2]{
    			string "1": 
    				string "eins",
    			int "2": 
    				string "zwei",
    		},
    	string "object": 
    		Object "MediaPlayer" Description: "Windows Media Player",
    	string "pointer": 
    		pointer "0x015FDDA0",
    	string "string": 
    		string "Something",
    }
    ----------------- Error Handling -----------------
    Error (line 34): 1
    Error (line 37): 1 >> Error using StringRegExp
    Error (line 47): 1:5 >> Error to be forwarded
    10
    Error (line 42): 1 >> Fatal RegExp Error
    Exit
    Alles anzeigen

    Dateien

    ToString Example.au3 1,35 kB – 210 Downloads ToString.au3 9,49 kB – 200 Downloads
  • Frage zu seltsamen Verhalten von _WinAPI_CopyFileEx

    • Kanashius
    • 16. Mai 2024 um 13:18

    Ich vermute stark, dass es an dem Sleep(10) in der _ProgressProc liegt.

    Alle Hooks/Procs/... sollten so schnell wie möglich beendet werden. 10ms mag für dich kurz sein, ist aber für den PC eine Ewigkeit.

    Wenn dann ein Sleep in so einen Callback eingebaut wird, ist der ganze Prozess am schlafen, was alles andere aufhält => auch die Bearbeitung von Events des Fensters,...

    Deshalb auch das "Not Responding".

    TLDR: Keine Sleeps in Callbacks vom System und nicht zu viel (rechenintensiven) Code in diese Funktionen packen.

  • FFplay AutoitKonsole auslesen

    • Kanashius
    • 13. Mai 2024 um 19:12

    Hi :)
    Das Hauptproblem ist, dass ff* nicht auf StdOut schreibt, sondern aus irgendeinem Grund auf StdErr.

    Ich hatte gerade lust zu programmieren, deshalb hab ich das ganze mal Umgesetzt:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    
    Local $sVideoPath = "test.mp4"
    
    ; START EXAMPLE WITH CONSOLE
    Local $sLength = _getVideoLength($sVideoPath)
    If @error Then ConsoleWrite("Error getting video length: "&@error& ">>" &@extended&@crlf)
    ConsoleWrite($sLength&@crlf)
    
    Local $iLength = _getVideoLength($sVideoPath, True)
    If @error Then ConsoleWrite("Error getting video length: "&@error& ">>" &@extended&@crlf)
    ConsoleWrite($iLength&@crlf)
    
    _playVideo($sVideoPath, "_videoTimePlayed")
    If @error Then ConsoleWrite("Error playing video: "&@error& ">>" &@extended&@crlf)
    
    ; START EXAMPLE WITH GUI
    Local $iWidth = 800, $iHeight = 600, $iSpace = 5, $iCtrlHeight = 25
    Local $hGui = GUICreate("Test", $iWidth, $iHeight)
    Local $idButton = GUICtrlCreateButton("Play", $iSpace, $iSpace, 40, $iCtrlHeight)
    Local $idLabelTime = GUICtrlCreateLabel("0",  $iSpace*2+40, $iSpace+5, $iWidth - ($iSpace*3+40), $iCtrlHeight)
    Local $idProgress = GUICtrlCreateProgress($iSpace, $iSpace*2+$iCtrlHeight, $iWidth-2*$iSpace, $iCtrlHeight)
    GUISetState(@SW_SHOW, $hGui)
    
    While True
    	_guiLoop()
    WEnd
    
    Func _guiLoop($iPid = 0)
    	Local static $iOldPid = 0, $hPlayWindow
    	If $iOldPid<>$iPid or ($hPlayWindow=0 And $iPid<>0) Then
    		$iOldPid = $iPid
    		If $iPid<>0 Then ; video starts playing in window
    			$hPlayWindow = _processGetFirstWindow($iPid)
    		Else ; video stops playing
    			$hPlayWindow = 0
    			GUICtrlSetState($idButton, $GUI_ENABLE)
    			_videoTimePlayedGui(0, 0)
    		EndIf
    	EndIf
    	Switch GUIGetMsg()
    		Case -3
    			If $iPid<>0 Then WinClose($hPlayWindow)
    			Exit
    		Case $idButton
    			GUICtrlSetState($idButton, $GUI_DISABLE)
    			_play()
    	EndSwitch
    EndFunc
    
    Func _play()
    	_playVideo($sVideoPath, "_videoTimePlayedGui", "_guiLoop")
    	If @error Then ConsoleWrite("Error playing video: "&@error& ">>" &@extended&@crlf)
    EndFunc
    
    Func _videoTimePlayedGui($iSeconds, $iLength)
    	GUICtrlSetData($idLabelTime, $iSeconds)
    	GUICtrlSetData($idProgress, Int(100*($iSeconds/$iLength)))
    EndFunc
    
    Func _videoTimePlayed($iSeconds, $iLength)
    	ConsoleWrite("Seconds: "&$iSeconds&@TAB&"Percent of video: "&($iSeconds/$iLength)&@crlf)
    EndFunc
    
    #cs
    Errors:
    	1: Error calling ffprobe => Check if ffprobe.exe is in the correct folder
    	2: Timeout calling ffprobe (>60 seconds)
    	3: Error parsing duration
    #ce
    Func _getVideoLength($sPath, $bAsSeconds = False)
    	Local $iPid = Run(@ComSpec & ' /c ffprobe.exe "' & $sPath & '"', @ScriptDir, @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))
    	If @error Then return SetError(1, @error, -1)
    	ProcessWait($iPid, 60)
    	If @error Then return SetError(2, @error, -1)
    	Local $sOut = StdoutRead($iPid) & @CRLF & StderrRead($iPid)
    	Local $arTime = StringRegExp($sOut, ".*Duration:\s*(\d+):(\d{2}):(\d{2})\.(\d{2}).*", 1)  ; maybe use part of a second here ($arTime[3])
    	If @error Then return SetError(3, @error, -1)
    	If UBound($arTime)<>3 Then SetError(3, 0, 0)
    	If Not $bAsSeconds Then return $arTime[0]&":"&$arTime[1]&":"&$arTime[2]
    	return Int($arTime[0])*60*60 + Int($arTime[1])*60 + $arTime[2]
    EndFunc
    
    ; Error 1: Could not read length (@extended contains the error from _getVideoLength)
    ; Error 2: Could not play (ffplay.exe failed)
    Func _playVideo($sPath, $sCallbackTime = Default, $sCallbackLoop = Default)
    	Local $iLength = 0
    	If $sCallbackTime<>Default Then
    		$iLength = _getVideoLength($sPath, True)
    		If @error Then return SetError(1, @error, False)
    	EndIf
    	Local $iPid = Run(@ComSpec & ' /c ffplay.exe "' & $sPath & '"', @ScriptDir, @SW_HIDE, BitOR($STDERR_CHILD, $STDOUT_CHILD))
    	If @error Then return SetError(2, @error, -1)
    	Local $iSeconds = 0
    	While ProcessExists($iPid)
    		Local $sOut = StdoutRead($iPid) & StderrRead($iPid)
    		If $sCallbackTime<>Default And Not @error And $sOut<>"" Then
    			Local $arTime = StringRegExp($sOut, ".*?(\d+)\.(\d{2}) A-V:.*", 1) ; maybe use part of a second here ($arTime[1])
    			If Not @error And UBound($arTime)=2 And $iSeconds<>Int($arTime[0]) Then
    				$iSeconds = Int($arTime[0])
    				Call($sCallbackTime, $iSeconds, $iLength)
    				If @error Then ConsoleWrite("The function "&$sCallbackTime&" needs the two parameters ($iSecondsPlayed, $iSecondsVideoLength)")
    			EndIf
    		EndIf
    		If $sCallbackLoop<>Default Then
    			Call($sCallbackLoop, $iPid)
    			If @error Then ConsoleWrite("The function "&$sCallbackLoop&" needs one parameter ($iProcessId)")
    		EndIf
    	WEnd
    	return True
    EndFunc
    
    Func _processGetFirstWindow($iPid)
    	Local $arWin = WinList()
    	For $i=1 to UBound($arWin)-1 step 1
    		If WinGetProcess($arWin[$i][1]) = $iPid Then return $arWin[$i][1]
    	Next
    	return 0
    EndFunc
    Alles anzeigen

    Ich hab dabei mehrere Funktionen erstellt. Einmal zum Abrufen der Länge und einmal zum Abspielen, wobei beim Abspielen Callbacks genutzt werden.
    Die übergebenen Funktionen werden aufgerufen und müssen die passende Anzahl an Parametern haben. Dadurch kann die aktuelle Laufzeit abgearbeitet werden und es gibt auch ein Callback in der PlayLoop, die für die Gui genutzt werden kann, damit die Gui weiterhin funktioniert, wenn die Schleife vom abspielen läuft.

    Ich hab überall Local verwendet, falls das ganze mal in Funktionen ausgelagert werden soll... dann muss man nicht alles ändern und es macht eh keinen Unterschied.

    Bei ffprobe.exe hat es übrigens auch nur funktioniert, weil du hier: Local $cmd = 'ffprobe.exe ' & '"' & $sinput & '"' & ' 2>&1 | findstr Duration' ; ermittelt die Filmlänge des Filmes mit dem 2>&1 den StdErr auf StdOut umgeleitet hast.

    Ich hoffe das ist es, was du dir vorgestellt hast.
    MfG, Kanashius

  • Drag & Drop auf versteckten Button

    • Kanashius
    • 1. Mai 2024 um 12:31

    Hi :)

    Die _WinAPI_ChildWindowFromPointEx hat ein paar flags, um unsichtbare Fenster zu ignorieren:

    AutoIt
    ; https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-childwindowfrompointex
    ; 0 = All, 1 = SkipInvisible, 2 = SkipDisabled, 4 = SkipTransparent
    $hCtrl = _WinAPI_ChildWindowFromPointEx($hWnd, $tPoint, BitOR(1, 2, 4))

    Danach wird der unsichtbare Button nicht mehr gefunden, und je nach flags auch wenn er nur disabled ist.


    Achja, fast vergessen:
    Bei der suche nach dem Fehler hab ich auch nen Weg gefunden, wie man selbst schauen kann, welche controls an der Position sind:

    AutoIt
    Local $arChilds, $tWindowInfo
    $arChilds = _WinAPI_EnumChildWindows($hWnd)
    For $i=1 to UBound($arChilds)-1 step 1
    	$tWindowInfo = _WinAPI_GetWindowInfo($arChilds[$i][0])
    	ConsoleWrite($arChilds[$i][0]&" >> "&$arChilds[$i][1]&@crlf)
    	;ConsoleWrite('Left:   ' & DllStructGetData($tWINDOWINFO, 'rWindow', 1) & @CRLF)
    	;ConsoleWrite('Top:    ' & DllStructGetData($tWINDOWINFO, 'rWindow', 2) & @CRLF)
    	;ConsoleWrite('Right:  ' & DllStructGetData($tWINDOWINFO, 'rWindow', 3) & @CRLF)
    	;ConsoleWrite('Bottom: ' & DllStructGetData($tWINDOWINFO, 'rWindow', 4) & @CRLF)
    Next
  • Datei von Netzlaufwerk kopieren mit Progressbar

    • Kanashius
    • 18. April 2024 um 14:48

    Kommt darauf an, wie genau dein Code aussieht.

    Aber das Grundproblem liegt darin, dass AutoIt Single-Threaded ist. Es kann also immer nur ein Code gleichzeitig ausgeführt werden.
    Man kann mit bestimmten (Interrupt-) Methoden (wie Adlibregister, dein _ProgressProc,...) Code "nebenbei" ausführen, aber das sorgt auch nur dafür, dass der Hauptcode angehalten wird, die Funktion durchläuft und dann der Hauptcode weiter ausgeführt wird.
    Sleep-Befehle in solchen "Interrupt" Methoden sind also sehr schlecht, weil dadurch die Hauptschleife angehalten wird und ähnlich sollte man aufpassen, dass man den Hauptcode nicht zu lange blockiert.
    Wenn du deinen Code postest, können wir dir da bei der Optimierung helfen.

    In anderen Programmiersprachen kann man asynchron programmieren (was der Art von AutoIt am ähnlichesten ist), wobei auf einem Kern abwechselnd verschiedener Code ausgeführt wird.
    Dann gibt es multithreading, was meist genutzt wird, um Dinge parallel auszuführen und auch mehrere unterschiedliche CPU-Kerne zu nutzen, aber gleichzeitig den Arbeitsspeicher zu teilen.
    Zum Schluss gibt es noch multiprocessing, wo man mehrere Programme nebeneinander laufen lässt, die miteinander kommunizieren (Networking (TCP)/Files/...). Das könntest du hier auch gut verwenden, wenn das "asynchrone" in AutoIt nicht so gut klappt. Dann würdest du deine Anwendung mit Parametern nochmal aufrufen, die dann den Download durchführen und mit deinem Tool (Mit TCPAccept/TCPSend/TCPReceive/...) die Prozentzahl kommunizieren, abbrechen, pausieren,... . Da du dafür aber einen kleinen Server/Client programmieren müsstest, wäre das aufwendiger.

  • Frage zur Verwendung von Methoden (Objekt-Syntax / Dot-Notation / Pseudocode)

    • Kanashius
    • 8. April 2024 um 22:53
    AutoIt
    ConsoleWrite("---------------START---------------"&@crlf)
    Local $mData[]
    $mData["test"] = _test
    
    ConsoleWrite($mData.test&@crlf)
    
    $mData["test"]($mData)
    $mData["test"]($mData)
    
    $mData.test()
    
    ConsoleWrite("----------------END----------------"&@crlf)
    
    Func _test(ByRef $self)
    	ConsoleWrite("Test 1"&@crlf)
    	$self["test"] = _test2
    EndFunc
    
    Func _test2(ByRef $self)
    	ConsoleWrite("Test 2"&@crlf)
    EndFunc
    Alles anzeigen

    Ergebnis:

    Code
    ---------------START---------------
    Test 1
    Test 2
    "...\tmp.au3" (10) : ==> The requested action with this object has failed.:
    $mData.test()
    $mData^ ERROR

    Es geht also schon, Funktionen in Maps zu speichern... Man muss nur den ersten Parameter selbst mitgeben.
    Außerdem besteht leider das gleiche Problem, wie beim ersten Zuweisen des Wertes...
    Man muss mit den eckigen Klammern und dem String arbeiten, statt die Schreibweise mit dem Punkt zu verwenden, was das ganze etwas doof macht :/
    Naja, dafür kann man die Funktion später noch beliebig austauschen ^^

    Ansonsten kann man auch mit DllStructs arbeiten, dass hab ich aber auch nur einmal gemacht, weil das erstellen und zugreifen etwas nervig ist...

  • Kalkulator mit festen Variablen

    • Kanashius
    • 2. April 2024 um 20:20

    Findet sich auch in dem Code von mir weiter oben:
    GuiCtrlReadData($iInputControl) zum Auslesen. Wenn du sichergehen willst, dass nur Zahlen drin stehen, solltest du noch z.B. mit RegExp prüfen: StringRegExp oder mit Int("5")/Number("1.24") umwandeln; Dabei können dann auch andere Werte rauskommen (keine Ahnung, was aus einem €-Zeichen wird. Aber du bekommst auf jedenfall ne Zahl.

    Das Eurozeichen würde ich nicht in das Inputfeld packen, sondern als Label rechts daneben => Man weiß, dass € gemeint sind, muss aber nicht filtern. Ansonsten auch noch das Ausgelesene mit StringRegExpReplace bearbeiten und z.B. mit "\d+\.d\+" checken. Müsstest dann auch noch für große Zahlen ggf. den (Im Deutschen) "." bei 1000er Stellen erkennen und das "," passend mit einem "." ersetzen.

    Danach kannst du die Werte mit Local $fNumber = Number(GuiCtrlReadData($iInputControl)) speichern und mit Local $fResult = $fPrice*$iAmount verrechnen.

  • Kalkulator mit festen Variablen

    • Kanashius
    • 2. April 2024 um 16:18

    Ich denke, hiermit solltest du etwas anfangen können:

    AutoIt
    #include "ListViewEditInput.au3"
    #include <GuiListView.au3>
    #include <WinAPISys.au3>
    #include <WinAPIvkeysConstants.au3>
    Opt("GuiOnEventMode",1)
    
    Global $iWidth = 800, $iHeight = 600, $iSpace = 5, $iColumnWidth = 120, $iControlHeight = 25
    
    Global $hGui = GUICreate("Calculator", $iWidth, $iHeight, -1, -1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_close")
    
    Global $iListView = GUICtrlCreateListView("Item|Anzahl|Preis|Gesamt", $iSpace, $iSpace, $iWidth-$iSpace*2, $iHeight-$iSpace*4-$iControlHeight)
    Global $iListViewMenu = GUICtrlCreateContextMenu($iListView)
    Local $iListViewMenuDelete = GUICtrlCreateMenuItem("Löschen", $iListViewMenu)
    GUICtrlSetOnEvent($iListViewMenuDelete, "_deleteSelectedItem")
    Global $iLeftCol = $iWidth-$iColumnWidth*3-$iSpace*2-5
    _GUICtrlListView_SetColumnWidth($iListView, 0, $iLeftCol)
    _GUICtrlListView_SetColumnWidth($iListView, 1, $iColumnWidth)
    _GUICtrlListView_SetColumnWidth($iListView, 2, $iColumnWidth)
    _GUICtrlListView_SetColumnWidth($iListView, 3, $iColumnWidth)
    __ListViewEditInput_ListViewAdd($hGui, $iListView, "0,1,2")
    __ListViewEditInput_RegisterFunction($iListView, "_edited", "changed")
    
    Global $iTop = $iHeight-$iSpace*4-$iControlHeight+$iSpace*2, $iLeft = $iSpace, $iLabelWidth=40, $iButtonWidth=50
    GUICtrlCreateLabel("Name:", $iLeft, $iTop+5, $iLabelWidth, $iControlHeight)
    $iLeft += $iLabelWidth
    Global $iInputItemNameWidth = $iWidth-$iSpace*4-$iButtonWidth-$iLabelWidth*2-$iColumnWidth
    Global $iInputItemName = GUICtrlCreateInput("", $iLeft, $iTop, $iInputItemNameWidth, $iControlHeight)
    $iLeft += $iSpace+$iInputItemNameWidth
    GUICtrlCreateLabel("Preis:", $iLeft, $iTop+5, $iLabelWidth, $iControlHeight)
    $iLeft += $iLabelWidth
    Global $iInputPrice = GUICtrlCreateInput("", $iLeft, $iTop, $iColumnWidth, $iControlHeight)
    $iLeft += $iSpace+$iColumnWidth
    Global $iButtonAdd = GUICtrlCreateButton("Add", $iWidth-$iSpace-$iButtonWidth, $iTop, $iButtonWidth, $iControlHeight)
    GUICtrlSetOnEvent($iButtonAdd, "_addItem")
    ;__ListViewEditInput_RegisterFunction($iListView, "_canceled", "canceled")
    
    _open()
    GUISetState(@SW_SHOW, $hGui)
    
    While Sleep(10)
    WEnd
    
    Func _deleteSelectedItem()
    	_GUICtrlListView_DeleteItemsSelected($iListView)
    EndFunc
    
    Func _open()
    	Local $hFile = FileOpen("data", BitOR(0,128))
    	If Not @error Then
    		Local $arData = StringSplit(FileRead($hFile),@crlf, BitOR(1,2))
    		For $i=0 to UBound($arData)-1 step 1
    			If $arData[$i]<>"" Then GUICtrlCreateListViewItem($arData[$i], $iListView)
    		Next
    	EndIf
    EndFunc
    
    Func _close()
    	Local $hFile = FileOpen("data", BitOR(2,8,128))
    	For $i=0 to _GUICtrlListView_GetItemCount($iListView)-1 Step 1
    		If $i<>0 Then FileWrite($hFile, @crlf)
    		For $j=0 to _GUICtrlListView_GetColumnCount($iListView)-1 Step 1
    			If $j<>0 Then FileWrite($hFile, "|")
    			FileWrite($hFile, _GUICtrlListView_GetItemText($iListView, $i, $j))
    		Next
    	Next
    	FileClose($hFile)
    	exit
    EndFunc
    
    Func _addItem()
    	Local $sName = GUICtrlRead($iInputItemName)
    	Local $sPrice = StringReplace(GUICtrlRead($iInputPrice), ",", ".")
    	GUICtrlCreateListViewItem($sName&"|1|"&$sPrice&"|"&$sPrice, $iListView)
    EndFunc
    
    Func _edited($hListView, $iIndex, $iSubIndex)
    	Local $iAmount = Int(_GUICtrlListView_GetItemText($hListView, $iIndex, 1))
    	Local $iPrice = Number(StringReplace(_GUICtrlListView_GetItemText($hListView, $iIndex, 2), ",", "."))
    	_GUICtrlListView_SetItemText($hListView, $iIndex, Round($iAmount*$iPrice, 2), 3)
    EndFunc
    Alles anzeigen

    Dabei nutze ich eine UDF, die ich vor ein paar Jahren erstellt habe: Listview edit subitems UDF
    Dort die ListviewEdit_v2.zip herunterladen und die Datei "ListViewEditInput.au3" in den selben Ordner kopieren, wie dieses Script.

    Den Code kannst du dir erstmal anschauen, dann solltest du die meisten Konzepte von AutoIt verstanden haben :)

    Viel Spaß damit :)

  • Array über Programmdauer hinweg speichern

    • Kanashius
    • 22. März 2024 um 18:41

    Ich würde sagen, das schaut schon gut aus.

    Du könntest überlegen, das Hinzufügen von Nachrichten mit der $mMessage Map selber zu machen => ByRef sorgt dafür, dass die Map nicht kopiert wird, sondern als "Referenz" übergeben wird und ist damit resourcenschonender. Spart das viele schreiben der Parameter und ändern, falls du was hinzufügen willst.

    AutoIt
    _addMessageToDatabase($mMessage)
    
    Func _addMessageToDatabase(ByRef $mMessage)
    	; ...
    	$sQuery &= "'" & $mMessage.id & "'" & ...
    	; ...
    EndFunc

    Muss ich das mit dem BOOLEAN so handhaben? => AutoIt wandelt Dateitypen automatisch um, SQL aber nicht. Es macht also Sinn, den passenden Datentypen zu wählen. Hauptgründe:
    1. Boolean ist 1 bit, der String "False" sind 5 byte (40bit oder noch mehr, je nach encodierung des textes (Standard wäre UTF-8 glaub ich, also 8*4*5 => 160bits)). In deinem Anwendungsfall ggf. nicht so wichtig, je nach Menge der Datensätze, ist aber schon das 160 fache an Datenverbrauch.
    2. Du kannst die Datentypen einfacher in deinen Querys verwenden. Zum Beispiel "SELECT * FROM contacts WHERE analyzed", was deutlich schneller geht als der String-Vergleich: "SELECT * FROM contacts WHERE analyzed='true' or analyzed='True'",... und man hat auch keine Groß- und Kleinschreibung zu beachten.
    Das gilt für eigentlich alle Datentypen. Ich würde immer den richtigen verwenden.

    Wenn ich das Script 2x starte und dazwischen nicht die DB lösche,... => Naja, das ist ja ein Fall der normalerweise (außerhalb vom testen) niemals auftreten sollte, da die ID ja einzigartig ist und nicht mehrmals auftreten sollte. Generell könntest du sogar überlegen, ob du dein Array überhaupt noch brauchst, oder ob du nicht einfach SQL-Queries schicken willst um die Daten abzufragen. SQL erlaubt das selektieren mit Bedingungen und vielem mehr.
    Wenn du Fehlermeldungen beim einfügen vermeiden möchtest kannst du auch "INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)" verwenden. Dabei wird geschaut, ob das als UNIQUE makierte Feld bereits vorhanden ist und es wird nur eingefügt, wenn es nicht bereits existiert.
    Wenn du Daten ändern möchtest (z.B den Sender später hinzuzufügen) nimmt man bei SQL das UPDATE statement. Z.B.: "UPDATE contacts SET sender = 'someone' WHERE id='1234'"

  • Array über Programmdauer hinweg speichern

    • Kanashius
    • 22. März 2024 um 14:41

    Ich hab mal ein kleines Beispiel für eine Datenbankanwendung geschrieben, da sollte das wichtigste drin sein. Für weitere Details solltest du die Hilfe und die SQLite Dokumentation zurate ziehen. Es ist einfach zu umfangreich, alles unterzubringen.

    AutoIt
    #include <Array.au3>
    #include <SQLite.au3>
    
    Global $mDatabase[]
    
    If Not _openDatabase("data.db") Then _exit(@error, @extended, "Database could not be opened.")
    
    _SQLite_Exec($mDatabase.db, "INSERT INTO contacts(first_name, email) VALUES ('test','test@mail.com')")
    If @error Then MsgBox(48, "Warning", "Data could not be inserted: "&@error&" >> "&@extended)
    _ArrayDisplay(_getData("SELECT * FROM contacts"))
    
    
    Func _getData($sSql)
    	Local $arData[0], $iRows, $iCols
    	Local $sResult = _SQLite_GetTable2D($mDatabase.db, $sSql, $arData, $iRows, $iCols)
    	If @error Then Return SetError(1, $sResult&" >> "&@error, $arData)
    	return $arData
    EndFunc
    
    Func _openDatabase($sFile = ":memory:")
    	$mDatabase["dllPath"] = _SQLite_Startup()
    	If @error Then Return SetError(1, @error, False)
    	$mDatabase["db"] = _SQLite_Open($sFile)
    	If @error Then Return SetError(2, @error, False)
    	_SQLite_Exec(-1, "CREATE TABLE IF NOT EXISTS contacts (id INTEGER PRIMARY KEY AUTOINCREMENT, first_name TEXT NOT NULL, email TEXT NOT NULL UNIQUE);")
    	return True
    EndFunc
    
    Func _closeDatabase()
    	If MapExists($mDatabase, "db") And $mDatabase.db<>0 Then
    		_SQLite_Close($mDatabase.db)
    		$mDatabase.db = 0
    	EndIf
    	If MapExists($mDatabase, "dllPath") And $mDatabase.dllPath<>0 Then
    		_SQLite_Shutdown()
    		$mDatabase.dllPath = 0
    	EndIf
    EndFunc
    
    Func _exit($iError = 0, $sExtended = Default, $sMessage = Default)
    	_closeDatabase()
    	If $iError<>0 Then
    		If $sExtended = Default Then $sExtended = ""
    		If $sMessage = Default Then $sMessage = ""
    		MsgBox(16, "Fatal Error", "Error: "&$iError&" >> "&$sExtended&@crlf&$sMessage)
    	EndIf
    	Exit $iError
    EndFunc
    
    Func _generateUUID()
        Return StringFormat('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', Random(0, 0xffff), Random(0, 0xffff), Random(0, 0xffff), BitOR(Random(0, 0x0fff), 0x4000), BitOR(Random(0, 0x3fff), 0x8000), Random(0, 0xffff), Random(0, 0xffff), Random(0, 0xffff))
    EndFunc
    Alles anzeigen

    Dabei findest du auch die _generateUUID Funktion. Die hab ich dazugenommen, damit du deine Emails als Text-Datei mit der UUID als Namen speichern kannst und in der Datenbank dann nur diese UUID speichern musst.

    Das wäre auch meine Methode, große Mengen an Text (HTML/Email/...) zu speichern. Den Inhalt in eine Textdatei mit UUID als Namen speichern und in einer Datenbank, in der alle anderen Infos gespeichert werden, diesen Dateinamen/UUID mitzuspeichern.

    Auf diese Weise kannst du auch größere Mengen an Emails verarbeiten, da nur die groben Infos enthalten sind und den Inhalt, der ja ggf. recht groß sein kann, würde ich nur nachladen, wenn er wirklich benötigt wird.

  • Durchschleifen einer ArrayList und dabei einzelne Listeneinträge löschen

    • Kanashius
    • 6. März 2024 um 15:35

    So geht es:

    AutoIt
    $ObjList = ObjCreate("System.Collections.ArrayList") ; create
    
    $ObjList.Add("Wort")
    $ObjList.Add("Test")
    $ObjList.Add("Hallo")
    $ObjList.Add("Ja")
    
    _ArrayListRemoveIf($ObjList, "e")
    For $sVal in $ObjList
    	ConsoleWrite($sVal&@crlf)
    Next
    
    Func _ArrayListRemoveIf(ByRef $oList, $sStringContained)
    	Local $iIndex = 0
    	while $iIndex<$oList.count
    		If StringInStr($oList.item($iIndex), $sStringContained) Then
    			$oList.removeAt($iIndex)
    		Else
    			$iIndex+=1
    		EndIf
    	WEnd
    EndFunc
    Alles anzeigen

    Das Problem ist, dass ein For ... In ... intern einen Iterator nutzt. Während des durchlaufens der For-Schleife, darf das iterierte Objekt aber nicht verändert werden. (Wundert mich hier nur, dass es nicht mit einer Fehlermeldung beendet, sondern weiterläuft... AutoIt schluckt den Fehler wohl).
    Deshalb darfst du innerhalb der For ... In ... Schleife, das Objekt, über das iteriert wird nicht verändern (Hier $ObjList).

    Um das zu umgehen kannst du über den Index auf das Objekt zugreifen, wie ich in dem Beispiel gemacht habe. Dadurch, dass ich immer nur mit dem Index einzelne Objekte abfrage und lösche, kann ich die ArrayList währenddessen verändern.

    Nebenbei: Es ist in vielen Programmiersprachen so, dass man während der Nutzung eines Iterators das Objekt nicht verändern darf, da der Iterator dann probleme bekommt. Also einfach merken: Beim verändern; besonders beim Löschen; keine Schleife verwenden, die intern einen Iterator verwenden würde, sondern immer über den Index,... die einzelnen Zugriffe selbst verwalten.

  • Umlaute in Dateien aus DOS-Befehlen

    • Kanashius
    • 5. März 2024 um 22:49

    Bei _FileListToArrayRec nicht, das hat nur die "Mask" und die ist eher eingeschränkt.

    Man kann das ganze aber einfach selbst implementieren:

    AutoIt
    #include <Array.au3>
    Local $arFiles = _FileListFilteredToArrayRec("tmpData", "\_\d{4}.*", Default)
    _ArrayDisplay($arFiles)
    
    Func _FileListFilteredToArrayRec($sPath, $sRegExpMatch, ByRef $mRes, $bIncludeFolders = True, $bReturnArray=True)
    	If $mRes=Default Then
    		Local $mData[]
    		$mRes = $mData
    	EndIf
    	Local $hSearch = FileFindFirstFile($sPath&"\*")
    	If $hSearch<0 Then return SetError(1, @error, -1)
    	Local $sFileName = ""
    	While True
    		$sFileName = FileFindNextFile($hSearch)
    		If @error Then ExitLoop
    		If @extended=1 Then
    			_FileListFilteredToArrayRec($sPath&"\"&$sFileName, $sRegExpMatch, $mRes, $bIncludeFolders, False)
    			If StringRegExp($sFileName, "^"&$sRegExpMatch&"$") and $bIncludeFolders Then MapAppend($mRes, $sFileName)
    		Else
    			If StringRegExp($sFileName, "^"&$sRegExpMatch&"$") Then MapAppend($mRes, $sFileName)
    		EndIf
    	WEnd
    	If $bReturnArray Then
    		Local $arRes[UBound($mRes)]
    		Local $arKeys = MapKeys($mRes)
    		For $i=0 to UBound($arKeys)-1 step 1
    			$arRes[$i] = $mRes[$arKeys[$i]]
    		Next
    		return $arRes
    	EndIf
    	return $mRes
    EndFunc
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™