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

Beiträge von Moombas

  • AutoIt Hackathon #1 Mitarbeiter-ID abgeschlossen

    • Moombas
    • 31. März 2025 um 11:05

    Mal außerhalb des Wettbewerbs (da ich ja zeitlich aktuell nicht kann) habe ich mir mal nur die Aufgabe geschnappt ohne die Lösungen anzuschauen und das war dann mein Ergebnis:

    AutoIt
    #include <Array.au3>
    
    Global $LineStart = @ScriptLineNumber
    Func _CreateID(Const $aUserdata)
    Local Const $Vorname 		= 0
    Local Const $ZweiterVorname = 1
    Local Const $Nachname 		= 2
    Local Const $Geburtsdatum 	= 3
    Local Const $Geschlecht 	= 4
    Local $Return
    ;~ 	Zeichen 1-5
    	$Return = StringLeft(StringReplace($aUserdata[$Nachname], '-', ''), 5)
    	For $i = 1 to 5-StringLen($Return)
    		$Return &= '9'
    	Next
    ;~ 	Zeichen 6
    	$Return &= Stringmid($aUserdata[$Geburtsdatum], 9, 1)
    ;~ 	Zeichen 7-8
    	If $aUserdata[$Geschlecht] = 'M' then
    		$Return &= StringSplit($aUserdata[$Geburtsdatum], '.')[2]
    	ElseIf $aUserdata[$Geschlecht] = 'W' then
    		$Return &= Number(StringSplit($aUserdata[$Geburtsdatum], '.')[2]) + 50
    	Else
    		Return False
    	EndIf
    ;~ 	Zeichen 9-10
    	$Return &= StringSplit($aUserdata[$Geburtsdatum], '.')[1]
    ;~ 	Zeichen 11
    	$Return &= StringRight($aUserdata[$Geburtsdatum], 1)
    ;~ 	Zeichen 12-15
    	$Return &= StringLeft($aUserdata[$Vorname], 2) & StringLeft($aUserdata[$ZweiterVorname], 2)
    	For $i = 1 to 15-Stringlen($Return)
    		$Return &= '9'
    	Next
    ;~ 	Zeichen 16
    	$Return &= _Pruefziffer($Return)
    ;~	Consolewrite($Return & @CRLF)
    
    	Return $Return
    EndFunc   ;==>_CreateID
    
    Func _Pruefziffer(Const $String)
    Local $Return = 0
    Local $aArray = StringToASCIIArray($String)
    	While 1
    		For $Row = 0 to UBound($aArray, $UBOUND_ROWS)-1
    			$Return += $aArray[$Row]
    		Next
    		If $Return <= 9 then ExitLoop
    		$aArray = StringSplit($Return, '', $STR_NOCOUNT)
    		$Return = 0
    	WEnd
    	Return $Return
    EndFunc
    
    Global $LineEnd = @ScriptLineNumber
    Alles anzeigen

    Leider hatte ich nen dummen Fehler drinnen, der dafür gesorgt hatte, das ich wesentlich mehr Zeit gebraucht hatte als eigentlich nötig gewesen wäre XD aber das gehört auch dazu.
    Daher war ich bei ~45 Minuten mit kleinen Unterbrechungen^^

  • Was ist eure Präferenz: "light mode" oder "dark mode" bei Software (egal ob Web oder Desktop)?

    • Moombas
    • 18. März 2025 um 08:24

    Wobei das mit dem Fensterrand aus meiner Sicht ein Designfehler ist.

    Und ich pers. habe durchaus das Gleiche festgestellt wie argumentum: Helle Umgebung: Heller Desktop Empfehlenswert (wenn die Licht"effekte" den Bildschirm treffen), in dunkler Umgebung ist der Darkmode wesentlich angenehmer. Und da ich bei der Umgebung eher bei Schnuffel bin, wobei das nur im privaten Umfeld, da das bei uns auf der Arbeit (leider) so nicht möglich ist :D

  • Was ist eure Präferenz: "light mode" oder "dark mode" bei Software (egal ob Web oder Desktop)?

    • Moombas
    • 17. März 2025 um 08:12
    Zitat von Andy

    ...kein einziges Printmedium/Buch ist lesbarer im Darkmode

    Nur kurz dazu: Das hat noch andere Gründe: Zum einen "Leuchtet" die Schrift nicht (selbst wenn du hier idealerweise schwarzen Hintergrund nehmen würdest mit weißer Schrift), zum anderen überleg mal was ein Buch mit komplett schwarzen Seiten an Druckerschwärze (oder wenn ggf. vorher eingefärbt: Farbe) verbrauchen würde + das du hier nie wirkliches Schwarz erreichen würdest (beim Monitor bist du da um Welten dichter dran), was zus. bei Printmedien dies unpraktikabel macht.

    Zitat von Andy

    Keine mir bekannte Oberfläche einer Maschine im Produktionsbetrieb hat Darkmode, keine "Lichtwand" oder Werbetafel benutzt Darkmode. Schon mal eine professionelle Präsentation im Darkmode gesehen?!

    Aus meiner Sicht eher historisch bedingt. Eine weiße oder rote Info auf schwarzem Grund ist schneller/leichter zu erkennen, als auf weißem. Ich würde durchaus Präsentationen im Darkmode bevorzugen, zum Glück finden bei uns kaum welche statt.
    "Weil etwas schon immer so war" und daher es im Gro noch so gemacht wird, bedeutet nicht das es (immer noch) besser ist.

    ABER: Generell, es sollte Einstellbar sein, so das es jeder selber entscheiden kann, dem stimme ich zu 100% zu. Es kann auch mal sein, das es wirklich enorm Sinn macht im Light mode zu bleiben (mir fällt hier spontan Excel ein, weil es dort echt schlecht umgesetzt ist und auch gerne mal mit Farben gearbeitet wird, die dann aber im Dark mode tlw. nicht so gut hervorstechen wie im Lightmode, besonders bei Diagrammen.
    Und natürlich das persönliche befinden.

    OT: Und falls es jemanden interessiert bzgl. Stromverbrauch. Leider noch von 2009 und ohne OLED aber das Prinzip und der Unterschied zwischen den meist verbreiteten Techniken (LCD/LED) kann man daraus gut sehen.

  • Was ist eure Präferenz: "light mode" oder "dark mode" bei Software (egal ob Web oder Desktop)?

    • Moombas
    • 14. März 2025 um 08:05

    Yepp, alles immer unter der Premisse, das es richtig gemacht wird und nicht nur stumpf "invertiert" wird.
    Generell halt Dark mode, Lesbarkeit und bei LED-Bildschirmen spart das auch noch Energie.

    Leider ist oftmals es nicht ideal umgesetzt, da wo es gut gemacht wird ist es aber um Welten besser und angenehmer als light mode.

  • Festgelegten Ordner in den aktuell ausgewählten Ordner kopieren

    • Moombas
    • 10. März 2025 um 08:24

    Teamwork FTW ;)

  • Festgelegten Ordner in den aktuell ausgewählten Ordner kopieren

    • Moombas
    • 10. März 2025 um 07:57

    Dann brauch ich meins ja nicht weiter prüfen ;)
    Wo da nun bei mir der #Fehler lag schaue ich mir ggf. später nochmal an, denn zumindest bei mir hatte zumindest es geklappt, den Pfad des aktiven Ordners zu bekommen, das kopieren hatte ich dann nicht mehr geprüft. Aber SOLVE-SMART :

    "Des Weiteren berücksichtigst du (glaube ich) nicht, dass die vorhandenen Dateien im Zielordner nicht überschrieben werden sollen."

    Da habe ich seine Vorlage genommen: FileCopy($sourceFolder, $targetImFolder, 1)    ; 1 = Überschreibe, wenn der Ordner bereits existiert
    Daher bin ich auch wegen dem Kommentar davon ausgegangen das es Überschreiben soll.

  • Festgelegten Ordner in den aktuell ausgewählten Ordner kopieren

    • Moombas
    • 7. März 2025 um 10:39

    Ich habe mein Skript nochmal angepasst, da der Ordnername des aktiven Tab im Titel angezeigt wird, nehme ich das als Referenz um den richtigen Ordner zu bekommen. Das kopieren an sich ist hierbei noch ungetestet.

  • Festgelegten Ordner in den aktuell ausgewählten Ordner kopieren

    • Moombas
    • 7. März 2025 um 07:59

    Auch möchte ich hier nochmal (auch wenn autoit das gerne "intern" korrigiert) darauf hinweisen das in deinem Programm eine Vermischung von Local und Global variablen passiert und keine saubere Zuweisung vorhanden ist.

    Zudem ist die "simulierung des Tastendrucks Strg+C vollkommen unnötig (sollte man aus dem Handle holen) und nur weil man ein Fenster selektiert hat, heißt das nicht, das man die Adresszeile ausgewählt hat, was in deinem Code bedeutet das Strg+C entweder leer ist oder ganz was anderes enthält und zusätzlich auch noch ggf. für den User wichtiges in der Zwischenablage überschreibt.

    Auch noch was hinzuzufügen, das DirCreate kann Filecopy auch (siehe Hilfe).
    Daher würde mein aktueller Ansatz so aussehen (Bin auf W11 und bekomme aber immer nur den 1. OrdnerTab raus, nicht den gerade aktiven, ggf. kann da wer anders ansetzen der das besser kann ;):(

    AutoIt
    Opt('MustDeclareVars', 1)
    
    #include <FileConstants.au3>
    #include <StringConstants.au3>
    
    ; Setze den Hotkey Strg + G, da Strg+Alt+G bei mir nicht funktionierte
    HotKeySet('^g', "CopyFilesHotkey")
    HotKeySet('{Esc}', "Cancel")
    
    ; Halte das Skript am Laufen, bis der Benutzer es beendet
    While 1
    	Sleep(100)    ; Warte in einer Schleife
    WEnd
    
    Func Cancel()
    	Exit
    EndFunc
    
    Func CopyFilesHotkey()
    Local Const $sourceFolder = 'E:\Info\#Im'
    Local Const $targetFolder = GetSelectedFolder()
    	; Überprüfen, ob ein Zielordner ausgewählt ist
    	If IsBool($targetFolder) Then
    		MsgBox(0, "Fehler", "Kein Zielordner ausgewählt oder der ausgewählte Ordner ist ungültig.")
    		Return -1
    	EndIf
    	; Überprüfen, ob der Quellordner existiert
    	If Not FileExists($sourceFolder) Then
    		MsgBox(0, "Fehler", "Der Quellordner existiert nicht: " & $sourceFolder)
    		Return -2
    	EndIf
    
    	; Kopiere den #Im-Ordner in den ausgewählten Zielordner und erstelle den Ordner falls noch nicht vorhanden
    	Return FileCopy($sourceFolder, $targetFolder & "\#Im", $FC_OVERWRITE + $FC_CREATEPATH)
    EndFunc   ;==>CopyFilesHotkey
    
    Func GetSelectedFolder()
    	Local $hWnd = WinGetHandle("[ACTIVE]")    ; Aktives Fenster ermitteln
    	If Not IsHWnd($hWnd) Then Return -1
    	Return _ExplorerGetItem($hWnd)
    EndFunc   ;==>GetSelectedFolder
    
    
    Func _ExplorerGetItem($hWnd)
        If Not IsHWnd($hWnd) Then Return -1
        Local $oSHFolderView
    
        $oSHFolderView = _ObjectSHFolderViewFromWin($hWnd)
        If @error Then Return -2
    
    
    	If IsObj($oSHFolderView) Then
    
    		Return $oSHFolderView.Folder.Self.Path
    	Else
    		Return -3
    	EndIf
    EndFunc   ;==>_ExplorerWinGetSelectedItems
    
    ; ==========================================================================================================================
    
    ; Func _ObjectSHFolderViewFromWin($hWnd)
    ;
    ; Returns an 'ShellFolderView' Object for the given Window handle
    ;
    ; Author: Ascend4nt, based on code by KaFu, klaus.s
    ; ==========================================================================================================================
    
    Func _ObjectSHFolderViewFromWin($hWnd)
    Local $DeepestFolder
        If Not IsHWnd($hWnd) Then Return SetError(1,0,0)
        Local $oShell,$oShellWindows,$oIEObject,$oSHFolderView[]
    
    ; Shell Object
        $oShell=ObjCreate("Shell.Application")
        If Not IsObj($oShell) Then Return SetError(2,0,0)
    
    ;   Get a 'ShellWindows Collection' object
        $oShellWindows = $oShell.Windows()
        If Not IsObj($oShellWindows) Then Return SetError(3,0,0)
    
    ;   Iterate through the collection - each of type 'InternetExplorer' Object
    
         For $oIEObject In $oShellWindows
            If $oIEObject.HWND = $hWnd Then
                ; InternetExplorer->Document = ShellFolderView object
                $oSHFolderView=$oIEObject.Document
                If IsObj($oSHFolderView) Then
    				$DeepestFolder = StringRegExp($oSHFolderView.Folder.Self.Path, '([[:alpha:]]:.*\\|\\{2}.*\\|.*\/)(.*)\b', $STR_REGEXPARRAYMATCH)[1]
    				If StringInStr(WinGetTitle($hWnd), $DeepestFolder) then Return $oSHFolderView
    ;~ 				Return SetError(4,0,0)
    			Endif
            EndIf
        Next
        Return SetError(-1,0,0)
    EndFunc
    Alles anzeigen
  • MP3's zusammen führen

    • Moombas
    • 28. Februar 2025 um 17:37

    Ich habe mich nun für das Erstellen der Playlist entschieden, um doch die Kapitel zu erhalten, ich denke ansonsten wäre ich den weg über ffmpeg gegangen.

  • MP3's zusammen führen

    • Moombas
    • 28. Februar 2025 um 08:10

    Moin, schon mal danke für das ganze feedback ;)

    also ich habe natürlich bei den ersten Tests gemerkt das manchmal die Reihenfolge passt, manchmal nicht.

    Ich werde mir aber eure Vorschläge mal alle in Ruhe anschauen und zuhause testen.
    Das Problem ist halt das es hier um ca. 140 Ordner á ~40 Dateien geht, die final (nach dem zusammensetzen) 90-110MB groß sind.

    Zitat von SOLVE-SMART

    Für mich funktioniert dein Skript, wenn ich paar Testdaten (mp3s) nutze. Hast du dir dein Array der Mp3s vor und nach dem _ArraySort mal angeschaut? Mit Sicherheit, richtig? Das "copy" Tool übernimmt die Reihenfolge die du vorgibst ... deine Kette von Dateien. Daher wäre es wichtig, wie genau deine Dateinamen aussehen. Wenn wirklich irgendwas mit 1.mp3, 2.mp3. 10.mp3 durcheinander kommt, dann eher im _ArraySort anstatt beim copy tool.

    Ich werde mir das beim entsprechenden Ordner nochmal anschauen (wo ich definitiv sofort feststellen konnte das die Reihenfolge nicht passt) aber eigentlich habe ich bei den Namensgebungen per mp3tag alles gleich gesetzt (incl. führender Nullen etc.) für Tags und Dateinamen.

    Ich habe auch drüber nachgedacht mir alternativ m3u-Dateien zu bauen (ich glaube das geht relativ einfach) und wenn ich mir das hier so anschaue, schon fast das bevorzugen werde, da dann wenigstens die "Kapitel" erhalten bleiben.

    Wenn ich mich nicht irre müsste ich diese dann per
    ..\Unterordner\Titel_1.mp3
    ..\Unterordner\Titel_2.mp3
    ...
    als reine "textdatei" mit der m3u Endung anlegen.

    Ich muss mir da nochmal Gedanken machen ;)

  • MP3's zusammen führen

    • Moombas
    • 27. Februar 2025 um 15:53

    Moin zusammen,

    hier mal was in privater Sache, ich würde gerne MP3's zusammenführen von Hörspielen um, wenn diese in mehrere unterteilt sind, später in einer MP3 (in der richtigen Reihenfolge) sind.

    Problem dabei, was ich bisher gemacht habe, fügt sie zwar zusammen aber nicht in der Reihenfolge wie sie sollten. Hat da noch jemand eine Idee?

    AutoIt
    Opt('MustDeclareVars', 1)
    
    #include <StringConstants.au3>
    #include <File.au3>
    Global Const $Folders = _FileListToArray('Z:\Path_to_the_Folders', '*', $FLTA_FOLDERS, True)
    For $Row = 1 to $Folders[0]
    	MergeMP3($Folders[$Row] & '\', True)
    Next
    
    
    ;~ copy /b *.mp3 merge2.mp3
    Func MergeMP3($Folder, $Upper = False)
    Local $File
    Local Const $RegEx = '([[:alpha:]]:.*\\|\\{2}.*\\|.*\/)(.*)\b'
    Local Const $UpperFolder = StringRegExp($Folder, $RegEx, $STR_REGEXPARRAYMATCH)[1]
    Local Const $Path = $Folder
    Local $Files = _FileListToArray($Folder, '*.mp3', $FLTA_FILES, False)
    _ArraySort($Files, 0, 1)
    For $Row = 1 to $Files[0]
    	$File &= '"' & $Folder & $Files[$Row] & '" + '
    Next
    $File = StringTrimRight($File, 3)
    
    If $Upper Then $Folder = StringTrimRight($Folder, StringLen($UpperFolder) + 1)
    Local Const $Command = 'copy /b ' & $File & ' "' & $Folder & $UpperFolder & '.mp3"'
    ;~ 	Consolewrite($Command & @CRLF)
    	RunWait(@ComSpec & " /c " & $Command, $Path, @SW_HIDE)
    EndFunc
    Alles anzeigen

    Ich habe hier bereits von der Quellenangabe (*.mp3) geändert, die MP3's in der richtigen Reihenfolge anzugeben (1.mp3 + 2.mp3 + ...) aber leider scheint die CMD da ihre ganz eigenen Ideen zu haben diese zusammen zu setzen.

  • Favoriten Menü

    • Moombas
    • 21. Februar 2025 um 13:10

    Oder man trennt halt:

    Ini im Programm-Ordner: allgemeine Settings die für alle gelten. (Prio 2)

    Ini im user Ordner: Benutzerspezifische Settings (Prio 1 = überschreiben Programm lokale settings)

    Das kann je nach Programm und dessen Aufbau Sinn machen.

  • Anti "false-positive" Strategie mit PureBasic

    • Moombas
    • 20. Februar 2025 um 15:07
    Zitat von Schnuffel

    da wäre ich nicht stolz drauf 😞

    Aber dagegen könntest du nichtmal was machen (außer es nicht öffentlich verfügbar zu machen).

  • Ordnernamen in Variable schicken

    • Moombas
    • 20. Februar 2025 um 12:42

    Und ganz ehrlich: Manchmal entstehen eben durch Diskussionen Ideen/Lösungen die vorher keiner im Sinn hatte.

    Diskussionen finde ich immer gut, solange es Sachlich bleibt. Würde man immer das erste Ergebnis nehmen was einem Präsentiert wird, wären wir wohl immer noch in der Steinzeit.

  • Ordnernamen in Variable schicken

    • Moombas
    • 19. Februar 2025 um 13:56

    Erstmal denke ich kommen hier alle mal wieder runter!

    Ich denke was Schnuffel eher meinte war "zu erwartenden Eventualitäten" und ja man kann das natürlich auch noch weiter führen und den RegEx erweitern auf ([[:alpha:]]:.*\\|\\{2}.*\\|.*\/)(.*)\b

    Ich denke niemand ist Perfekt und es wird immer Nachbesserungsbedarf geben, denn was so manch ein DAU irgendwo eingibt, da staunt man doch so manchesmal als ITler ;)

  • Ordnernamen in Variable schicken

    • Moombas
    • 19. Februar 2025 um 11:18

    Naja wenn stringlänge <= 3 dann root (also X:\), sonst dein regex (du Perfektionist :P ).

    Sprich deine Funktion minimal erweitert:

    AutoIt
    Func _LastFolderofPath($sPath)
    	If Length($sPath) <= 3 Then
    		Return StringLeft($sPath, 1) & ':\'
    	Else
    		$sFolder = StringRegExp($sPath, '([[:alpha:]]:.*\\|\\{2}.*\\)(.*)\b', 1)
    		If $sFolder = 0 Then Return SetError(1,0,"")
    		Return $sFolder[1]
    	Endif
    EndFunc
  • Ordnernamen in Variable schicken

    • Moombas
    • 19. Februar 2025 um 08:16

    Ist halt Geschmackssache Schnuffel und Kanashius.

    Ich wollte es nur simpel halten und ja schöner ist es erst das Array per Stringsplit zu erzeugen und dann den entsprechenden Eintrag zu generieren (wäre dann immernoch ein 2 Zeiler):

    AutoIt
    $sFolder = Stringsplit($sUrsprungsordner, '\')
    $sFolder = $sFolder[$sFolder[0]]

    Ob bei solch einer simplen Abfrage man wirklich noch auf Performance schauen muss, hängt davon ab wie oft dies durchgeführt wird.
    RegEx wollte ich auch erst machen, habe nur gedacht das der TE das noch weniger verstehen würde und wäre mir da bei der herangehensweise nicht zu 100% sicher gewesen.
    Edit: Ich würde dein RegEx auch um /b ergänzen zu .*\\(.+)\b das Sollte dann auch Pfade mit \ am Ende entsprechend nutzbar machen.

    Aber wie gesagt das ist Geschmackssache und ich verwende RegEx in der Regel nur bei Sachen, wo alles andere sonst total Umständlich bis zu unmöglich wäre es anders zu lösen ;)

    Achja.: OT ich selber bevorzuge 1 basierte Arrays Kanashius ;) Auch wenn deine Begründung Stichhaltig ist, so erspart es einem doch die Länge des Arrays (immer wieder) auszulesen oder in einer separaten Variable zu speichern (wenn man es mehrfach braucht). Für mich gehört es zu den Daten dazu. Auch wenns vielleicht kein perfektes Beispiel ist: Wie bei einem Buch mit Seite 1 (bzw. 0) als Inhaltsverzeichnis und jede Seite ist eindeutig einem Index zugeordnet (durch nummeriert).

  • Ordnernamen in Variable schicken

    • Moombas
    • 18. Februar 2025 um 15:41

    Keine Ahnung obs ne besser Möglichkeit gibt aber ich würde es so machen:

    AutoIt
    $sFolder = Stringsplit($sUrsprungsordner, '\')[Stringsplit($sUrsprungsordner, '\')[0]]
  • [Erledigt] SciTE versus VSCode <==> potenzielle Veränderungen

    • Moombas
    • 10. Februar 2025 um 09:34

    Ja es kann halt sehr unterschiedlich sein.
    Ich pers. fand z.B., ich habe ja Programmieren über Delphi gelernt, die Oberfläche (mit der GUI Erstellung etc.) dort sehr gut (Lazarus als das kostenlose pardon, naja) und wahr einiges an Komfort dort gewöhnt und wenn ich dann an meine ersten Schritte hier mit AutoIt denke, war das ja fast ein Schock :D

    Mittlerweile geht das eigentlich und ich sehe die beiden Vorteile bei beidem (komplett außer Acht gelassen, die Sprachenunterschiede!).

    Es liegt also oft im Auge des Betrachters und manchmal auch was man erreichen möchte.

  • AutoIt auf Domänenrechner mit User-Rechten

    • Moombas
    • 7. Februar 2025 um 08:03

    Oder anfragen, ob du explizit für den Autoit Programmordner volle Rechte bekommst, wir hatten ähnl. Situationen in der Vergangenheit und es dann eben so gelöst.

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™