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. Oscar

Beiträge von Oscar

  • Große Dateien einlesen? Alternative zu FileReadLine & FileReadToArray?

    • Oscar
    • 17. Januar 2017 um 19:25

    Deine WinApi-Version liest aber die gesamte Datei komplett in den Buffer.
    Das wäre in AutoIt eher vergleichbar mit:

    AutoIt
    $iTimer = TimerInit()
    $sFilename = @ScriptDir & '\!bigdata.txt'
    $sData = FileRead($sFilename)
    ConsoleWrite(TimerDiff($iTimer) & @CR)

    So dauert das bei mir nur ca. 4 sek.

    Ursprünglich ging es ja darum, dass nicht genug RAM vorhanden ist (Warum auch immer? Der TO schweigt sich ja aus.), um die Datei komplett in den Speicher zu laden.
    Daraufhin dann die Version mit FileReadLine, sodass sich immer nur eine Zeile im Speicher befindet.
    Aber das dann so verschiedene Ergebnisse bei dem Test rauskommen hätte ich jetzt auch nicht gedacht. :/

  • Ausgänge ansteuern mit AutoIt

    • Oscar
    • 17. Januar 2017 um 17:42

    Naja, bei Reichelt gefunden:

    Zitat


    Der Koppler ist für
    Feldbuskommunikation in Ethernet/IP und MODBUS-Netzen geeignet.
    Zusätzlich werden eine Vielzahl von standardisierten
    ETHERNET-Protokollen unterstützt (HTTP, BootP, DHCP, DNS, SNTP, SNMP,
    FTP)
    Ein integrierter Web-Server stellt Konfigurationsmöglichkeiten und Statusinformationen des Kopplers zur Verfügung.

    Alles anzeigen

    TCP/IP, FTP und HTTP ist kein Problem mit AutoIt.
    Ist bloß die Frage wie und welche Daten zur Verfügung gestellt werden bzw. was man an Daten schicken muss.

  • Große Dateien einlesen? Alternative zu FileReadLine & FileReadToArray?

    • Oscar
    • 17. Januar 2017 um 04:50

    Ich habe den Test mit meinem Script von oben (Post#16) nochmal auf neu gestarteten Rechner gemacht.
    Aber mit gleichem Ergebnis: 10.8 sek.
    Bei mir zeigt sich auch kein Caching-Effekt bei mehreren Aufrufen hintereinander.

  • Große Dateien einlesen? Alternative zu FileReadLine & FileReadToArray?

    • Oscar
    • 16. Januar 2017 um 17:58

    Bei nur 52 Zeichen je Zeile mal 5 Millionen Zeilen sind das 260 Millionen Zeichen insgesamt.
    Ich habe mir mal so eine Datei erstellt:

    AutoIt
    Global $sFilename = @ScriptDir & '\!bigdata.txt'
    Global $sData = ''
    For $i = 1 To 5000000
    	For $j = 1 To 50
    		$sData &= Chr(Random(65, 90, 1))
    	Next
    	$sData &= @CRLF
    	If Not Mod($i, 1000) Then ToolTip($i)
    Next
    $hFile = FileOpen($sFilename, 2)
    FileWrite($hFile, $sData)
    FileClose($hFile)
    Alles anzeigen

    und diese mit Filehandle geöffnet und mit 5 Millionen mal FileReadLine eingelesen:


    AutoIt
    $sFilename = @ScriptDir & '\!bigdata.txt'
    $iTimer = TimerInit()
    $hFile = FileOpen($sFilename)
    For $i = 1 To 5000000
    	$sData = FileReadLine($hFile)
    	If Not Mod($i, 1000) Then ToolTip($i)
    Next
    FileClose($hFile)
    ConsoleWrite(TimerDiff($iTimer) & @CR)

    Das Ganze dauert bei mir etwas über 10 Sekunden (von Festplatte, nicht SSD).
    Entweder machst Du etwas ganz anders oder Dein Rechner ist aus der Steinzeit.

  • Große Dateien einlesen? Alternative zu FileReadLine & FileReadToArray?

    • Oscar
    • 16. Januar 2017 um 14:17

    Du schreibst immer von 5000000 Zeilen.
    Wie viele Zeichen sind denn pro Zeile vorhanden?
    Und ist die Datenbank überhaupt zeilenbasiert (jeder Datensatz mit CRLF abgeschlossen)?
    Befinden sich u.U. Nullbytes in den Daten?

    Vielleicht kannst Du mal eine Testdatei zur Verfügung stellen? Aber bitte nicht mit 5000000 Zeilen. :D

  • Große Dateien einlesen? Alternative zu FileReadLine & FileReadToArray?

    • Oscar
    • 16. Januar 2017 um 10:19

    Benutze FileReadLine niemals mit Angabe der Zeilennummer, wenn Du die ganze Datei durchgehen willst! Das dauert ewig.
    Stattdessen die Datei zum Lesen öffnen (FileOpen) und dann FileReadLine mit dem Dateihandle (Rückgabe von FileOpen), aber ohne Angabe der Zeilennummer (bei jedem Aufruf von FileReadLine wird dann jeweils nächste Zeile verwendet). Abschließend die Datei wieder schließen (FileClose), sonst bleibt ein Datei-Lock zurück.

  • Warte auf Datei script #Fragenmachtspaß

    • Oscar
    • 14. Januar 2017 um 08:30

    Nein, UBound gibt Dir die Anzahl der Array-Elemente zurück (hier: 1). Zählen musst Du aber ab Null (deshalb: UBound($array) -1), weil das der erste Eintrag ist.

  • Custom GUI, Image Buttons, Overlapping

    • Oscar
    • 13. Januar 2017 um 10:09

    Das Thema fand ich recht praktisch, weil ich das evtl. auch mal gebrauchen kann.
    Vielen Dank an Alpines, dass er diese Funktion wiedergefunden hat!
    Ich habe dann mal den Rest (Hover-Funktion und erstellen der Childs plus Klick-Funktion) zusammengebaut. Script und Grafiken im ZIP-Archiv (Anhang).

    Dateien

    Datenfunk.zip 175,47 kB – 436 Downloads
  • Funktion mit Parameter in GUICtrlSetOnEvent (und Strings)

    • Oscar
    • 11. Januar 2017 um 19:55

    Leicht abgewandelt funktioniert es:

    AutoIt
    Opt("GUIOnEventMode", True)
    
    
    
    
    HotKeySet("{ESC}", _white)
    
    
    $h1 = GUICreate("Form 1", 301, 301, 347, 212)
    GUISetOnEvent(-3, _Exit)
    $id1 = GUICtrlCreateGraphic(0, 0, 150, 150)
    GUICtrlSetBkColor($id1, 0xFFFFFF)
    GUICtrlSetOnEvent($id1, '_change_colour')
    $id2 = GUICtrlCreateGraphic(150, 0, 150, 150)
    GUICtrlSetBkColor($id2, 0xFFFFFF)
    GUICtrlSetOnEvent($id2, '_change_colour')
    $id3 = GUICtrlCreateGraphic(0, 150, 150, 150)
    GUICtrlSetBkColor($id3, 0xFFFFFF)
    GUICtrlSetOnEvent($id3, '_change_colour')
    $id4 = GUICtrlCreateGraphic(150, 150, 150, 150)
    GUICtrlSetBkColor($id4, 0xFFFFFF)
    GUICtrlSetOnEvent($id4, '_change_colour')
    GUISetState(@SW_SHOW)
    
    
    
    
    Func _change_colour()
    	GUICtrlSetBkColor(@GUI_CtrlId, 0x00FF00)
    EndFunc   ;==>_change_colour
    
    
    Func _white()
    	GUICtrlSetBkColor($id1, 0xFFFFFF)
    	GUICtrlSetBkColor($id2, 0xFFFFFF)
    	GUICtrlSetBkColor($id3, 0xFFFFFF)
    	GUICtrlSetBkColor($id4, 0xFFFFFF)
    EndFunc   ;==>_white
    
    
    Func _Exit()
    	Exit
    EndFunc   ;==>_Exit
    
    
    While 1
    	Sleep(5000)
    WEnd
    Alles anzeigen
  • Autoit Random Funktion?

    • Oscar
    • 11. Januar 2017 um 18:50

    Oder so:

    AutoIt
    SRandom(@MSEC)
    $iRan = Random(0, 9, 1)
    Switch $iRan
    	Case 0 To 6
    		ConsoleWrite($iRan & " wikipedia.de" & @CR)
    		_FFStart("wikipedia.de")
    	Case Else
    		ConsoleWrite($iRan & " Google.de" & @CR)
    		_FFStart("Google.de")
    EndSwitch
  • Monitor Auflösung – Programmabsturz

    • Oscar
    • 9. Januar 2017 um 12:02

    Verwende alternativ "_WinAPI_EnumDisplayMonitors".

  • Msg Box --- Hilfe gesucht

    • Oscar
    • 8. Januar 2017 um 08:32

    Oh ja, Du bist voll der coole Botcoder!
    Kannst Du auch den Dungeon-Keeper in TCP-Level 8 killen?

  • Msg Box --- Hilfe gesucht

    • Oscar
    • 7. Januar 2017 um 18:27

    Wenn Botter versuchen zu programmieren... X/

  • Kindern etwas spielerisch beibringen - Schritt für Schritt Anleitungen

    • Oscar
    • 5. Januar 2017 um 09:09

    Ich habe mein Script mal noch etwas erweitert (Kommentare, Spielende plus Auswertung, Neustart):

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIGdi.au3>
    
    
    Opt('GUIOnEventMode', 1)
    Global $hGui = GUICreate('Kinderspiel', 800, 560)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PrimaryDown')
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PrimaryUp')
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MouseMove')
    GUISetBkColor(0xCCCCFF)
    Global $aText[] = ['Traumlandreise', 'essen', 'Hände waschen', 'an den Tisch setzen', 'Hund ausführen', 'Spielsachen wegräumen', 'Teller holen', 'Blumen gießen'] ; die Texte für die Label
    Global $iCount = UBound($aText) ; Anzahl der Text-Label ermitteln
    Global $aResolving[5] = [5, 2, 6, 3, 1] ; Lösungs-Reihenfolge
    Global $idMove = -1 ; dient als Speicher für das gerade verschobene Label
    Global $iMoveCount = 0 ; Variable zum zählen der Spielzüge
    Global $idMenu = GUICtrlCreateMenu('Spiel')
    GUICtrlCreateMenuItem('Neu starten', $idMenu)
    GUICtrlSetOnEvent(-1, '_Replay')
    GUICtrlCreateMenuItem('', $idMenu)
    GUICtrlCreateMenuItem('Beenden', $idMenu)
    GUICtrlSetOnEvent(-1, '_CloseGui')
    Global $aidLabel[$iCount][3], $aPos
    For $i = 0 To $iCount - 1 ; hier werden die Text-Label erstellt
    	$aidLabel[$i][0] = GUICtrlCreateLabel($aText[$i], 10 + Int($i / 2) * 195, 30 + Mod($i, 2) * 40, 190, 28, $SS_CENTER, $WS_EX_DLGMODALFRAME)
    	GUICtrlSetFont(-1, 14, 400, 2, 'Times New Roman', 5)
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    	$aPos = ControlGetPos($hGui, '', $aidLabel[$i][0]) ; Ausgangsposition des Labels holen (zum zurücksetzen)
    	$aidLabel[$i][1] = $aPos[0] ; X-Position speichern
    	$aidLabel[$i][2] = $aPos[1] ; Y-Position speichern
    Next
    Global $aidSlot[5][2], $aidLED[5], $aSlotPos[5][4]
    For $i = 0 To 4 ; hier werden die Ziel-Slots erstellt
    	GUICtrlCreateLabel($i + 1 & '.', 260, 185 + $i * 48, 20, 32)
    	GUICtrlSetFont(-1, 12, 400, 0, 'Tahoma')
    	$aidSlot[$i][0] = GUICtrlCreateLabel('', 286, 180 + $i * 48, 194, 32, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    	$aidSlot[$i][1] = -1 ; wird benutzt, um zu speichern, welches Textlabel auf dem Slot liegt (-1 = leer)
    	$aidLED[$i] = GUICtrlCreateLabel('', 490, 188 + $i * 48, 16, 16, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xFF0000)
    	$aPos = ControlGetPos($hGui, '', $aidSlot[$i][0]) ; Position des Slots ermitteln (wird für _WinAPI_PtInRectEx benötigt)
    	$aSlotPos[$i][0] = $aPos[0] ; X-Position
    	$aSlotPos[$i][1] = $aPos[1] ; Y-Position
    	$aSlotPos[$i][2] = $aPos[0] + $aPos[2] ; X + Width = Right
    	$aSlotPos[$i][3] = $aPos[1] + $aPos[3] ; Y + Height = Bottom
    Next
    ; die folgenden Texte werden angezeigt, wenn alle Label richtig positioniert wurden
    Global $idWin = GUICtrlCreateLabel('Alles richtig! Das hast Du gut gemacht!', 30, 440, 730, 40, $SS_CENTER)
    GUICtrlSetFont(-1, 24, 400, 2, 'Times New Roman')
    GUICtrlSetState(-1, $GUI_HIDE)
    ; das folgende Label wird mit der Anzahl der Spielzüge gefüllt
    Global $idMoveCount = GUICtrlCreateLabel('', 30, 490, 730, 40, $SS_CENTER)
    GUICtrlSetFont(-1, 18, 400, 2, 'Times New Roman')
    GUICtrlSetState(-1, $GUI_HIDE)
    GUISetState()
    WinWaitClose($hGui)
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc   ;==>_CloseGui
    
    
    Func _Replay()
    	For $i = 0 To $iCount - 1
    		GUICtrlSetPos($aidLabel[$i][0], $aidLabel[$i][1], $aidLabel[$i][2])
    	Next
    	For $i = 0 To 4
    		$aidSlot[$i][1] = -1
    		GUICtrlSetBkColor($aidLED[$i], 0xFF0000)
    	Next
    	$iMoveCount = 0
    	GUICtrlSetState($idWin, $GUI_HIDE)
    	GUICtrlSetState($idMoveCount, $GUI_HIDE)
    EndFunc   ;==>_Replay
    
    
    Func _PrimaryDown()
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	If @error Then Return
    	If $aInfo[4] < $aidLabel[0][0] Or $aInfo[4] > $aidLabel[$iCount - 1][0] Then Return
    	$idMove = $aInfo[4]
    	GuiCtrlSetOnTop($idMove)
    	For $i = 0 To 4
    		If $aidSlot[$i][1] = $idMove Then $aidSlot[$i][1] = -1
    	Next
    EndFunc   ;==>_PrimaryDown
    
    
    Func _PrimaryUp()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui), $iIndex
    	If @error Then Return
    	$iMoveCount += 1
    	Local $iWin = 0
    	For $i = 0 To 4
    		If _WinAPI_PtInRectEx($aInfo[0], $aInfo[1], $aSlotPos[$i][0], $aSlotPos[$i][1], $aSlotPos[$i][2], $aSlotPos[$i][3]) Then
    			If $aidSlot[$i][1] <> -1 Then
    				$iIndex = -1
    				For $j = 0 To $iCount - 1
    					If $aidSlot[$i][1] = $aidLabel[$j][0] Then $iIndex = $j
    				Next
    				GUICtrlSetPos($aidSlot[$i][1], $aidLabel[$iIndex][1], $aidLabel[$iIndex][2])
    			EndIf
    			GUICtrlSetPos($idMove, $aSlotPos[$i][0] + 2, $aSlotPos[$i][1] + 2)
    			$aidSlot[$i][1] = $idMove
    			Beep(600, 40)
    		EndIf
    		$aPos = ControlGetPos($hGui, '', $aidLabel[$aResolving[$i]][0])
    		If _WinAPI_PtInRectEx($aPos[0], $aPos[1], $aSlotPos[$i][0], $aSlotPos[$i][1], $aSlotPos[$i][0] + 4, $aSlotPos[$i][1] + 4) Then
    			$iWin += 1
    			GUICtrlSetBkColor($aidLED[$i], 0x00FF00)
    		Else
    			GUICtrlSetBkColor($aidLED[$i], 0xFF0000)
    		EndIf
    	Next
    	If $iWin = 5 Then
    		GUICtrlSetData($idMoveCount, StringFormat('Du hast %s%s Spielzüge benötigt.', $iMoveCount = 5 ? 'nur ' : '', $iMoveCount))
    	EndIf
    	GUICtrlSetState($idWin, $iWin = 5 ? $GUI_SHOW : $GUI_HIDE)
    	GUICtrlSetState($idMoveCount, $iWin = 5 ? $GUI_SHOW : $GUI_HIDE)
    	$idMove = -1
    EndFunc   ;==>_PrimaryUp
    
    
    Func _MouseMove()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	GUICtrlSetPos($idMove, $aInfo[0] - 85, $aInfo[1] - 12)
    EndFunc   ;==>_MouseMove
    
    
    Func GuiCtrlSetOnTop($iCtrlID)
    	;Need to include <WinAPI.au3> and <APIConstants.au3>
    	Local $hWnd = $iCtrlID
    	If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($iCtrlID)
    	Return _WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $SWP_NOMOVE + $SWP_NOSIZE + $SWP_NOCOPYBITS)
    EndFunc   ;==>GuiCtrlSetOnTop
    Alles anzeigen
  • Kindern etwas spielerisch beibringen - Schritt für Schritt Anleitungen

    • Oscar
    • 4. Januar 2017 um 18:26

    Hier mal die korrigierte Version:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIGdi.au3>
    
    
    Opt('GUIOnEventMode', 1)
    Global $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PrimaryDown')
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PrimaryUp')
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MouseMove')
    GUISetBkColor(0xCCCCFF)
    Global $idMove = -1
    Global $aText[] = ['Traumlandreise', 'essen', 'Hände waschen', 'an den Tisch setzen', 'Hund ausführen', 'Spielsachen wegräumen', 'Teller holen']
    Global $iCount = UBound($aText)
    Global $aResolving[5] = [5, 2, 6, 3, 1] ; Lösung
    Global $aidLabel[$iCount][3], $aPos
    For $i = 0 To $iCount - 1
    	$aidLabel[$i][0] = GUICtrlCreateLabel($aText[$i], 10 + Int($i / 2) * 195, 10 + Mod($i, 2) * 40, 190, 28, $SS_CENTER, $WS_EX_DLGMODALFRAME)
    	GUICtrlSetFont(-1, 14, 400, 2, 'Times New Roman', 5)
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    	$aPos = ControlGetPos($hGui, '', $aidLabel[$i][0])
    	$aidLabel[$i][1] = $aPos[0]
    	$aidLabel[$i][2] = $aPos[1]
    Next
    Global $aidSlot[5][2], $aidLED[5]
    For $i = 0 To 4
    	GUICtrlCreateLabel($i + 1 & '.', 180, 145 + $i * 48, 20, 32)
    	GUICtrlSetFont(-1, 12, 400, 0, 'Tahoma')
    	$aidSlot[$i][0] = GUICtrlCreateLabel('', 206, 140 + $i * 48, 194, 32, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    	$aidSlot[$i][1] = -1
    	$aidLED[$i] = GUICtrlCreateLabel('', 410, 148 + $i * 48, 16, 16, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xFF0000)
    Next
    GUISetState()
    WinWaitClose($hGui)
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc   ;==>_CloseGui
    
    
    Func _PrimaryDown()
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	If @error Then Return
    	If $aInfo[4] < $aidLabel[0][0] Or $aInfo[4] > $aidLabel[$iCount - 1][0] Then Return
    	$idMove = $aInfo[4]
    	GuiCtrlSetOnTop($idMove)
    	For $i = 0 To 4
    		If $aidSlot[$i][1] = $idMove Then $aidSlot[$i][1] = -1
    	Next
    EndFunc   ;==>_PrimaryDown
    
    
    Func _PrimaryUp()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui), $iIndex
    	If @error Then Return
    	For $i = 0 To 4
    		If _WinAPI_PtInRectEx($aInfo[0], $aInfo[1], 206, 140 + $i * 48, 400, 172 + $i * 48) Then
    			If $aidSlot[$i][1] <> -1 Then
    				$iIndex = -1
    				For $j = 0 To $iCount - 1
    					If $aidSlot[$i][1] = $aidLabel[$j][0] Then $iIndex = $j
    				Next
    				GUICtrlSetPos($aidSlot[$i][1], $aidLabel[$iIndex][1], $aidLabel[$iIndex][2])
    			EndIf
    			GUICtrlSetPos($idMove, 208, 142 + $i * 48)
    			$aidSlot[$i][1] = $idMove
    			Beep(600, 40)
    		EndIf
    		$aPos = ControlGetPos($hGui, '', $aidLabel[$aResolving[$i]][0])
    		If _WinAPI_PtInRectEx($aPos[0], $aPos[1], 206, 140 + $i * 48, 400, 172 + $i * 48) Then
    			GUICtrlSetPos($aidLabel[$aResolving[$i]][0], 208, 142 + $i * 48)
    			GUICtrlSetBkColor($aidLED[$i], 0x00FF00)
    		Else
    			GUICtrlSetBkColor($aidLED[$i], 0xFF0000)
    		EndIf
    	Next
    	$idMove = -1
    EndFunc   ;==>_PrimaryUp
    
    
    Func _MouseMove()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	GUICtrlSetPos($idMove, $aInfo[0] - 85, $aInfo[1] - 12)
    EndFunc   ;==>_MouseMove
    
    
    Func GuiCtrlSetOnTop($iCtrlID)
    	;Need to include <WinAPI.au3> and <APIConstants.au3>
    	Local $hWnd = $iCtrlID
    	If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($iCtrlID)
    	Return _WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $SWP_NOMOVE + $SWP_NOSIZE + $SWP_NOCOPYBITS)
    EndFunc   ;==>GuiCtrlSetOnTop
    Alles anzeigen

    Das ist jetzt aber ziemlich kompliziert geworden.
    Ich denke, dass man das auch einfacher hinbekommt, aber dazu muss man das ganze Konzept nochmal überdenken.
    Aber das sollte ja auch nur als Grundgerüst dienen, damit Du siehst, wie man die Control-Elemente verschieben/auswerten kann.

  • Kindern etwas spielerisch beibringen - Schritt für Schritt Anleitungen

    • Oscar
    • 3. Januar 2017 um 19:35

    Hier mal ein erster Versuch mit Text-Label:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIGdi.au3>
    
    
    Opt('GUIOnEventMode', 1)
    Global $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PrimaryDown')
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PrimaryUp')
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MouseMove')
    GUISetBkColor(0xCCCCFF)
    Global $idMove = -1
    Global $aText[] = ['Traumlandreise', 'essen', 'Hände waschen', 'an den Tisch setzen', 'Hund ausführen', 'Spielsachen wegräumen', 'Teller holen']
    Global $iCount = UBound($aText)
    Global $aResolving[5] = [5, 2, 6, 3, 1] ; Lösung
    Global $aidLabel[$iCount]
    For $i = 0 To $iCount - 1
    	$aidLabel[$i] = GUICtrlCreateLabel($aText[$i], 10 + Int($i / 2) * 195, 10 + Mod($i, 2) * 40, 190, 28, $SS_CENTER, $WS_EX_DLGMODALFRAME)
    	GUICtrlSetFont(-1, 12, 400, 0, 'Tahoma')
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    Next
    Global $aidSlot[5], $aidLED[5]
    For $i = 0 To 4
    	GUICtrlCreateLabel($i + 1 & '.', 180, 145 + $i * 48, 20, 32)
    	GUICtrlSetFont(-1, 12, 400, 0, 'Tahoma')
    	$aidSlot[$i] = GUICtrlCreateLabel('', 206, 140 + $i * 48, 194, 32, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xEEEEEE)
    	$aidLED[$i] = GUICtrlCreateLabel('', 410, 148 + $i * 48, 16, 16, Default, $WS_EX_CLIENTEDGE)
    	GUICtrlSetBkColor(-1, 0xFF0000)
    Next
    GUISetState()
    WinWaitClose($hGui)
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc
    
    
    Func _PrimaryDown()
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	If @error Then Return
    	$idMove = $aInfo[4]
    	GuiCtrlSetOnTop($idMove)
    EndFunc
    
    
    Func _PrimaryUp()
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	If @error Then Return
    	For $i = 0 To 4
    		If _WinAPI_PtInRectEx($aInfo[0], $aInfo[1], 206, 140 + $i * 48, 400, 172 + $i * 48) Then
    			GUICtrlSetPos($idMove, 208, 142 + $i * 48)
    			Beep(600, 40)
    			If $aText[$aResolving[$i]] = GUICtrlRead($idMove) Then
    				GUICtrlSetBkColor($aidLED[$i], 0x00FF00)
    			Else
    				GUICtrlSetBkColor($aidLED[$i], 0xFF0000)
    			EndIf
    		EndIf
    	Next
    	$idMove = -1
    EndFunc
    
    
    Func _MouseMove()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	GUICtrlSetPos($idMove, $aInfo[0] - 85, $aInfo[1] - 12)
    EndFunc
    
    
    Func GuiCtrlSetOnTop($iCtrlID)
        ;Need to include <WinAPI.au3> and <APIConstants.au3>
        Local $hWnd = $iCtrlID
        If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($iCtrlID)
        Return _WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $SWP_NOMOVE + $SWP_NOSIZE + $SWP_NOCOPYBITS)
    EndFunc
    Alles anzeigen
  • Kindern etwas spielerisch beibringen - Schritt für Schritt Anleitungen

    • Oscar
    • 3. Januar 2017 um 18:25

    Statt mit mehreren Fenstern, würde ich einfach nur die Control-Elemente verschieben. Das läßt sich IMHO einfacher handhaben:

    AutoIt
    #include <AutoItConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    
    
    Opt('GUIOnEventMode', 1)
    Global $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_PrimaryDown')
    GUISetOnEvent($GUI_EVENT_PRIMARYUP, '_PrimaryUp')
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE, '_MouseMove')
    Global $iCount = 10, $idMove = -1, $iIconSize = 64, $iSpace = $iIconSize + 16
    Global $aidLabel[$iCount]
    For $i = 0 To $iCount - 1
    	$aidLabel[$i] = GUICtrlCreateIcon('shell32.dll', $i+1, 10 + Int($i / 2) * $iSpace, 10 + Mod($i, 2) * $iSpace, $iIconSize, $iIconSize, Default, $WS_EX_DLGMODALFRAME)
    ;~ 	$aidLabel[$i] = GUICtrlCreateLabel($i+1, 10 + Int($i / 2) * 80, 10 + Mod($i, 2) * 80, 64, 64, Default, $WS_EX_DLGMODALFRAME)
    Next
    GUISetState()
    WinWaitClose($hGui)
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc
    
    
    Func _PrimaryDown()
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	If @error Then Return
    	$idMove = $aInfo[4]
    	GuiCtrlSetOnTop($idMove)
    EndFunc
    
    
    Func _PrimaryUp()
    	$idMove = -1
    EndFunc
    
    
    Func _MouseMove()
    	If $idMove = -1 Then Return
    	Local $aInfo = GUIGetCursorInfo($hGui)
    	GUICtrlSetPos($idMove, $aInfo[0] - $iIconSize / 2, $aInfo[1] - $iIconSize / 2)
    EndFunc
    
    
    Func GuiCtrlSetOnTop($iCtrlID)
        ;Need to include <WinAPI.au3> and <APIConstants.au3>
        Local $hWnd = $iCtrlID
        If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($iCtrlID)
        Return _WinAPI_SetWindowPos($hWnd, $HWND_BOTTOM, 0, 0, 0, 0, $SWP_NOMOVE + $SWP_NOSIZE + $SWP_NOCOPYBITS)
    EndFunc
    Alles anzeigen
  • Gitternetz (edit: gelöst)

    • Oscar
    • 2. Januar 2017 um 20:03

    Andy: Stimmt! Ohne die INT sieht es besser aus!
    Außerdem die halbtransparenten Linien von Bitnugger und ein Menü zum speichern des Bildes. :D
    Hier also die aktuelle Version:

    AutoIt
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    _GDIPlus_Startup()
    Global $hBackgr = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\jpg2_stp.jpg') ; das Hintergrundbild laden
    Global $iWidth = _GDIPlus_ImageGetWidth($hBackgr) ; die Breite
    Global $iHeight = _GDIPlus_ImageGetHeight($hBackgr) ; und die Höhe des Bildes ermitteln
    ConsoleWrite(StringFormat('Bildauflösung: %i x %i Pixel\n', $iWidth, $iHeight)) ; Debug-Info
    Global $iMenuHeight = _WinAPI_GetSystemMetrics($SM_CYMENU) ; die Höhe (in Pixel) für das Menü holen
    Global $hGui = GUICreate('Koordinaten-Gitter', $iWidth, $iHeight + $iMenuHeight) ; ein entsprechendes Fenster erstellen
    Global $idMenu = GUICtrlCreateMenu('Datei') ; das Dateimenü erstellen
    Global $idSaveAs = GUICtrlCreateMenuItem('Bild speichern', $idMenu) ; Menüeintrag zum speichern erstellen
    GUICtrlCreateMenuItem('', $idMenu) ; Menüeintrag Leerzeile erstellen
    Global $idExit = GUICtrlCreateMenuItem('Programm beenden', $idMenu) ; Menüeintrag zum beenden erstellen
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui) ; eine Graphic des Fensters erstellen
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ; Smoothing aktivieren
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic) ; eine Bitmap von der Graphic erstellen (zum separaten Zeichnen der Linien)
    Global $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; den GraphicContext der Bitmap holen
    Global $iGridX = $iWidth / 22, $iGridY = $iHeight / 14 ; die Gitter-Breite und -Höhe errechnen
    ConsoleWrite(StringFormat('Gitternetz: %f x %f Pixel\n', $iGridX, $iGridY)) ; Debug-Info
    ; Damit wir die Linien transparent zeichnen können
    Global $iARGB = 0x22000000	; Alpha, Red, Green and Blue components of pen color
    Global $hPen = _GDIPlus_PenCreate($iARGB)
    For $iX = 0 To $iWidth Step $iGridX ; eine Schleife für die vertikalen Linien
    	_GDIPlus_GraphicsDrawLine($hGfxCtxt, $iX, 0, $iX, $iHeight, $hPen) ; die Linie zeichnen
    Next
    For $iY = 0 To $iHeight Step $iGridY ; eine Schleife für die horizontalen Linien
    	_GDIPlus_GraphicsDrawLine($hGfxCtxt, 0, $iY, $iWidth, $iY, $hPen) ; die Linie zeichnen
    Next
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT') ; WM_PAINT registrieren, damit das Fenster bei Bedarf neu gezeichnet wird
    GUISetState() ; das Fenster anzeigen
    Global $aInfo, $sMsg, $hSaveImg, $hSaveGfx
    While True
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE, $idExit ; wenn das Fenster geschlossen wird
    			; Wichtig! Das "aufräumen" nicht vergessen!
    			_GDIPlus_PenDispose($hPen)
    			_GDIPlus_BitmapDispose($hBackgr)
    			_GDIPlus_BitmapDispose($hBitmap)
    			_GDIPlus_GraphicsDispose($hGfxCtxt)
    			_GDIPlus_GraphicsDispose($hGraphic)
    			_GDIPlus_Shutdown()
    			; und hier dann erst das Programm beenden
    			Exit
    		Case $GUI_EVENT_RESTORE ; beim Wiederherstellen des Fensters (aus dem minimierten Status)
    			_RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    		Case $GUI_EVENT_PRIMARYDOWN ; wenn die linke Maustaste gedrückt wird
    			$aInfo = GUIGetCursorInfo($hGui) ; die Koordinaten der Maus ermitteln (relativ zum Fenster)
    			$sMsg = StringFormat('Maus:\n x = %3i\n y = %3i\n\nGitternetz:\n x = %2i\n y = %2i', $aInfo[0], $aInfo[1], Int($aInfo[0] / $iGridX), Int($aInfo[1] / $iGridY)) ; für die Anzeige die Maus- in Gitternetz-Koordinaten umrechnen
    			ToolTip($sMsg, Default, Default, 'Koordinaten', 1) ; und im ToolTip anzeigen
    		Case $GUI_EVENT_MOUSEMOVE ; wenn die Maus bewegt wird
    			ToolTip('') ; ToolTip wieder ausblenden
    		Case $GUI_EVENT_SECONDARYDOWN ; wenn die rechte Maustaste gedrückt wird
    			_GDIPlus_GraphicsDrawImage($hGraphic, $hBackgr, 0, 0) ; nur die Hintergrund-Bitmap (ohne das Gitter) auf die Fenster-Graphic zeichnen
    		Case $GUI_EVENT_SECONDARYUP ; beim loslassen der rechten Maustaste
    			_RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    		Case $idSaveAs ; wenn der Menüpukt "Bild speichern" ausgewählt wurde
    			$hSaveImg = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic) ; Bitmap zum speichern erstellen
    			$hSaveGfx = _GDIPlus_ImageGetGraphicsContext($hSaveImg) ; den GraphicContext holen
    			_GDIPlus_GraphicsDrawImage($hSaveGfx, $hBackgr, 0, 0) ; den Hintergrund in die Graphic zeichnen
    			_GDIPlus_GraphicsDrawImage($hSaveGfx, $hBitmap, 0, 0) ; das Gitternetz in die Graphic zeichnen
    			_GDIPlus_ImageSaveToFile($hSaveImg, @ScriptDir & '\ImageWithGrid.png') ; die Bitmap als PNG speichern
    			_GDIPlus_BitmapDispose($hSaveImg) ; und aufräumen
    			_GDIPlus_GraphicsDispose($hSaveGfx) ; und aufräumen
    	EndSwitch
    WEnd
    Func _RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    	_GDIPlus_GraphicsDrawImage($hGraphic, $hBackgr, 0, 0) ; die Hintergrund-Bitmap auf die Fenster-Graphic zeichnen
    	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0) ; die Linien-Bitmap auf die Fenster-Graphic zeichnen
    EndFunc   ;==>_RedrawBitmap
    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	#forceref $iMsg, $wParam, $lParam
    	If $hWnd = $hGui Then _RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>_WM_PAINT
    Alles anzeigen
  • Gitternetz (edit: gelöst)

    • Oscar
    • 2. Januar 2017 um 08:40

    Ich habe Dir mal ein Beispiel mit GDI+ erstellt (inkl. Kommentaren):

    AutoIt
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    _GDIPlus_Startup()
    Global $hBackgr = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\jpg2_stp.jpg') ; das Hintergrundbild laden
    Global $iWidth = _GDIPlus_ImageGetWidth($hBackgr) ; die Breite
    Global $iHeight = _GDIPlus_ImageGetHeight($hBackgr) ; und die Höhe des Bildes ermitteln
    ConsoleWrite(StringFormat('Bildauflösung: %i x %i Pixel\n', $iWidth, $iHeight)) ; Debug-Info
    Global $hGui = GUICreate('', $iWidth, $iHeight) ; ein entsprechendes Fenster erstellen
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui) ; eine Graphic des Fensters erstellen
    _GDIPlus_GraphicsSetSmoothingMode($hGraphic, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ; Smoothing aktivieren
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic) ; eine Bitmap von der Graphic erstellen (zum separaten Zeichnen der Linien)
    Global $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; den GraphicContext der Bitmap holen
    Global $iGridX = Int($iWidth / 22), $iGridY = Int($iHeight / 14) ; die Gitter-Breite und -Höhe errechnen
    ConsoleWrite(StringFormat('Gitternetz: %i x %i Pixel\n', $iGridX, $iGridY)) ; Debug-Info
    For $iX = 0 To $iWidth Step $iGridX ; eine Schleife für die vertikalen Linien
    	_GDIPlus_GraphicsDrawLine($hGfxCtxt, $iX, 0, $iX, $iHeight) ; die Linie zeichnen
    Next
    For $iY = 0 To $iHeight Step $iGridY ; eine Schleife für die horizontalen Linien
    	_GDIPlus_GraphicsDrawLine($hGfxCtxt, 0, $iY, $iWidth, $iY) ; die Linie zeichnen
    Next
    GUIRegisterMsg($WM_PAINT, '_WM_PAINT') ; WM_PAINT registrieren, damit das Fenster bei Bedarf neu gezeichnet wird
    GUISetState() ; das Fenster anzeigen
    Global $aInfo, $sMsg
    While True
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE ; wenn das Fenster geschlossen wird
    			; Wichtig! Das "aufräumen" nicht vergessen!
    			_GDIPlus_BitmapDispose($hBackgr)
    			_GDIPlus_BitmapDispose($hBitmap)
    			_GDIPlus_GraphicsDispose($hGfxCtxt)
    			_GDIPlus_GraphicsDispose($hGraphic)
    			_GDIPlus_Shutdown()
    			; und hier dann erst das Programm beenden
    			Exit
    		Case $GUI_EVENT_RESTORE ; beim Wiederherstellen des Fensters (aus dem minimierten Status)
    			_RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    		Case $GUI_EVENT_PRIMARYDOWN ; wenn die linke Maustaste gedrückt wird
    			$aInfo = GUIGetCursorInfo($hGui) ; die Koordinaten der Maus ermitteln (relativ zum Fenster)
    			$sMsg = StringFormat('Maus:\n x = %3i\n y = %3i\n\nGitternetz:\n x = %2i\n y = %2i', $aInfo[0], $aInfo[1], Int($aInfo[0] / $iGridX), Int($aInfo[1] / $iGridY)) ; für die Anzeige die Maus- in Gitternetz-Koordinaten umrechnen
    			ToolTip($sMsg, Default, Default, 'Koordinaten', 1) ; und im ToolTip anzeigen
    		Case $GUI_EVENT_MOUSEMOVE ; wenn die Maus bewegt wird
    			ToolTip('') ; ToolTip wieder ausblenden
    		Case $GUI_EVENT_SECONDARYDOWN ; wenn die rechte Maustaste gedrückt wird
    			_GDIPlus_GraphicsDrawImage($hGraphic, $hBackgr, 0, 0) ; nur die Hintergrund-Bitmap (ohne das Gitter) auf die Fenster-Graphic zeichnen
    		Case $GUI_EVENT_SECONDARYUP ; beim loslassen der rechten Maustaste
    			_RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    	EndSwitch
    WEnd
    Func _RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    	_GDIPlus_GraphicsDrawImage($hGraphic, $hBackgr, 0, 0) ; die Hintergrund-Bitmap auf die Fenster-Graphic zeichnen
    	_GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0) ; die Linien-Bitmap auf die Fenster-Graphic zeichnen
    EndFunc   ;==>_RedrawBitmap
    Func _WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	#forceref $iMsg, $wParam, $lParam
    	If $hWnd = $hGui Then _RedrawBitmap() ; die Fenster-Graphic neuzeichnen
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>_WM_PAINT
    Alles anzeigen

    Edit: Das Script nochmal überarbeitet. Da kann man so schön mit rumspielen. :D
    Beim linken Mausklick werden die Maus- und Gitternetz-Koordinaten angezeigt und beim rechten Mausklick wird das Gitternetz ausgeblendet.

  • Kopieren großer Dateien mit Fortschrittsanzeige

    • Oscar
    • 28. Dezember 2016 um 16:29

    Ich hatte mal vor geraumer Zeit eine UDF geschrieben, mit der man große Dateien (einzeln oder mehrere) kopieren kann.
    Natürlich mit Progressbar, Kopiergeschwindigkeit, etc.
    Hier mal ein Beispiel:

    AutoIt
    #include '_FileCopyEx.au3'
    
    
    Global $aSourceFiles[1] = [@ScriptDir & '\NaturNah - Wintervögel.mp4'], $aDestDir[1] = [@ScriptDir & '\test\']
    Global $sLog = _FileCopyEx($aSourceFiles, $aDestDir, 16 + 8 + 4 + 2 + 1, 'Dateien kopieren...')
    ConsoleWrite('Fehler: ' & @error & @CR)
    ConsoleWrite($sLog & @CR)

    Dateien

    _FileCopyEx.au3 25,37 kB – 263 Downloads _FileCopyEx-Beispiel.au3 309 Byte – 276 Downloads

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™