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

  • GUICtrlPic nach dem laden mit GDI+ wieder leeren (transparent)

    • Oscar
    • 12. Juli 2015 um 15:54

    Ich bräuchte mal eure Hilfe.
    Ich möchte ein Pic-Control nach der Anzeige eines Bildes mit GDI+ wieder transparent haben, sodass ein neues Bild nicht über dem alten Bild angezeigt wird, sondern nur das neue Bild angezeigt wird.
    Hier mal ein Beispiel (wie es nicht aussehen soll):

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPI.au3>
    
    
    Opt('GUIOnEventMode', 1)
    
    
    $sPath = 'c:\Program Files (x86)\AutoIt3\Examples\GUI\'
    
    
    _GDIPlus_Startup()
    
    
    $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetBkColor(0xF0F0F0)
    GUICtrlCreatePic($sPath & "msoobe.jpg", 0, 0, 800, 600)
    GUICtrlSetState(-1, $GUI_DISABLE)
    $idPic = GUICtrlCreatePic('', 80, 60, 440, 440)
    GUISetState(@SW_SHOW, $hGui)
    
    
    $hPic = GUICtrlGetHandle($idPic)
    $aCtrlSize = WinGetClientSize($hPic)
    $hBitmap = _GDIPlus_BitmapCreateFromScan0($aCtrlSize[0], $aCtrlSize[1])
    $hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    $hImage = _GDIPlus_BitmapCreateFromFile($sPath & 'Torus.png')
    
    
    _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, $aCtrlSize[0], $aCtrlSize[1])
    $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
    _WinAPI_DeleteObject($hBMP)
    
    
    MsgBox(0, 'Test', 'Nach dem schließen dieser MsgBox soll das große Bild Torus.png weg sein' & @CR & 'und nur noch das kleine Bild angezeigt werden.')
    
    
    _GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, $aCtrlSize[0] / 2, $aCtrlSize[1] / 2)
    $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _WinAPI_DeleteObject(GUICtrlSendMsg($idPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
    _WinAPI_DeleteObject($hBMP)
    
    
    WinWaitClose($hGui)
    _GDIPlus_GraphicsDispose($hGfxCtxt)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hImage)
    _GDIPlus_Shutdown()
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc
    Alles anzeigen

    Hat jemand eine Idee, wie man das hinkriegen kann?
    Und bitte nicht das Pic-Control löschen und neu erstellen. Das ist keine Alternative. ;)

  • For-Schleife funktioniert nicht

    • Oscar
    • 11. Juli 2015 um 18:20

    Wenn die Abfrage auf "Ungleich" lauten soll, dann das NOT weglassen und "<>" verwenden.

  • For-Schleife funktioniert nicht

    • Oscar
    • 11. Juli 2015 um 15:29

    Das mit dem flackern liegt sicherlich daran, dass Du die Höhe der Control-Elemente weglässt.
    Das ist zwar zulässig, aber nicht immer zuverlässig. ;)
    Und ganz besonders dann nicht, wenn man dem Control-Element ein Style (z.B. $ES_READONLY) verpasst und dabei vergisst, dass da die Höhenangabe fehlt.
    Dann wird nämlich der Wert von $ES_READONLY als Höhenangabe interpretiert.

    Außerdem kann man ein READONLY-Input durchaus auch einen weißen Hintergrund zuweisen:

    AutoIt
    $iInputValue = GUICtrlCreateInput("", 10, 40, 380, 20, $ES_READONLY)
    GUICtrlSetBkColor(-1, 0xFFFFFF)

    Und Text auf die GUI bekommt man mit GUICtrlCreateLabel.

    Edit: Die folgende Zeile wird vermutlich anders interpretiert als Du das willst:

    AutoIt
    If Not GUICtrlRead($iInputValue) <> GUICtrlRead($iComboXYZ) Then

    Hier wird als erstes "Not GUICtrlRead($iInputValue)" ausgewertet, weil NOT die höchste Priorität unter den Operatoren besitzt. Dabei kommt TRUE/FALSE raus (je nachdem, ob etwas im Input steht oder nicht) und das wird dann mit dem Inhalt von $iComboXYZ verglichen.
    Ich denke mal das ist anders gemeint, oder?
    Wenn ja, dann entsprechend Klammern setzen oder gleich das NOT weglassen und "=" anstelle von "<>" benutzen.

  • For-Schleife funktioniert nicht

    • Oscar
    • 11. Juli 2015 um 13:31

    Wie wäre es, wenn Du mal Dein Script postest?
    Dann bräuchte man nicht raten, was "wollte nicht so recht..." und "wollte nicht funktionieren" bedeutet.
    Und so nebenbei könnten wir Dir auch erklären, wie man es richtig macht. :)

  • GDI Plus Bild aus dem Backbuffer zeichen

    • Oscar
    • 9. Juli 2015 um 20:03

    Vielleicht möchtest Du ja meine UDF "_GuiCtrlSetImageEx" benutzen?!

    Damit kannst Du Pic-Controls beliebige Bilder (PNG, GIF, JPG, ICO, BMP, etc.) zuweisen.
    Auch transparente PNGs sind kein Problem (Hintergrundfarbe kann man angeben).

    Hier mal ein Beispiel:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include '_GuiCtrlSetImageEx.au3'
    
    
    Opt('GUIOnEventMode', 1)
    
    
    Global $hGui = GUICreate('Test', 800, 600)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui')
    GUISetBkColor(0xF0F0F0)
    Global $idButton1 = GUICtrlCreatePic('', 20, 20, 600, 400)
    GUICtrlSetOnEvent(-1, '_Button1Func')
    _GuiCtrlSetImageEx(-1, @ScriptDir & '\test.png', False, 0xF0F0F0)
    GUISetState(@SW_SHOW, $hGui)
    WinWaitClose($hGui)
    Exit
    
    
    Func _CloseGui()
    	GUIDelete($hGui)
    EndFunc
    
    
    Func _Button1Func()
    	MsgBox(0, 'test', 'Button1')
    EndFunc
    Alles anzeigen

    Dateien

    _GuiCtrlSetImageEx.au3 5,38 kB – 331 Downloads
  • Array variable has incorrect number of subscripts...

    • Oscar
    • 9. Juli 2015 um 19:32

    Weil das nicht immer funktioniert (0-Index = Anzahl der Arrayelemente) oder weil man manchmal auch noch den Index benötigt. :)
    Wobei: Das erste Problem könnte man mit _ArrayDelete($array, 0) lösen.

  • Variable im Unterskript (2. Skript mit Runas) verwenden

    • Oscar
    • 2. Juli 2015 um 05:24

    Er startet das Programm doch sowieso per Run. Da ist die Parameterübergabe (wie Christoph54 bereits geschrieben hat) eindeutig die bessere Wahl.
    Wozu dann extra noch in die Registry schreiben/lesen?

  • Link Teilung?

    • Oscar
    • 2. Juli 2015 um 05:19

    Das sehe ich genauso. :)

  • Benutzte Datei trotzdem öffnen

    • Oscar
    • 1. Juli 2015 um 18:51

    Ich habe das mal getestet.
    Eine Datei, die nicht im Shared-Modus geöffnet ist, lässt sich auch nicht in Notepad(++) öffnen.
    Oder andersherum: wenn sie im Shared-Modus geöffnet ist, dann funktioniert auch FileOpen.
    Hier mal das Testscript:

    AutoIt
    #include <WinAPI.au3>
    #include <WinAPIFiles.au3>
    
    
    Local $sFile = @ScriptDir & '\test.txt'
    Local $hFile = _WinAPI_CreateFile($sFile, 3, 2, 0) ; 3 = Datei öffnen (wenn nicht vorhanden, erstellen), 2 = Lesezugriff, 0 = kein Shared-Modus
    
    
    ConsoleWrite('"' & $sFile & '" in use: ' & (_WinAPI_FileInUse($sFile) = 1) & @CRLF)
    
    
    Local $hFile2 = FileOpen($sFile, 0)
    If $hFile2 = -1 Then
    	ConsoleWrite('"' & $sFile & '" konnte nicht geöffnet werden.' & @CR)
    Else
    	ConsoleWrite('"' & $sFile & '" konnte geöffnet werden. Handle: ' & $hFile2 & @CR)
    EndIf
    FileClose($hFile2)
    
    
    MsgBox(0, 'Test', 'Diese MsgBox offen lassen und versuchen die Datei in Notepad(++) zu öffnen...')
    
    
    _WinAPI_CloseHandle($hFile)
    ConsoleWrite('"' & $sFile & '" in use: ' & (_WinAPI_FileInUse($sFile) = 1) & @CRLF)
    Alles anzeigen
  • Benutzte Datei trotzdem öffnen

    • Oscar
    • 1. Juli 2015 um 15:15

    Ich hab's nicht ausprobiert, aber evtl. vorher FileCopy und dann die Kopie öffnen?

  • Funktionen zum schreiben und lesen von 1D Arrays auf Festplatte

    • Oscar
    • 29. Juni 2015 um 17:28

    Nunja, nachdem ich mich mehr mit den DllStruct-Funktionen beschäftigen wollte, habe ich mal zwei Funktionen zum lesen/schreiben von Arrays auf Festplatte erstellt.
    Der Vorteil ist, dass man damit ohne Trennzeichen auskommt. Im Array dürfen also alle 256 ASCII-Zeichen (0...255) vorkommen.
    Vielleicht können mal die Profis in Sachen Dll-Struct über das Script schauen, ob man da noch was verbessern kann. Im Moment dauert das laden länger als das speichern der Daten. X/
    Ich bin schon froh, dass ich das soweit zum laufen bekommen habe. Nachdem ich einige Zeit gebraucht habe, zu merken, dass "_WinAPI_WriteFile" die Daten immer auf DWORD-Länge "aufrundet".

    AutoIt
    #include <Array.au3>
    #include <File.au3>
    #include <FileConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPIError.au3>
    
    
    Global $sPath = StringRegExpReplace(@AutoItExe, '(.+\\).+', '$1')
    Global $array = _FileListToArrayRec($sPath, '*', $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH)
    _ArrayDisplay($array, 'Dieses Array wird gespeichert')
    
    
    $iTimer = TimerInit()
    Global $sfile = @ScriptDir & '\test.bin'
    _ArraySave($array, $sfile)
    ConsoleWrite('Error: ' & @error & '   Time: ' & TimerDiff($iTimer) & @CR)
    
    
    $iTimer = TimerInit()
    Global $aNew = _ArrayLoad($sfile)
    ConsoleWrite('Error: ' & @error & '   Time: ' & TimerDiff($iTimer) & @CR)
    _ArrayDisplay($aNew, 'Geladenes Array')
    Exit
    
    
    Func _ArraySave(ByRef $avArray, $sSavefile)
    	If Not IsArray($avArray) Then Return SetError(1, 0, False)
    	Local $nBytes, $iLen = 0, $iError = 0, $tHEADER, $tDATA, $iArrayCount = UBound($avArray)
    	Local $hFile = _WinAPI_CreateFile($sSavefile, 1, 4) ; 1 = Create a new file (overwrite), 4 = Write-Mode
    	If $hFile = 0 Then Return SetError(2, 0, False)
    	$tHEADER = DllStructCreate('struct;char Type[8];uint Cnt;endstruct')
    	DllStructSetData($tHEADER, 'Type', 'Au3Array')
    	DllStructSetData($tHEADER, 'Cnt', $iArrayCount)
    	If _WinAPI_WriteFile($hFile, DllStructGetPtr($tHEADER), DllStructGetSize($tHEADER), $nBytes) Then
    		For $i = 0 To $iArrayCount - 1
    			$iLen = StringLen($avArray[$i])
    			$tDATA = DllStructCreate('struct;uint Size;char Data[' & $iLen & '];endstruct')
    			DllStructSetData($tDATA, 'Size', $iLen)
    			DllStructSetData($tDATA, 'Data', $avArray[$i])
    			If Not _WinAPI_WriteFile($hFile, DllStructGetPtr($tDATA), DllStructGetSize($tDATA), $nBytes) Then
    				$iError = _WinAPI_GetLastError()
    				$tDATA = 0
    				ExitLoop
    			EndIf
    			$tDATA = 0
    		Next
    	Else
    		$iError = _WinAPI_GetLastError()
    	EndIf
    	$tHEADER = 0
    	_WinAPI_CloseHandle($hFile)
    	Return SetError($iError, 0, $iError = 0)
    EndFunc
    
    
    Func _ArrayLoad($sLoadfile)
    	Local $hFile, $tHEADER, $nBytes, $sType, $iArrayCount, $iError = 0, $iSize, $tDATA
    	$hFile = _WinAPI_CreateFile($sLoadfile, 2, 2) ; 2 = FileOpen, 2 = Read-Mode
    	If $hFile = 0 Then Return SetError(1, 0, False)
    	$tHEADER = DllStructCreate('struct;char Type[8];uint Cnt;endstruct')
    	_WinAPI_ReadFile($hFile, DllStructGetPtr($tHEADER), DllStructGetSize($tHEADER), $nBytes)
    	$sType = DllStructGetData($tHEADER, 'Type')
    	If $sType = 'Au3Array' Then
    		$iArrayCount = DllStructGetData($tHEADER, 'Cnt')
    		Local $avArray[$iArrayCount]
    		Local $tSIZE = DllStructCreate('struct;uint Size;endstruct')
    		For $i = 0 To $iArrayCount - 1
    			If Not _WinAPI_ReadFile($hFile, DllStructGetPtr($tSIZE), DllStructGetSize($tSIZE), $nBytes) Then
    				$iError = _WinAPI_GetLastError()
    				ExitLoop
    			EndIf
    			$iSize = DllStructGetData($tSIZE, 'Size')
    			If Mod($iSize, 4) Then ; 1...3 Füllbytes wegen DWORD-Länge der Einträge
    				$tDATA = DllStructCreate('struct;char Data[' & $iSize & '];byte[' & 4 - Mod($iSize, 4) & '];endstruct')
    			Else
    				$tDATA = DllStructCreate('struct;char Data[' & $iSize & '];endstruct')
    			EndIf
    			If Not _WinAPI_ReadFile($hFile, DllStructGetPtr($tDATA), DllStructGetSize($tDATA), $nBytes) Then
    				$iError = _WinAPI_GetLastError()
    				$tDATA = 0
    				ExitLoop
    			EndIf
    			$avArray[$i] = DllStructGetData($tDATA, 'Data')
    			$tDATA = 0
    		Next
    	EndIf
    	_WinAPI_CloseHandle($hFile)
    	$tSIZE = 0
    	$tHEADER = 0
    	If $iError Then Return SetError($iError, 0, False)
    	Return $avArray
    EndFunc
    Alles anzeigen
  • FTP Verbindung herstellen

    • Oscar
    • 28. Juni 2015 um 16:28

    Hast Du mal versucht den Connect mehrfach hintereinander aufzurufen (mit TimeOut auf 60s)?

    AutoIt
    #include <FTPEx.au3>
    
    
    _example1()
    #cs
    	Beispiel mit externem Progressfenster zur Demostration der Fortschrittsanzeige mit einer Benutzerfunktion
    #ce
    Func _example1()
    	Local $s_ServerName = "192.168.X.XXX" ;das ist ein real existierender Server
    	Local $s_Username = "Name"
    	Local $s_Password = "Passwort"
    	Local $i_Passive = 1 ;aktive Verbindung nutzen wenn bei anderen Server Probleme dann auch mit 1 für passive Verbung testen
    	Local $l_InternetSession, $l_FTPSession
    	Local $errOpen, $errFTP
    	If FileExists(@TempDir & "\Drucken.txt") Then FileDelete(@TempDir & "\Drucken.txt") ;Nur um sicher zustellen dass das File nicht existiert
    	MsgBox(0, "Test1", "ErsteBox")
    	$l_InternetSession = _FTP_Open("myFTP") ;Öffnet eine FTP Sitzung
    	$errOpen = @error
    	MsgBox(0, "Test2", "ZweiteBox" & $errOpen)
    	If Not @error Then
    		MsgBox(0, "Test3", "DritteBox")
    		Local $iTimer = TimerInit()
    		Do
    			$l_FTPSession = _FTP_Connect($l_InternetSession, $s_ServerName, $s_Username, $s_Password, $i_Passive) ;Verbindet zu einem FTP Server
    			$errFTP = @error
    			If $errFTP Then ConsoleWrite('Zeit: ' & TimerDiff($iTimer) & '   Fehler: ' & $errFTP & @CR)
    		Until $errFTP = 0 Or TimerDiff($iTimer) > 60000
    		If Not $errFTP Then
    			MsgBox(0, "Test5", "FünfteBox")
    			ProgressOn("Download", "Status:", "")
    			_FTP_ProgressDownload($l_FTPSession, @ScriptDir & "Drucken.txt", "\var\usbstick\Drucken.txt", "_UpdateProgress")
    			If @error Then ConsoleWrite("Fehler bei _FTP_ProgressDownload: " & @error)
    			ProgressOff()
    		Else
    			MsgBox(0, "Test4", "VierteBox")
    			MsgBox(0, "Connect", "fehlgeschlagen")
    			ConsoleWrite("Connect: " & " " & $errFTP & @CRLF)
    		EndIf
    	Else
    		MsgBox(0, "Open", "fehlgeschlagen")
    		ConsoleWrite("Open " & " " & $errOpen & @CRLF)
    	EndIf
    	_FTP_Close($l_FTPSession)
    	_FTP_Close($l_InternetSession)
    EndFunc   ;==>_example1
    
    
    Func _UpdateProgress($Prozent)
    	ProgressSet($Prozent, $Prozent & "%")
    	If _IsPressed("77") Then Return 0 ; Abbruch bei F8
    	Return 1 ; bei 1 Fortsetzen
    EndFunc   ;==>_UpdateProgress
    Alles anzeigen
  • HTTP Direktzugriff über AutoI3 oder DLL aber ohne IE / Internet Explorer

    • Oscar
    • 28. Juni 2015 um 07:58

    Da solltest Du erstmal weitere Informationen liefern:
    - welcher Router?
    - auf welchen Port horcht der Router?
    - welche Befehle unterstützt er?

  • _ColorSetRGB

    • Oscar
    • 26. Juni 2015 um 19:00

    Für das konvertieren RGB <-> BGR gibt es bereits eine Funktion in der WinAPI-UDF: "_WinAPI_SwitchColor"

  • Func Namen aufzulisten

    • Oscar
    • 25. Juni 2015 um 14:31

    AspirinJunkie: Dein Pattern funktioniert bei mir nicht. :huh:
    Aber so genau muss man doch sowieso nicht prüfen, weil der Syntax-Check von AutoIt doch vorher Alarm schlägt. ;)

  • Start- / Endadresse Skript im Speicher finden

    • Oscar
    • 25. Juni 2015 um 14:09

    Selbstmodifizierender Code?
    Ich sehe dafür keinen vernünftigen Grund (außer bei Viren oder ähnlichen Programmen).
    Bitte genauer erklären, ansonsten wird das Thema geschlossen!

  • Func Namen aufzulisten

    • Oscar
    • 25. Juni 2015 um 14:04

    Ja, es gibt die Möglichkeit, dass das Script die eigenen Funktionsnamen ausliest.
    Wenn das auch mit der compilierten Exe funktionieren soll, ist es aber erforderlich, dass beim Compilieren unter "Resource Update" der Haken bei "Save a copy of the Scriptsource in the output program resources" gesetzt wird.

    Mit diesen Zeilen kannst Du dann innerhalb des Scripts die Funktionsnamen auslesen:

    AutoIt
    Global $sScript = FileRead(@ScriptFullPath)
    Global $aFunc = StringRegExp($sScript, '(?i)(?s)\bfunc (.+?)\(', 3)
    _ArrayDisplay($aFunc)
  • ClipboardMemo

    • Oscar
    • 24. Juni 2015 um 14:57

    Erstaunlicherweise funktioniert das Script noch (ohne Änderung).
    Hab's mal neu hochgeladen (Post#1).

  • Skript das auf einem FTP Server einen Ordner anlegt und Daten speichert

    • Oscar
    • 20. Juni 2015 um 16:50

    Oh stimmt! In der deutschen Hilfe sind mehr Beispielscripte. :)
    Ich benutzte eigentlich nur die englische Hilfe, wegen der Aktualität.

  • _CreateHBitmapArrayFromIconfile

    • Oscar
    • 20. Juni 2015 um 16:35

    Es war noch ein update nötig!
    Bisher wurden halbtransparente Icons falsch angezeigt. Das ist mit dieser Version jetzt behoben (siehe Post#1).

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™