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

  • Kalender-/Datumsfunktionen verwenden

    • Oscar
    • 5. August 2016 um 15:11

    Das Beispiel von autoBert funktioniert bei mir einwandfrei. Welche AutoIt-Version benutzt Du?

    Ich würde (wegen der Optik und damit der Benutzer nichts falsches eintragen kann) das noch etwas abändern:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <Date.au3>
    #include <GuiComboBox.au3>
    
    
    Global $hGui, $iJahr, $iMonat
    
    
    _Example()
    Func _Example()
    	$hGui = GUICreate("Kalender Test", 180, 180)
    	Local $idCboJahr = GUICtrlCreateCombo('', 5, 5, 100, 20, $CBS_DROPDOWNLIST)
    	Local $idCboMonat = GUICtrlCreateCombo('', 5, 30, 100, 20, $CBS_DROPDOWNLIST)
    	Local $idCboTag = GUICtrlCreateCombo('', 5, 55, 100, 20, $CBS_DROPDOWNLIST)
    	Local $idBtnOK = GUICtrlCreateButton("&OK", 5, 150, 170, 25)
    	_InitJahr($idCboJahr)
    	_InitMonat($idCboMonat)
    	_InitTag($idCboTag)
    	GUISetState(@SW_SHOW)
    
    
    	While 1
    		$nMsg = GUIGetMsg()
    		Switch $nMsg
    			Case $GUI_EVENT_CLOSE
    				Exit
    			Case $idCboJahr, $idCboMonat
    				$iJahr = GUICtrlRead($idCboJahr)
    				$iMonat = _GUICtrlComboBox_GetCurSel($idCboMonat) + 1
    				_InitTag($idCboTag)
    		EndSwitch
    	WEnd
    EndFunc   ;==>_Example
    
    
    Func _InitJahr($iID)
    	For $i = @YEAR - 2 To @YEAR + 5
    		If $i = @YEAR Then
    			GUICtrlSetData($iID, $i, $i)
    		Else
    			GUICtrlSetData($iID, $i)
    		EndIf
    	Next
    	$iJahr = @YEAR
    EndFunc   ;==>_InitJahr
    
    
    Func _InitMonat($iID)
    	For $i = 1 To 12
    		$sMon = _DateToMonth($i, 2)
    		If $i = @MON Then
    			GUICtrlSetData($iID, $sMon, $sMon)
    		Else
    			GUICtrlSetData($iID, $sMon)
    		EndIf
    	Next
    	$iMonat = @MON
    EndFunc   ;==>_InitMonat
    
    
    Func _InitTag($iID)
    	GUICtrlSetData($iID, "", "")
    	$iTage = _DateDaysInMonth($iJahr, $iMonat)
    	For $i = 1 To $iTage
    		If _DateToDayOfWeek($iJahr, $iMonat, $i) <> 1 Then _
    				GUICtrlSetData($iID, ($i < 10 ? '0' : '') & $i); & '.' & $iMonat & '.' & $iJahr)
    	Next
    EndFunc   ;==>_InitTag
    Alles anzeigen
  • If not Fileexists Then

    • Oscar
    • 1. August 2016 um 20:41

    Das ist wieder eine typische X-Y-Situation.
    Es werden Vorschläge und "Lösungen" zu "X" gepostet, obwohl das eigentliche Problem "Y" nicht bekannt ist.
    Die "Lösung" muss zwangsläufig zu Fehlern führen, weil evtl. mehrere Programme "gleichzeitig" die Datei erstellen und das Script ohne Überprüfung sofort die Schleife verlässt.
    Um aber eine vernünftige Lösung zu präsentieren, ist es notwendig das eigentliche Problem zu kennen: "Warum dürfen nicht mehrere Instanzen gleichzeitig arbeiten?"

  • If not Fileexists Then

    • Oscar
    • 1. August 2016 um 05:18

    Was willst Du denn eigentlich erreichen? Warum dürfen nicht zwei Programme gleichzeitig arbeiten?

  • Download Link ermitteln und Datei dowloaden

    • Oscar
    • 28. Juli 2016 um 18:26

    Hier mal als Script:

    AutoIt
    #include <Array.au3>
    #include <InetConstants.au3>
    
    
    $sURL = 'http://download.nai.com/products/datfiles/V3DAT'
    $sIndexHTML = InetRead($sURL, $INET_FORCERELOAD)
    If $sIndexHTML = "" Then Exit MsgBox(0, 'Fehler', 'Der Download der Seite hat nicht funktioniert!')
    $sIndexHTML = BinaryToString($sIndexHTML)
    $aV3files = StringRegExp($sIndexHTML, '<A HREF="v3dat/.+\.exe">(v3_.+dat.exe)</A>', 3)
    _ArraySort($aV3files, 1)
    ;~ _ArrayDisplay($aV3files)
    ConsoleWrite('Download-Link: "' & $sURL & '/' & $aV3files[0] & '"' & @CR)
    Alles anzeigen
  • 465000 JPGs in einem einzigen Ordner ...

    • Oscar
    • 27. Juli 2016 um 15:55
    Zitat von Code-Jack

    Ist zwar relaiv unnötig, schließlich kann Windows auch nach Aufnahmedatum sortieren, wenn man es entsprechend konfiguriert, aber mit einem Dateinamen nach deinem Vorschlag muss dazu nichts konfiguriert werden, das macht die Sache für 'nen DAU komfortabler.

    Das hat auch noch andere Vorteile, wenn im Dateinamen gleich das Aufnahmedatum steht: beim anzeigen (z.B. mit IrfanView) sieht man gleich das Aufnahmedatum in der Titelzeile und muss nicht erst die EXIF-Daten aufrufen.

    Zitat von Code-Jack

    Daher ja mein ursprünglicher Wunsch, zunächst nach Kameramodell zu sortieren und erst dann nach Datum.

    Das kannst Du doch noch einbauen. Vielleicht auch optional.

  • 465000 JPGs in einem einzigen Ordner ...

    • Oscar
    • 27. Juli 2016 um 14:10
    Zitat von Code-Jack

    Wer noch gute Ideen hat, gerne her damit!

    1. Den Ziel-Dateinamen auch entsprechend den EXIF-Daten erstellen nach folgendem Muster: "JJJJ-MM-TT___HH-MM-SS_(C).jpg"
    Wobei man aufpassen muss, dass in der Sekunde evtl. auch mehrere Bilder gemacht worden sind, deswegen der Counter "(C)".

    2. Statt FileMove zu benutzen, lieber FileCopy und die Rückgabe von FileCopy prüfen, wenn erfolgreich, dann FileDelete.
    Das ist sicherer als FileMove. Um ganz sicher zu gehen, könntest Du vor dem FileDelete auch ein Verify durchführen. Das ist aber sehr langwierig.

    3. Unbedingt eine Fehlerbehandlung von "_FileGetProperty" einfügen. Wenn ein Bild fehlerhafte EXIF-Daten aufweist, erstellst Du falsche Ordner.

  • 465000 JPGs in einem einzigen Ordner ...

    • Oscar
    • 26. Juli 2016 um 18:28

    Wenn die Dateien alle in einem Ordner liegen, dann braucht man die ja nicht unbedingt alle einlesen.
    Es geht hier ja nicht darum, die Dateinamen anzuzeigen, sondern nur darum die Dateien umzubenennen.
    Das geht ja auch einzeln nacheinander (Stichworte: FileFindFirstFile, FileFindNextFile).

  • 465000 JPGs in einem einzigen Ordner ...

    • Oscar
    • 26. Juli 2016 um 18:24

    Es gibt eine UDF (Anhang), die die EXIF-Daten auslesen kann.
    Und hier ein kleines Beispiel für die Benutzung:

    AutoIt
    #include "image_get_info.au3"
    
    
    $file = FileOpenDialog("Please select file", "", "JPEG files (*.jpg;*.jpeg)");
    If @error Then Exit
    $sExif = _ImageGetInfo($file)
    MsgBox(0, "EXIF Data", $sExif)
    
    
    $sDate = _ImageGetParam($sExif, 'DateTimeOriginal')
    If @error Then Exit
    $sDate = StringRegExpReplace($sDate, '(\d{4}):(\d{2}):(\d{2}) (\d{2}):(\d{2}):(\d{2})', '$1-$2-$3___$4-$5-$6.jpg')
    MsgBox(0, "Neuer Dateiname: Datum und Uhrzeit", $sDate)
    Alles anzeigen

    Ich denke, den Rest (alle Dateinamen einlesen, in einer Schleife durchgehen und umbenennen/verschieben) bekommst Du selbst hin, oder?

    Dateien

    image_get_info.au3 47,8 kB – 442 Downloads
  • Info für Funktion: Online auf meinem Server prüfen, ob eine bestimmte Datei vorhanden, falls nicht, Programm beenden.

    • Oscar
    • 26. Juli 2016 um 15:30

    Eine Freeware, die plötzlich keine Freeware mehr sein soll, gibt es nicht!
    Wenn, dann kann man das nur im Zuge einer neuen Version der Software ändern. Die alte Version bleibt aber weiterhin Freeware.
    Das, was Du beschreibst, erinnert mich eher an "Miet"-Software (365 Tage Version o.ä.). Dort macht es Sinn, die Software "abzuschalten".
    Ein Freeware-Programm, was so ein Verhalten an den Tag legt, würde ich jedenfalls nicht einsetzen.

  • Memory Array of Byte funktion als dll

    • Oscar
    • 26. Juli 2016 um 15:19
    Zitat von zocker5656

    ich möchte mich einfach nur an der Memory Manipulation versuchen und das momentan an Solitair.

    Und wir werden sowas hier trotzdem nicht supporten!
    [closed]

  • Listview - Abfrage mit Tastatur

    • Oscar
    • 22. Juli 2016 um 14:43

    Das scheint ein Bug in AutoIt zu sein!
    Wenn man sich die Definition von "$tagNMLVKEYDOWN" mal anschaut, dann steht da am Anfang "align 1;".
    Laut MSDN ist das aber nicht korrekt.
    Und wenn man die Definition dann mal ohne das "align 1;" macht, dann funktioniert das Script auch im x64-Modus.

    Edit: Was ist denn mit dem Editor los? Man kann gar keinen AutoIt-Code mehr einfügen. Habe das Script jetzt als Anhang eingefügt.

    Edit2: Alles zurück! Geht jetzt doch wieder! Lag bei mir an Firefox! Habe ihn gerade mal neugestartet.

    AutoIt
    #Region - Timestamp
    ; 21.07.2016 20:10:30
    #EndRegion - Timestamp
    
    
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Compile_Both=y
    #AutoIt3Wrapper_UseX64=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <WindowsConstants.au3>
    ;~ #include <PrgInfo_UDF.au3>
    #include <GuiStatusBar.au3>
    #include <GuiListView.au3>
    #include <GuiComboBox.au3>
    
    
    Opt("GUIOnEventMode", 1)
    
    
    Global Const $tagNMLVKEYDOWN_debug = $tagNMHDR & ";word VKey;uint Flags"
    
    
    #Region ### START Koda GUI section ### Form=X:\Dropbox\AutoIT\Picture Manager\TestForum.kxf
    Global $hGui = GUICreate("hGui", 603, 401, -1, -1)
    Global $hInp = GUICtrlCreateInput("", 8, 16, 273, 21)
    Global $hLv = GUICtrlCreateListView("Titel|Status", 304, 16, 281, 369)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 100)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    
    GUIRegisterMsg($WM_NOTIFY, "LV_NOTIFY")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    
    
    _GUICtrlListView_AddItem($hLv, "Titel 1", 0)
    _GUICtrlListView_AddSubItem($hLv, 0, "OK", 1)
    _GUICtrlListView_AddItem($hLv, "Titel 2", 1)
    _GUICtrlListView_AddSubItem($hLv, 1, "Fehler", 1)
    _GUICtrlListView_AddItem($hLv, "Titel 3", 2)
    _GUICtrlListView_AddSubItem($hLv, 2, "OK", 1)
    _GUICtrlListView_AddItem($hLv, "Titel 4", 3)
    _GUICtrlListView_AddSubItem($hLv, 3, "OK", 1)
    _GUICtrlListView_AddItem($hLv, "Titel 5", 4)
    _GUICtrlListView_AddSubItem($hLv, 4, "OK", 1)
    
    
    While 1
    	Sleep(100)
    WEnd
    
    
    Func _Exit()
    	GUIDelete()
    	Exit
    EndFunc   ;==>_Exit
    
    
    Func LV_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    	#forceref $hWnd, $iMsg, $wParam
    	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    	$hWndListView = GUICtrlGetHandle($hLv)
    	If Not IsHWnd(GUICtrlGetHandle($hLv)) Then $hWndListView = GUICtrlGetHandle(GUICtrlGetHandle($hLv))
    	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    	$iCode = DllStructGetData($tNMHDR, "Code")
    	Switch $hWndFrom
    		Case GUICtrlGetHandle($hLv)
    			Switch $iCode
    				Case $NM_CLICK
    					GUICtrlSetData($hInp, _GUICtrlListView_GetItemText($hLv, Int(_GUICtrlListView_GetSelectedIndices($hLv))))
    				Case $LVN_KEYDOWN
    					$tInfo = DllStructCreate($tagNMLVKEYDOWN_debug, $lParam)
    					ConsoleWrite(DllStructGetData($tInfo, "VKey") & @CR)
    					Switch DllStructGetData($tInfo, "VKey")
    						Case 38; Hoch
    							_GUICtrlListView_ClickItem($hLv, Int(_GUICtrlListView_GetSelectedIndices($hLv)) - 1)
    						Case 40; Runter
    							_GUICtrlListView_ClickItem($hLv, Int(_GUICtrlListView_GetSelectedIndices($hLv)) + 1)
    						Case 35; End
    							_GUICtrlListView_ClickItem($hLv, _GUICtrlListView_GetItemCount($hLv) - 1)
    						Case 36; Home
    							_GUICtrlListView_ClickItem($hLv, 0)
    					EndSwitch
    			EndSwitch
    	EndSwitch
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>LV_NOTIFY
    Alles anzeigen

    Dateien

    script.au3 3,09 kB – 210 Downloads
  • Senden von Text in Windows Explorer-Leiste mit anschließendem ENTER

    • Oscar
    • 21. Juli 2016 um 18:44

    Wofür willst Du denn den Explorer fernsteuern?

    Ich denke, hier liegt wieder ein XY-Problem vor.

  • Unsaubere Grafikdarstellung

    • Oscar
    • 16. Juli 2016 um 14:27

    Vermutlich hat das etwas damit zu tun, wie AutoIt die Transparenz handhabt (das Pixel in der oberen linken Ecke des Bildes bestimmt, welche Farbe transparent dargestellt wird).
    Merkwürdigerweise wird das Bild aber korrekt dargestellt, wenn man erst die GUI anzeigt (GUISetState) und dann das Bild erstellt (GUICtrlCreate).
    Oder man benutzt GDI+ zum laden der Bilder. Im Anhang meine UDF dazu.

    Dateien

    _GuiCtrlSetImageEx.au3 6,02 kB – 303 Downloads
  • Filtern einer Array - Teil-String - instring

    • Oscar
    • 10. Juli 2016 um 09:16

    autoBert: Mal abgesehen von den möglichen Fehlern, die dann gleich zum Absturz des Scriptes führen, wird dann aber auch jedes Mal StringSplit ausgeführt. Das ist also auch vom Laufzeitverhalten her eine schlechte Variante.

  • IE: Browser has been deleted prior to operation.

    • Oscar
    • 9. Juli 2016 um 15:58

    Ja klar! Die Anwendung gehört Dir selbst?!
    Und Du musst die Daten dann per IE-Script einfügen?

    Für wie blöd hälst Du uns eigentlich? (Rhetorische Frage)
    [closed]

  • unterstützt AutoIt SFTP?

    • Oscar
    • 6. Juli 2016 um 20:07

    Also eine Google-Suche mit "autoit sftp" führt beim ersten Treffer gleich zu einer entsprechenden UDF.
    Hast Du die mal getestet?

  • Datei gegen Zugriff von anderer Seite sperren

    • Oscar
    • 6. Juli 2016 um 16:21

    Man kann mit einer "Semaphoren"-Datei arbeiten.
    Programm 1 erstellt eine Datei (z.B. access.bin) und öffnet danach die eigentliche Textdatei, nimmt die Änderungen vor, schließt die Textdatei und löscht anschließend die "access.bin".
    Wenn nun Programm 2 auf die Textdatei zugreifen will, dann prüft es erst, ob "access.bin" existiert, wenn ja, dann solange warten, bis "access.bin" von Programm 1 wieder gelöscht wurde.
    Anschließend kann dann Programm 2 wie beschrieben auf die Textdatei zugreifen.

    Edit: Hier mal ein Testscript:

    AutoIt
    $sSemaphoreFile = @ScriptDir & '\access.bin' ; Semaphorendatei (inkl. Pfad)
    $sTextFile = @ScriptDir & '\test.txt' ; Textdatei (inkl. Pfad)
    
    
    $iTimer = TimerInit() ; Timer initialisieren
    $hSemaphore = -1 ; Dateihandle für die Semaphorendatei
    Do
    	If TimerDiff($iTimer) > 5000 Then ; hier habe ich ein Timeout von 5 sek. eingefügt
    		MsgBox(0, 'Timeout', 'Zugriff verweigert')
    		Exit
    	EndIf
    	If Not FileExists($sSemaphoreFile) Then ; wenn die Semaphorendatei nicht existiert, dann...
    		$hSemaphore = FileOpen($sSemaphoreFile, 2) ; die Datei zum schreiben öffnen
    	EndIf
    Until $hSemaphore <> -1 ; warten, bis Semaphorendatei erfolgreich geöffnet wurde
    FileClose($hSemaphore) ; die Semaphorendatei muss geschlossen werden, damit sie später gelöscht werden kann!
    $hTextFile = FileOpen($sTextFile, 1) ; Textdatei zum hinzufügen öffnen
    FileWriteLine($hTextFile, Random(1, 1000, 1)) ; Zeile mit Zufallszahl anhängen
    Sleep(2000) ; etwas warten (simuliert weitere Dateizugriffe), dient nur zum testen!
    FileClose($hTextFile) ; Textdatei wieder schließen, wichtig!
    FileDelete($sSemaphoreFile) ; danach Semaphorendatei löschen, damit das andere Programm auf die Textdatei zugreifen kann
    Alles anzeigen
  • Array / Zahlen vergleichen - Lösungsansatz

    • Oscar
    • 5. Juli 2016 um 19:57

    Es gibt noch eine Möglichkeit und zwar mit Strings.
    Die StringReplace-Funktion ist ja auch recht schnell und so braucht man nur die äußere Schleife:

    AutoIt
    #include <Array.au3>
    Global $Array1 = [10, 20, 20, 30, 30, 100, 100, 100, 100, 80, 60]
    Global $Array2 = [5, 30, 20, 20, 100, 100, 50, 60, 80, 50]
    Global $iTimer = TimerInit()
    Global $s1 = _ArrayToString($Array1, ' '), $s2 = ' '
    For $val In $Array2
    	$s1 = StringReplace($s1, String($val), '', 1)
    	If Not @extended Then $s2 &= $val & ' '
    Next
    $s1 = StringStripWS($s1 & $s2, 7)
    Global $aResult = StringSplit($s1, ' ', 2)
    ConsoleWrite(TimerDiff($iTimer) & @CR)
    _ArrayDisplay($aResult)
    Alles anzeigen
  • Array / Zahlen vergleichen - Lösungsansatz

    • Oscar
    • 5. Juli 2016 um 16:16

    Wenn es sich um große Arrays handelt und um _ArrayDelete zu umgehen, könnte man auch so vorgehen:

    AutoIt
    #include <Array.au3>
    Global $Array1 = [10, 20, 20, 100, 100, 100, 100]
    Global $Array2 = [20, 20, 100, 100, 50]
    
    
    
    
    For $i = UBound($Array1) - 1 To 0 Step -1
    	For $j = UBound($Array2) - 1 To 0 Step -1
    		If $Array1[$i] = $Array2[$j] Then
    			$Array1[$i] = -1
    			$Array2[$j] = -1
    			ExitLoop
    		EndIf
    	Next
    Next
    
    
    _ArrayConcatenate($Array1, $Array2)
    Global $sResult = ""
    For $val In $Array1
    	If $val <> -1 Then $sResult &= $val & '|'
    Next
    Global $aResult = StringSplit(StringTrimRight($sResult, 1), '|', 2)
    _ArrayDisplay($aResult)
    Alles anzeigen
  • Array / Zahlen vergleichen - Lösungsansatz

    • Oscar
    • 5. Juli 2016 um 14:51

    Hier mal mein Versuch:

    AutoIt
    #include <Array.au3>
    Global $Array1 = [10, 20, 20, 100, 100, 100, 100]
    Global $Array2 = [20, 20, 100, 100, 50]
    
    
    For $i = UBound($Array1) - 1 To 0 Step -1
    	For $j = UBound($Array2) - 1 To 0 Step -1
    		If $Array1[$i] = $Array2[$j] Then
    			_ArrayDelete($Array1, $i)
    			_ArrayDelete($Array2, $j)
    			ExitLoop
    		EndIf
    	Next
    Next
    
    
    _ArrayConcatenate($Array1, $Array2)
    _ArrayDisplay($Array1)
    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™