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

  • Probleme beim Script für ein Lexware Backup

    • Oscar
    • 29. September 2015 um 18:13
    Zitat von WebBuddha

    "I:\XXX\_BACKUP\_LEXWARE\%DATE%_Backup.zip"

    AutoIt kann standardmäßig mit so einem Pfad gar nichts anfangen.
    Zunächst mal muss Opt('ExpandEnvStrings', 1) gesetzt sein, damit AutoIt Environment Variablen überhaupt innerhalb eines String umwandelt, und zum anderen muss %DATE% eine entsprechend gültige Environment Variable sein.

  • GUICtrlSetOnEvent reagiert in in der zeiten GUI. Warum?

    • Oscar
    • 24. September 2015 um 19:20

    Entschuldige, aber das ist Quatsch!
    GUIGetMsg regelt die Prozessorlast automatisch.
    Nur im OnEventMode wird in der Endlosschleife ein Sleep benötigt, weil sonst die Prozessorlast am Anschlag ist.

    Wenn Du mir nicht glaubst, hier ist ein Testprogramm:

    AutoIt
    Global $hGui = GUICreate('Test', 480, 240)
    GUICtrlCreateLabel('Schleifendurchläufe/s:', 10, 10, 280, 20)
    Global $idCounter = GUICtrlCreateLabel('', 10, 30, 80, 20)
    GUISetState()
    Global $iTimer = TimerInit(), $iCount = 0
    Do
    	$iCount += 1
    	If TimerDiff($iTimer) > 1000 Then
    		GUICtrlSetData($idCounter, $iCount)
    		$iCount = 0
    		$iTimer = TimerInit()
    	EndIf
    Until GUIGetMsg() = -3
    Alles anzeigen

    Wenn Du die Maus bewegst bzw. auf der Tastatur tippst, werden mehr Schleifendurchläufe vorgenommen. Bleibt die Maus still stehen und tippst Du nichts auf der Tastatur, dann werden automatisch die Schleifendurchläufe reduziert.
    Ein zusätzliches Sleep kann durchaus zum nicht reagieren der GUI führen, weil während des Sleeps GUIGetMsg nicht ausgeführt wird.

  • GUICtrlSetOnEvent reagiert in in der zeiten GUI. Warum?

    • Oscar
    • 24. September 2015 um 17:57

    Die ganzen zusätzlichen GUISetOnEvent und GUICtrlSetOnEvent in der Funktion sind gar nicht nötig.
    Und das Sleep in der MsgLoop-Schleife muss raus, weil GUIGetMsg die Ausführungsgeschwindigkeit automatisch regelt und ein zusätzliches Sleep, die Reaktionsfähigkeit der GUI behindert.

    Ich würde das so machen:

    AutoIt
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    
    
    Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    
    
    Global $gui1 = GUICreate("GUI 1", 400, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    Global $okbutton1 = GUICtrlCreateButton("GUI 2", 270, 50, 60)
    GUICtrlSetOnEvent($okbutton1, "OKButton1")
    GUISetState(@SW_SHOW, $gui1)
    While Sleep(1000)
    WEnd
    
    
    Func zweitegui()
    	Opt("GUIOnEventMode", 0) ; Wechsle in den MsgLoop-Modus
    	Local $gui2 = GUICreate("GUI 2", 300, 150)
    	Local $okbutton2 = GUICtrlCreateButton("OK2", 20, 50, 60)
    	GUISetState(@SW_SHOW, $gui2)
    	Local $aMsg
    	While True
    		$aMsg = GUIGetMsg(True)
    		Switch $aMsg[0]
    			Case $okbutton2
    				MsgBox(0, "MsgLoop", "Du hast auf OK2 geklickt!")
    				ExitLoop
    			Case $GUI_EVENT_CLOSE
    				If $aMsg[1] = $gui2 Then ExitLoop
    		EndSwitch
    	WEnd
    	GUIDelete($gui2)
    	Opt("GUIOnEventMode", 1) ; Wechsle in den OnEvent Modus
    EndFunc   ;==>zweitegui
    
    
    Func OKButton1()
    	zweitegui()
    EndFunc   ;==>OKButton1
    
    
    Func CLOSEClicked()
    	MsgBox(0, "GUI Event", "Du hast auf CLOSE geklickt! Programm wird beendet...")
    	Exit
    EndFunc   ;==>CLOSEClicked
    Alles anzeigen
  • Überprüfen ob GUICTRL aktiv ist

    • Oscar
    • 22. September 2015 um 18:14

    Dann will ich hier mal meine Lösung posten:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    
    
    $Form1 = GUICreate("TESTFENSTER", 234, 100, 237, 163)
    $Input1 = GUICtrlCreateInput("", 40, 24, 161, 21)
    $Input2 = GUICtrlCreateInput("", 40, 64, 161, 21)
    $Dummy = GUICtrlCreateDummy()
    GUISetState(@SW_SHOW)
    Global $aAccelKeys[1][2] = [["{ENTER}", $Dummy]]
    GUISetAccelerators($aAccelKeys)
    While 1
    	$nMsg = GUIGetMsg()
    	Switch $nMsg
    		Case $GUI_EVENT_CLOSE
    			Exit
    		Case $Dummy
    			_InputEvent()
    	EndSwitch
    WEnd
    
    
    Func _InputEvent()
    	Local $hWnd = _WinAPI_GetFocus()
    	Switch _WinAPI_GetDlgCtrlID($hWnd)
    		Case $Input1
    			MsgBox(0, 'Input1', GUICtrlRead($Input1))
    		Case $Input2
    			MsgBox(0, 'Input2', GUICtrlRead($Input2))
    	EndSwitch
    EndFunc
    Alles anzeigen
  • WaWi in AutoIt - Projekt für AutoIt / SQLite zu groß?

    • Oscar
    • 21. September 2015 um 05:25

    Bei SQLite kenne ich mich nicht aus, aber mit so vielen Einträgen bei ListViews hatte ich es auch schon zu tun.
    Deswegen: Bei 10.000 Einträgen auf keinen Fall die ListView-Einträge einzeln hinzufügen, sondern ein 2D-Array erstellen und dann mit _GUICtrlListView_AddArray die Einträge erstellen.
    Das geht um ein Vielfaches schneller.

  • Automatische Laufwerkserkennung

    • Oscar
    • 17. September 2015 um 20:14

    In der WinAPI-UDF gibt es ja mittlerweile auch "_WinAPI_ShellChangeNotifyRegister", womit auf Veränderungen reagiert werden kann, aber das funktioniert nur mit Laufwerken, die den Status "READY" haben.
    Versucht man dort den Laufwerksbuchstaben eines Cardreaders ohne eingesteckte Karte zu registrieren, schlägt die Funktion fehl.

    Man könnte natürlich in regelmäßigen Abständen den DriveStatus aller Laufwerke überprüfen, aber das ist ja eben nicht erwünscht. :huh:

  • Automatische Laufwerkserkennung

    • Oscar
    • 17. September 2015 um 18:03

    Das Problem ist ja, dass bereits den einzelnen Slots des Cardreaders ein Laufwerksbuchstabe zugewiesen wird.
    Für Windows sind das 1, 2, 3 oder 4 Laufwerke (je nach Cardreader). Das einstecken der SD-Karte wird dann gar nicht mehr als Laufwerkswechsel erkannt.
    Wie man jetzt (ohne ständig den Laufwerkstyp abzufragen) trotzdem eine Nachricht von Windows bekommen kann, entzieht sich meiner Kenntnis.

  • Was mache ich falsch ?

    • Oscar
    • 15. September 2015 um 17:05

    [verschoben nach "Hilfe & Unterstützung"]

  • Was mache ich falsch ?

    • Oscar
    • 15. September 2015 um 16:39

    Und nun lernst Du noch, wie man Arrays benutzt und sparst weitere 60 Zeilen ein. ;)

  • _GUICtrlEdit_SetSel - Makierung nicht sichtbar ohne winfocus

    • Oscar
    • 15. September 2015 um 16:36

    Einfach den Stil $ES_NOHIDESEL hinzufügen:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiStatusBar.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    Example()
    
    
    Func Example()
    	Local $hStatusBar, $idEdit, $hGUI
    	Local $sWow64 = ""
    	If @AutoItX64 Then $sWow64 = "\Wow6432Node"
    	Local $sFile = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE" & $sWow64 & "\AutoIt v3\AutoIt", "InstallDir") & "\include\_ReadMe_.txt"
    	Local $aPartRightSide[3] = [190, 378, -1], $aSel
    
    
    	; Create GUI
    	$hGUI = GUICreate("Edit Set Sel", 400, 300)
    	$idEdit = GUICtrlCreateEdit("", 2, 2, 394, 268, BitOR($ES_WANTRETURN, $WS_VSCROLL, $ES_NOHIDESEL))
    	$hStatusBar = _GUICtrlStatusBar_Create($hGUI, $aPartRightSide)
    	_GUICtrlStatusBar_SetIcon($hStatusBar, 2, 97, "shell32.dll")
    	GUISetState(@SW_SHOW)
    
    
    	; Set Margins
    	_GUICtrlEdit_SetMargins($idEdit, BitOR($EC_LEFTMARGIN, $EC_RIGHTMARGIN), 10, 10)
    
    
    	; Set Text
    	$data = ""
    	For $i = 10 To 50
    		$data &= $i & ": 12345" & @CRLF
    	Next
    	_GUICtrlEdit_SetText($idEdit, $data)
    
    
    	$i_size = 0
    	For $i = 10 To 50
    		$i_size += 11
    		_GUICtrlEdit_LineScroll($idEdit, 1, 1)
    		_GUICtrlEdit_SetSel($idEdit, $i_size, $i_size + 10)
    		Sleep(500)
    	Next
    
    
    
    
    	; Get Sel
    	$aSel = _GUICtrlEdit_GetSel($idEdit)
    	_GUICtrlStatusBar_SetText($hStatusBar, "Start: " & $aSel[0])
    	_GUICtrlStatusBar_SetText($hStatusBar, "End: " & $aSel[1], 1)
    
    
    	; Loop until the user exits.
    	Do
    	Until GUIGetMsg() = $GUI_EVENT_CLOSE
    	GUIDelete()
    EndFunc   ;==>Example
    Alles anzeigen
  • AD GetUserGroups

    • Oscar
    • 14. September 2015 um 17:26

    Nein, mein Script funktioniert dann so nicht.
    Der RegExp liest auch nur bis zum nächsten Komma, weil ich keine Ahnung habe, was da als Rückgabe alles möglich ist. Ich kenne mich mit Active Directory nicht aus.

    Wenn im ListView aber sowieso nur wenige (< 20) Einträge stehen werden, dann kann man sich das mit "_GUICtrlListView_AddArray" auch schenken und gleich "GUICtrlCreateListViewItem" nehmen.
    Einen merklichen Geschwindigkeitsgewinn bekommt man bei "_GUICtrlListView_AddArray" eigentlich erst wenn im ListView viele Einträge (Items/SubItems) erstellt werden sollen.

  • AD GetUserGroups

    • Oscar
    • 14. September 2015 um 17:13

    Wie ich oben schon schrieb, musste ich spekulieren, was Dein ListView und die Array-Rückgabe angeht.
    Hättest Du Dein Script gepostet und mehr Infos geliefert, dann hättest Du schon längst das richtige Ergebnis. :whistling:

    Wenn Du nur den einen Wert brauchst, dann reicht ja auch eine Spalte im Listview.
    Demzufolge müsste das dann eher so aussehen:

    AutoIt
    #include <Array.au3>
    #include <GuiListView.au3>
    
    
    GUICreate('Test', 400, 300)
    $idListview = GUICtrlCreateListView('Gruppe', 10, 10, 380, 250)
    GUISetState(@SW_SHOW)
    
    
    Global $aADGroup = ['CN=asdf,OU=Wert,OU=Wert,DC=Wert,DC=Wert', 'CN=jklö,OU=Wert,OU=Wert,DC=Wert,DC=Wert', 'CN=yxcv,OU=Wert,OU=Wert,DC=Wert,DC=Wert'] ; <- als Beispiel für die Rückgabe von _AD_GetUserGroup()
    ;~ _ArrayDisplay($aADGroup)
    
    
    Global $aListView[UBound($aADGroup)][1] ; <- ein entsprechend großes 2D-Array erstellen
    
    
    For $i = 0 To UBound($aADGroup) - 1 ; alle Einträge aus dem AD-Array durchlaufen
    	$aListView[$i][0] = StringRegExpReplace($aADGroup[$i], 'CN=(.+?),.+', '$1') ; Gruppe als Item eintragen
    Next
    
    
    _GUICtrlListView_AddArray($idListview, $aListView)
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen
  • AD GetUserGroups

    • Oscar
    • 12. September 2015 um 19:28

    Naja, ich kenne Dein ListView nicht und weiß nicht, was Du als Array zurückbekommst, deswegen muss ich etwas spekulieren, aber ich denke das müsste dann so aussehen:

    AutoIt
    #include <Array.au3>
    #include <GuiListView.au3>
    
    
    GUICreate('Test', 400, 300)
    $idListview = GUICtrlCreateListView('Gruppe|SubItem1|SubItem2', 10, 10, 380, 250)
    GUISetState(@SW_SHOW)
    
    
    Global $aADGroup = ['1.Gruppe', '2.Gruppe', '3.Gruppe'] ; <- als Beispiel für die Rückgabe von _AD_GetUserGroup()
    ;~ _ArrayDisplay($aADGroup)
    
    
    Global $aListView[UBound($aADGroup)][3] ; <- ein entsprechend großes 2D-Array erstellen
    
    
    For $i = 0 To UBound($aADGroup) - 1 ; alle Einträge aus dem AD-Array durchlaufen
    	$aListView[$i][0] = $aADGroup[$i] ; Gruppe als Item eintragen
    	$aListView[$i][1] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    	$aListView[$i][2] = '' ; <- hier kannst Du noch Einträge für die SubItems vornehmen
    Next
    
    
    _GUICtrlListView_AddArray($idListview, $aListView)
    Do
    Until GUIGetMsg() = -3
    Alles anzeigen
  • Dateiüberwachung an ein anderes Programm übergeben

    • Oscar
    • 12. September 2015 um 11:33

    Nicht nur im engl. Forum!
    Auch hier bei uns gibt es einiges dazu. Das Beispiel zu NamedPipes von m-obi halt ich für sehr gut: Interprozesskommunikation

  • AD GetUserGroups

    • Oscar
    • 12. September 2015 um 09:39

    Oder Du generierst Dir aus der Array-Rückgabe ein 2D-Array mit den entsprechenden Daten und benutzt dann _GUICtrlListView_AddArray.

  • Code optimieren

    • Oscar
    • 9. September 2015 um 18:14

    Das war doch auch nur als Beispiel gedacht, wie er die vielen StringReplace-Zeilen reduzieren kann.
    Ich denke, dass er die eigentlichen Daten schon aus einer Datei liest (siehe: "Ich les einen String in eine Variable..." im Post#1).

  • Code optimieren

    • Oscar
    • 9. September 2015 um 14:36

    Hier mal ein Beispiel für ein ersetzen mit einem 2D-Array:

    AutoIt
    Global $sText = 'bla bla MON bla feeiji rtht INTERNATIONAL_ECONOMY(4) rgrrere EUROPE_FIRST_INTERNATIONAL_PRIORITY(null)' & @CRLF
    $sText &= 'bla PRIORITY_OVERNIGHT(1) ttre WED fee FRI eeerrgt INTERNATIONAL_PRIORITY_DISTRIBUTION(null)' & @CRLF
    
    
    Global $aReplace[11][2] = [ _
    		['INTERNATIONAL_ECONOMY(4)', 'International Economy'], _
    		['INTERNATIONAL_PRIORITY(1)', 'International Priority'], _
    		['INTERNATIONAL_PRIORITY_FIRST(6)', 'International Priority First'], _
    		['EUROPE_FIRST_INTERNATIONAL_PRIORITY(null)', 'International Europe First'], _
    		['PRIORITY_OVERNIGHT(1)', 'Priority Overnight'], _
    		['INTERNATIONAL_PRIORITY_DISTRIBUTION(null)', 'International Priority Distribution'], _
    		['MON ', ''], _
    		['TUE ', ''], _
    		['WED ', ''], _
    		['THU ', ''], _
    		['FRI ', '']]
    
    
    For $i = 0 To UBound($aReplace, 1) - 1
    	$sText = StringReplace($sText, $aReplace[$i][0], $aReplace[$i][1], 0, 1)
    Next
    
    
    MsgBox(0, 'Test', $sText)
    Alles anzeigen
  • Dateien umbenennen

    • Oscar
    • 9. September 2015 um 14:21

    Yaerox: Was soll das für ein Script sein?
    If $i <> 0 Then... das tritt in Deinem Script nie ein.
    $counter++ ist keine gültige AutoIt-Syntax.


    @jmewald: versuch's mal hiermit:

    AutoIt
    #include <Array.au3>
    #include <File.au3>
    
    
    Global $sSourcePath = @ScriptDir ; <- Quellverzeichnis (evtl. anpassen)
    If StringRight($sSourcePath, 1) <> '\' Then $sSourcePath &= '\'
    
    
    Global $sDestPath = @ScriptDir ; <- Zielverzeichnis (evtl. anpassen)
    If StringRight($sDestPath, 1) <> '\' Then $sDestPath &= '\'
    
    
    Global $aFiles = _FileListToArray($sSourcePath, '*.jpg', $FLTA_FILES, False)
    If @error Or $aFiles[0] = 0 Then Exit MsgBox(0, 'Fehler', 'Keine JPG-Dateien im Verzeichnis!')
    
    
    _ArrayDisplay($aFiles)
    
    
    Global $sDestFile = ''
    For $i = 1 To $aFiles[0]
    	$sDestFile = StringLeft($aFiles[$i], 5) & '.jpg'
    	$sDestFile = $sDestPath & $sDestFile
    	$sDestFile = _GetUniqueFileName($sDestFile)
    	If Not @error Then FileMove($sSourcePath & $aFiles[$i], $sDestFile)
    Next
    
    
    ;===============================================================================
    ; Function Name:   _GetUniqueFileName($sPath)
    ; Description::    Wenn der Dateiname bereits existiert wird ein Zähler
    ;                  in Form von: "_(1)" an den Dateinamen angehängt.
    ; Parameter(s):    $sPath = kompletter Pfad der Datei
    ; Requirement(s):  -
    ; Return Value(s): bei Erfolg = der (neue) Dateiname
    ;                  bei Fehler wird @error = 1 (Pfad falsch angegeben)
    ; Author(s):       Oscar (www.autoit.de)
    ;===============================================================================
    Func _GetUniqueFileName($sPath)
    	Local $aPath, $sNumber = '', $iCount = 0
    	$aPath = StringRegExp($sPath, '(.+\\)(.+?)(?:_\(\d*\))*(\..+)', 3)
    	If @error Then Return SetError(1, 0, 0)
    	While FileExists($aPath[0] & $aPath[1] & $sNumber & $aPath[2])
    		$iCount += 1
    		$sNumber = '_(' & $iCount & ')'
    	WEnd
    	Return $aPath[0] & $aPath[1] & $sNumber & $aPath[2]
    EndFunc   ;==>_GetUniqueFileName
    Alles anzeigen
  • GUICtrlSetOnEvent auf _GUICtrlListView_AddArray

    • Oscar
    • 9. September 2015 um 05:23

    Ja, bei _GUICtrlListView_AddArray funktioniert nur WM_NOTIFY, weil Du dort nicht die Ctrl-IDs der einzelnen Items zurück bekommst.
    GuiCtrlSetOnEvent mit der Ctrl-ID der ListView reagiert immer nur auf die Header-Einträge.

  • AHV AutoIt-Hex-Viewer

    • Oscar
    • 5. September 2015 um 12:53

    Danke, aber es soll eigentlich nur als kleiner Viewer für den FileCommander dienen, wenn kein richtiger Hex-Editor installiert ist.
    Für alle, die einen IMHO sehr guten und noch dazu kostenlosen Hex-Editor brauchen: "HXD" -> http://mh-nexus.de/de/hxd/

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™