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. SOLVE-SMART

Beiträge von SOLVE-SMART

  • AutoIt Cheat Sheet

    • SOLVE-SMART
    • 23. Februar 2023 um 20:19

    Hi Moombas,

    ich Danke dir für deine Einschätzung 👍 . Const, Static und Co. habe ich mit Absicht weggelassen. Auch die Beschreibung von Arrays und deren Nutzung ist nicht mit dabei, denn ansonsten müsste ich ggf. auch auf andere Datentypen wie Maps, Structs, Booleans etc. eingehen - wo setze ich da die Grenze/wo grenze ich ab?

    Ich gebe dir Recht, dass gerade für AutoIt Arrays essenziell sind, doch so ein Cheat Sheet dient zunächst erstmal dem groben Überblick. Details sollten dann in Recherchen bzw. Referenzen wie der Hilfe/Dokumentation nachgelesen werden. Es ist so schon eher ungewöhnlich, dass das Cheat Sheet 3 - 4 Seiten (als PDF) lang ist. Üblicherweise (schaue gerne einfach mal bei Cheat Sheets von JavaScript, Python, C# etc. nach), sind es zwei Seiten - also nur das Nötigste.

    => Daher fiel es mir ziemlich schwer zu entscheiden was rein kommt und was nicht.
    => Ich habe mich an vielen anderen Cheat Sheets orientiert.

    Viele Grüße
    Sven

  • GUI mit benutzerdefinierter Titelleiste

    • SOLVE-SMART
    • 23. Februar 2023 um 16:28

    Hi zusammen 👋 ,

    hier nur ganz kurz vorgestellt, ein kleines Skript welches eine GUI darstellt, die eine benutzerdefinierte Titelleiste hat. Ich bin mir sicher das es da bereits etliche Varianten gibt, wie Metro GUI usw., trotzdem wollte ich es einfach mal geteilt haben. Vielleicht hilft es den einen oder anderen (vielleicht auch nur als Ideengeber für andere Projekte oder so).

    💡 Warum? Den Hintergrund der Titelleiste und die Schriftfarbe der Titelleiste zu ändern, ist gar nicht so trivial. Daher hier ein Weg eine eigene Titelleiste stattdessen zu nutzen.

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #AutoIt3Wrapper_UseUpx=n
    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
    
    #include-once
    #include <GUIConstants.au3>
    #include <Misc.au3>
    
    Global $mGui[], $mTitleBar[]
    Global $mClosingCrossIcon[], $mMinimizeIcon[]
    
    Global $mTitleBarColor[]
    $mTitleBarColor.background    = 0xD9534F
    $mTitleBarColor.font          = 0xFBEDED
    $mTitleBarColor.faviconIcon   = $GUI_BKCOLOR_TRANSPARENT
    $mTitleBarColor.hoverMinimize = 0xE5E5E5
    $mTitleBarColor.hoverClose    = 0xE81123
    
    _Actions()
    
    Func _Actions()
        _CreateGui()
        _CreateTitleBar()
        _AddTitleBarButtons()
        _ShowGui()
        _GuiEventListener()
    EndFunc
    
    Func _CreateGui()
        $mGui.Width  = 600
        $mGui.Height = 350
        $mGui.Style  = $WS_POPUP
        $mGui.Handle = GUICreate('', $mGui.Width, $mGui.Height, Default, Default, $mGui.Style)
    EndFunc
    
    Func _CreateTitleBar()
        ; background
        $mTitleBar.X            = 0
        $mTitleBar.Y            = 0
        $mTitleBar.W            = ($mGui.Width - 137)
        $mTitleBar.H            = 26
        $mTitleBar.ButtonWidth  = 25
        $mTitleBar.ButtonHeight = $mTitleBar.ButtonWidth
    
        $mTitleBar.cId = GUICtrlCreateLabel('', $mTitleBar.X, $mTitleBar.Y, $mTitleBar.W, $mTitleBar.H)
        GUICtrlSetBkColor($mTitleBar.cId, $mTitleBarColor.background)
        GUICtrlSetStyle($mTitleBar.cId, -1, $GUI_WS_EX_PARENTDRAG)
    
        ; favicon icon
        GUICtrlCreateLabel('🎲', 4, 5.5) ; I used the cube icon as example which can be pasted in by pressing [WIN] + [.]
        GUICtrlSetBkColor(-1, $mTitleBarColor.faviconIcon)
        GUICtrlSetFont(-1, 11)
    
        ; title
        GUICtrlCreateLabel('GUI with custom title bar', 24, 5.5, ($mGui.Width / 2))
        GUICtrlSetColor(-1, $mTitleBarColor.font)
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetFont(-1, 9)
    EndFunc
    
    Func _AddTitleBarButtons()
        _AddClosingCrossIcon()
        _AddMaximizeIcon()
        _AddMinimizeIcon()
    EndFunc
    
    Func _AddClosingCrossIcon()
        ; background
        $mClosingCrossIcon.X = ($mGui.Width - 45)
        $mClosingCrossIcon.Y = 0
        $mClosingCrossIcon.W = $mTitleBar.ButtonWidth + 20
        $mClosingCrossIcon.H = $mTitleBar.ButtonHeight + 1
    
        $mClosingCrossIcon.cId = GUICtrlCreateLabel('', $mClosingCrossIcon.X, $mClosingCrossIcon.Y, $mClosingCrossIcon.W, $mClosingCrossIcon.H)
        GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0xCD), ($mGui.Width - 31), 5.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 14, 100, Default, 'Wingdings 2')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    EndFunc
    
    Func _AddMaximizeIcon()
        ; background
        GUICtrlCreateLabel('', ($mGui.Width - 92), 0, $mTitleBar.ButtonWidth + 22, $mTitleBar.ButtonHeight + 1)
        GUICtrlSetBkColor(-1, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0xA3), ($mGui.Width - 75), 6.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 11, 100, Default, 'Wingdings 2')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
        GUICtrlSetColor(-1, 0xCCCCCC)
    EndFunc
    
    Func _AddMinimizeIcon()
        ; background
        $mMinimizeIcon.X = ($mGui.Width - 137)
        $mMinimizeIcon.Y = 0
        $mMinimizeIcon.W = $mTitleBar.ButtonWidth + 20
        $mMinimizeIcon.H = $mTitleBar.ButtonHeight + 1
    
        $mMinimizeIcon.cId = GUICtrlCreateLabel('', $mMinimizeIcon.X, $mMinimizeIcon.Y, $mMinimizeIcon.W, $mMinimizeIcon.H)
        GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    
        ; icon
        GUICtrlCreateLabel(ChrW(0x2015), ($mGui.Width - 119), 6.5, $mTitleBar.ButtonWidth, $mTitleBar.ButtonHeight)
        GUICtrlSetFont(-1, 8, 100, Default, 'Segoe UI')
        GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    EndFunc
    
    Func _ShowGui()
        GUISetState(@SW_SHOW, $mGui.Handle)
    EndFunc
    
    Func _GuiEventListener()
        AdlibRegister('_HoverActions', 100)
        Local Const $iGuiEventClose = -3
    
        While True
            Switch GUIGetMsg()
                Case $iGuiEventClose, $mClosingCrossIcon.cId
                    ExitLoop
                Case $mMinimizeIcon.cId
                    GUISetState(@SW_MINIMIZE, $mGui.Handle)
            EndSwitch
        WEnd
    
        _GuiDisposeAndExit()
    EndFunc
    
    Func _GuiDisposeAndExit()
        AdlibUnRegister('_HoverActions')
        GUIDelete($mGui.Handle)
        Exit
    EndFunc
    
    Func _HoverActions()
        Local $aMouseData = MouseGetPos()
        Local $aGuiData   = WinGetPos($mGui.Handle)
    
        If Not _HoverTitleBar($aMouseData, $aGuiData) Then
            _ResetHoverColor()
            Return
        EndIf
    
        Select
            Case _HoverMinimizeIcon($aMouseData, $aGuiData)
                GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.hoverMinimize)
                GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
    
            Case _HoverClosingCrossIcon($aMouseData, $aGuiData)
                GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.hoverClose)
                GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    
            Case Else
                _ResetHoverColor()
        EndSelect
    EndFunc
    
    Func _ResetHoverColor()
        GUICtrlSetBkColor($mClosingCrossIcon.cId, $mTitleBarColor.background)
        GUICtrlSetBkColor($mMinimizeIcon.cId, $mTitleBarColor.background)
    EndFunc
    
    Func _HoverTitleBar($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mTitleBar.X, $mTitleBar.Y, $mGui.Width, $mTitleBar.H)
    EndFunc
    
    Func _HoverMinimizeIcon($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mMinimizeIcon.X, $mMinimizeIcon.Y, $mMinimizeIcon.W, $mMinimizeIcon.H)
    EndFunc
    
    Func _HoverClosingCrossIcon($aMouseData, $aGuiData)
        Return _IsMouseOnControl( _
            $aMouseData[0] - $aGuiData[0], _
            $aMouseData[1] - $aGuiData[1], _
            $mClosingCrossIcon.X, $mClosingCrossIcon.Y, $mClosingCrossIcon.W, $mClosingCrossIcon.H)
    EndFunc
    
    Func _IsMouseOnControl($iXMouse, $iYMouse, $iXControl, $iYControl, $iWidthControl, $iHeightControl)
        If $iXMouse >= $iXControl And _
           $iYMouse >= $iYControl And _
           $iXMouse <= $iXControl + $iWidthControl  And _
           $iYMouse <= $iYControl + $iHeightControl Then
           Return True
        Else
            Return False
        EndIf
    EndFunc
    Alles anzeigen

    Gut zu wissen:

    • man kann das Fenster ganz normal mittels der Titelleiste ziehen
    • man kann den Minimize- und den Schließen-Button ganz normal benutzen
      • klingt trivialer als es ist 😅
    So sieht das bspw. dann aus

    Standard GUI

    Benutzerdefinierte GUI

    Vielleicht kann es ja mal jemand gebrauchen 🤞 .

    Viele Grüße
    Sven

  • AutoIt Cheat Sheet

    • SOLVE-SMART
    • 23. Februar 2023 um 13:49

    Hi Leute 👋 ,

    ich dachte darüber nach, wie ich mich dazu entscheide eine neue Programmiersprache zu lernen. Ich meine abgesehen von beruflichen Anforderungen gibt es einige Kriterien dafür, wie ich (und auch einige meiner Kollegen) eine neue Technologie oder Programmiersprache auswähle. Um einen guten Überblick darüber zu bekommen, wie die Sprache aufgebaut/geschrieben ist, wie die Syntax aussieht und ob dies zu meinen Interessen und Erwartungen passt, verwende ich u. a. Cheat Sheets1 für die Auswahl der Programmiersprache, einer Technologie oder Methodik.

    Auch für erfahrene Entwickler/Programmierer, die bspw. auf eine Sprache umsteigen möchten oder diese als Ergänzung nutzen möchten, kann es hilfreich sein, die Grundlagen, Syntax etc. schnell zu sehen und zu erfassen.

    💡 Darum, und auch auf Grund dessen das es meines Wissens nach für AutoIt kein Cheat Sheet gibt (meine Recherchen hatten nichts brauchbares ergeben), habe ich eines erstellt.

    AutoIt (de) Cheat Sheet

    • 🔗 AutoIt (de) Cheat Sheet als Webseite auf cheatography (eine Webseite die für das Erstellen und Veröffentlichen von Cheat Sheets, mit Hilfe von Vorlagen, gemacht ist)
    • 🔗 AutoIt (de) Cheat Sheet als PDF (durch cheatography erzeugt)
      • 🔗 Alternative Link zum PDF

    Ich bin mir sicher, dass es sehr gemischte Meinungen dazu gibt/geben wird, doch da ich bereits im engl. Forum das Cheat Sheet (englische Variante) veröffentlicht habe, dachte ich mir "schaden kann es nicht" 😅 , es zu übersetzen und hier ebenfalls zu veröffentlichen.

    💡 Über Feedback freue ich mich natürlich, viel am Inhalt ändern werde ich wahrscheinlich aber nicht. Denn es ist nur eine Kurzreferenz, mehr nicht (alles weitere ist der Hilfe/der Dokumentation der Sprache zu entnehmen). Daher bitte nicht zu viel erwarten.

    Viele Grüße
    Sven

    1 Ein Cheat Sheet ist eine Übersichtstabelle zum schnellen Nachschlagen oder eine Reihe einfacher, kurzer Anweisungen für die Ausführung einer bestimmten Aufgabe.

  • winhttp?

    • SOLVE-SMART
    • 22. Februar 2023 um 22:18

    Oh wow MojoeB ,

    ich habe nun zum zweiten Mal deinen Beitrag gelesen und es erscheint mir noch immer nicht klar was du tust und willst 😔 . Ich habe Ideen im Kopf, die aber ggf. wertlos sind wenn sie in die völlig falsche Richtung gehen, nur weil ich nicht genau verstehe was du machen willst/musst.

    Daher:

    • Kannst du bitte entweder ein Video oder ein GIF machen damit man sieht von was du sprichst? Ich nehme an den Code darfst du nicht teilen?
    • Kannst du bitte nochmal genau beschreiben wie es bisher war?
      • Du hast 'ne AutoIt Anwendung, eine GUI in der du den IE embeeded hast, damit du auf Intranet Seiten etwas abgreifen kannst?
      • Nun willst du das über HTTP requests tun, richtig?
    • Bitte beschreibe grob deinen Ablauf und was du ansonsten manuell tun musst, dann kann (ich zumindest) besser einordnen, was ich dir vorschlagen würde.

    Reden wir über diese Version der WinHttp.au3 UDF?

    AutoIt
    #include-once
    #include "WinHttpConstants.au3"
    
    ; #INDEX# ===================================================================================
    ; Title ...............: WinHttp
    ; File Name............: WinHttp.au3
    ; File Version.........: 1.6.4.1
    ; Min. AutoIt Version..: v3.3.7.20
    ; Description .........: AutoIt wrapper for WinHTTP functions
    ; Author... ...........: trancexx, ProgAndy
    ; Dll .................: winhttp.dll, kernel32.dll
    ; ===========================================================================================
    Alles anzeigen

    Wenn, dann hast du sicherlich auch die "WinHttpConstants.au3", richtig?

    💡 Ganz generell: Wahrscheinlich alles, und noch mehr, kannst du mit cURL machen, was aus meiner Sicht etwas komfortabler ist als die UDF.
    Vielleicht hilft dir dies auch schon etwas. Doch vorher mal bitte noch auf meine Fragen eingehen, Danke 🤝 .

    Viele Grüße
    Sven

  • Firmware Update mit AutoIT

    • SOLVE-SMART
    • 22. Februar 2023 um 11:25

    Hi Andreas ( afri66),

    mit Display- bzw. Auflösungsgrößen sollte dies nichts zu tun haben. Bitte versuche die Vorschläge der anderen hier Beitragenden.
    Also falls Admin eine Option für deinen Anwendungsfall sein kann, dann ist dies ein guter Hinweis/ein guter Versuch.

    💡 Dazu einfach #RequireAdmin als erste Zeile einfügen und Skript kompilieren.

    Viele Grüße
    Sven

  • Firmware Update mit AutoIT

    • SOLVE-SMART
    • 21. Februar 2023 um 13:56

    Abgesehen davon versuche mal bitte mit folgenden ("#pragma"s) Zeilen dein Programm erneut zu kompilieren und auszuführen.
    Vielleicht bekommst du so nicht mehr den Hinweis durch den Defender.

    💡 Also einfach dies hier vor deinen Code packen und kompilieren:

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #AutoIt3Wrapper_UseUpx=n
    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln

    Viele Grüße

    Sven

  • Firmware Update mit AutoIT

    • SOLVE-SMART
    • 21. Februar 2023 um 13:49

    Hi afri66 (Andreas) 👋 ,

    es gibt sicherlich einige Verbesserungsmöglichkeiten, bzgl. deines Ansatzes mit WinWaitActive()- und den Send()-Befehlen. Doch darauf möchte ich gar nicht eingehen. Du schreibst das das Skript funktioniert und der Defender (der Microsoft Defender, richtig?) die Exe blockiert?

    Wenn das Skript nur bei dir laufen soll, dann kannst du die Exe den Ausnahmen hinzufügen und fertig. Wenn du es verteilen willst/musst, dann ist der sauberste Weg, du wendest dich mit einem "False-Positive" Anliegen (siehe meine Signatur oder klick für Infos dazu hier) direkt an Microsoft. In der Regel ist innerhalb von einem Tag, dein Programm bewertet und wenn es Schadware frei ist, dann kommt es bei diesen Scanner sofort in die tägliche Aktualisierung.

    So habe ich bereits etliche Programme bei Kaspersky, AVG, MS und wie sie alle heißen registrieren und white-listen lassen 😀 .

    Viele Grüße
    Sven

  • Durckerauswahl - Microsoft Print to PDF

    • SOLVE-SMART
    • 21. Februar 2023 um 08:32

    Danke MojoeB,

    auch wenn ich dies bisher noch nie gebraucht habe, ist es gut zu wissen das es damit eine einfache Variante gibt, dies umzusetzen 😀 .

    Good job 👍 , weiterhin einen angenehmen Tag dir.

    Viele Grüße
    Sven

  • Window Mover für Loupedeck

    • SOLVE-SMART
    • 17. Februar 2023 um 16:37

    💡 Also es ist nicht exakt das was du suchst, glaube ich aSeCa.

    Denn ich hatte das kleine Tool vor einige Zeit für meine Anforderungen entwickelt, doch man kann es sicherlich als Referenz nutzen und ausbauen. Die Idee ist, man sucht sich ein Layout aus, dann wird der erste Bereich des ausgesuchten Layouts rot hervorgehoben (mit Positions- und Größenangabe) und wenn man mit dem Mauscursor das jeweilige Fenster in den roten Bereich schiebt oder es einfach im rotem Bereich anklickt, wird das Fenster in diese Position gebracht.

    Das folgende animierte GIF zeigt es deutlich besser und ich muss mir nicht die Finger wund schreiben 😅 .

    Nutzung Au3WindowManager

    Au3WindowManager.gif

    Viele Grüße
    Sven

  • Window Mover für Loupedeck

    • SOLVE-SMART
    • 17. Februar 2023 um 13:41

    Hi aSeCa,

    witzig 😀 , denn genau solch ein Tool, Au3WindowManager (heißt es bei mir), habe ich auf GitHub liegen, aber privat (also noch nicht geteilt/nicht öffentlich).


    Das Problem mit manchen Fenstern ist, so wie du es auch beschreibst, dass es zu Lücken kommt und sie nicht aneinander "snappen", da die Breiten und Höhen nicht immer gleich für die jeweiligen Fenster sind. Meinen Recherchen nach, liegt das am Fenster-Styling (auch abhängig vom Framework mit dem das jeweilige Programm/Fenster entwickelt wurde) und am Erkennen durch AutoIt, ob es Client oder Window Breiten/Höhen sind. Da lässt sich außer viel viel rechnen pro jeweiliges Fenster, nicht so sehr viel machen.

    pasted-from-clipboard.png

    Ich schaue mal ob ich ein paar Screenshots dazu demnächst teilen kann 🤞 .

    Ansonsten schaue ich mir mal der Skript an und melde mich mit potenziellen Verbesserungen aus meiner Sicht.

    In der Zwischenzeit erhoffe ich mir, dass die wirklich schlauen Köpfe hier, ebenfalls ihre "2 Cents" dazugeben (#insider 😅).

    Viele Grüße
    Sven

  • Beispiele, Gedanken und Tipps bei der Nutzung von INI-Dateien

    • SOLVE-SMART
    • 17. Februar 2023 um 11:12

    Oh wow Andy 👍 ,

    ich bin bei vielen (fast allen) deiner Ausführungen bei dir und dein plakatives Beispiel ist absolut einleuchtend, da gibt es nichts hinzuzufügen. Dennoch kann nicht alles mit simplicity gelöst und umgesetzt werden - es hängt von vielen Faktoren ab, wie komplex eine Anwendung sein muss/wird. Bzgl. der reinen Idee des Threads => "INIs", ist dein Beitrag Gold wert, vielen Dank 🤝 .

    Noch eines bzgl. Agile, aktueller Software-Entwicklung usw.:
    Es gibt so viele Adaptionen des Agile/Scrum-Manifests, dass es unweigerlich zu Problemen bei dem einen oder anderen Team kommen muss.
    Daher empfiehlt es sich ja an Design Pattern und Clean Code Pattern (KISS, DRY, ...) zu orientieren.

    💡 An dieser Stelle breche ich jedoch das Thema ab, denn das passt hier nicht her und sprengt absolut den Rahmen 😅 .

    Fazit: Danke für deine ausführlichen Gedanken und Einschätzungen 👍 . Dies ist absolut hilfreich für INI-Unerfahrene, meiner Meinung nach.

    Viele Grüße
    Sven

  • Beispiele, Gedanken und Tipps bei der Nutzung von INI-Dateien

    • SOLVE-SMART
    • 16. Februar 2023 um 21:34

    Hi zusammen 👋 ,

    wie angekündigt hier endlich das konkrete Beispiel von mir, zu einer Möglichkeit wie man mehrere INIs verwenden/nutzen kann.


    💡 Wichtig zu wissen ist:

    • Allgemein, gehe ich davon aus, dass das jeweilige Programm/Skript (unabhängig vom folgenden Beispiel) zu einer Exe kompiliert wurde und somit kein direkter Einfluss auf das Programm gegeben ist bzw. der Code nicht einfach geändert werden kann.
      • Denn ansonsten braucht es auch keine INI, wenn man es direkt im Code konfiguriert.
    • Nutzer, der Anwendung (wie Dritte, Außenstehende (Stakeholder bspw.)), kennen sich mit dem Programm und dessen Code nicht aus, wollen jedoch dennoch etwas am Programm beeinflussen/ändern.
      • Dies wäre eine Verwendung von Konfigurationsdateien, wie einer INI.
      • Eine weitere Verwendung ist ein Deployment der Anwendung auf verschiedene Server/Maschinen mit verschiedenen Konfigurationen.
    • Das folgenden Beispiel ist bitte auch als Beispiel zu betrachten. Es soll nur darstellen, wie INIs zur Konfiguration dienen/genutzt werden können.
      • Also bitte keine Hinweise das dies oder jenes nicht sinnvoll ist oder keinem echten Anwendungsfall entspricht.
      • Wobei ich mir Mühe gegeben habe, es nicht zu trivial zu gestalten 🤞 .

    🎲 Werden wir mal etwas konkreter. Um meinem Beispiel zu folgen, kann mittels folgendem Skripts die Struktur (Ordner- und Datei-Struktur) angelegt werden.

    AutoIt
    #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y
    #AutoIt3Wrapper_Run_Au3Stripper=y
    #AutoIt3Wrapper_UseUpx=n
    #Au3Stripper_Parameters=/sf /sv /mo /rm /rsln
    
    _Actions()
    
    Func _Actions()
        Local Const $sRootPath    = @DesktopDir
        Local Const $sProject     = 'ini-demo'
        Local Const $sProjectPath = _AddTrailingBackslash($sRootPath) & _AddTrailingBackslash($sProject)
    
        _SetupFolderStructure($sProjectPath)
        _CreateInitialFiles($sProjectPath)
    
        _PrefillMainSourceFile($sProjectPath & 'src\Main.au3')
        _PrefillSettingsIniFile($sProjectPath & 'config\settings.ini')
        _PrefillTestEnvironmentIniFile($sProjectPath & 'config\test-env.ini')
        _PrefillProdEnvironmentIniFile($sProjectPath & 'config\prod-env.ini')
    EndFunc
    
    Func _SetupFolderStructure($sProjectPath)
        Local Const $aFolderList[] = _
            [ _
                'build', _
                'config', _
                'src' _
            ]
    
        For $sFolder In $aFolderList
            DirCreate($sProjectPath & $sFolder)
        Next
    EndFunc
    
    Func _CreateInitialFiles($sProjectPath)
        Local Const $aFileList[] = _
            [ _
                'config\prod-env.ini', _
                'config\settings.ini', _
                'config\test-env.ini', _
                'src\Main.au3' _
            ]
    
        For $sFile In $aFileList
            _WriteFile($sProjectPath & $sFile, '')
        Next
    EndFunc
    
    Func _PrefillMainSourceFile($sMainFile)
        Local Const $aLineList[] = _
            [ _
                '#AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7\r\n', _
                '#AutoIt3Wrapper_AU3Check_Stop_OnWarning=y\r\n', _
                '#AutoIt3Wrapper_Outfile_x64=..\build\Main.exe\r\n', _
                '#AutoIt3Wrapper_Run_Au3Stripper=y\r\n', _
                '#AutoIt3Wrapper_UseUpx=n\r\n', _
                '#Au3Stripper_Parameters=/sf /sv /mo /rm /rsln\r\n\r\n\r\n\r\n', _
                '; autoit options ---------------------------------------------------------------\r\n', _
                'Opt(''MustDeclareVars'', 1)\r\n\r\n\r\n\r\n', _
                '; includes ---------------------------------------------------------------------\r\n', _
                '#include-once\r\n', _
                '#include <File.au3>\r\n\r\n\r\n\r\n', _
                '; initialization ---------------------------------------------------------------\r\n', _
                'Global $hGui, $cFreeTextLabel, $cButton\r\n\r\n\r\n\r\n', _
                '; processing -------------------------------------------------------------------\r\n', _
                '_Actions()\r\n\r\n', _
                'Func _Actions()\r\n', _
                '    Local Const $sSettingsFilePath    = _PathFull(''..\config\settings.ini'')\r\n', _
                '    Local Const $sEnvironmentFilePath = _GetEnvironmentFilePath($sSettingsFilePath)\r\n\r\n', _
                '    $hGui = _CreateGui($sSettingsFilePath)\r\n\r\n', _
                '    _SetGuiDesign($sEnvironmentFilePath)\r\n', _
                '    _CreateDatabaseConnectionLabel($sEnvironmentFilePath)\r\n\r\n', _
                '    $cFreeTextLabel = _CreateFreeTextLabel()\r\n', _
                '    $cButton        = _CreateRefreshFreeTextButton()\r\n\r\n', _
                '    _ShowGui()\r\n', _
                '    _GuiEventListener($sEnvironmentFilePath)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _CreateGui($sSettingsFilePath)\r\n', _
                '    Local Const $iWidth  = IniRead($sSettingsFilePath, ''Gui'', ''Width'', Null)\r\n', _
                '    Local Const $iHeight = IniRead($sSettingsFilePath, ''Gui'', ''Height'', Null)\r\n\r\n', _
                '    Return GUICreate(''ini-demo'', $iWidth, $iHeight)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _GetEnvironmentFilePath($sSettingsFilePath)\r\n', _
                '    Local Const $sEnvironmentFilePath = IniRead($sSettingsFilePath, ''Settings'', ''Environment'', Null)\r\n\r\n', _
                '    Return _PathFull(''..\config\'' & $sEnvironmentFilePath & ''.ini'')\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _SetGuiDesign($sEnvironmentFilePath)\r\n', _
                '    Local Const $iFontSize        = IniRead($sEnvironmentFilePath, ''Gui'', ''FontSize'', Null)\r\n', _
                '    Local Const $vBackgroundColor = IniRead($sEnvironmentFilePath, ''Gui'', ''BackgroundColor'', Null)\r\n\r\n', _
                '    GUISetFont($iFontSize)\r\n', _
                '    GUISetBkColor($vBackgroundColor, $hGui)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _CreateDatabaseConnectionLabel($sEnvironmentFilePath)\r\n', _
                '    Local Const $vLabelColor         = IniRead($sEnvironmentFilePath, ''Gui'', ''LabelColor'', Null)\r\n', _
                '    Local Const $sConnectionStringDb = IniRead($sEnvironmentFilePath, ''Database'', ''ConnectionStringDb'', Null)\r\n\r\n', _
                '    Local Const $cLabel1 = GUICtrlCreateLabel(''Umgebung:'' & @CRLF & _GetFileNameWithoutExtension($sEnvironmentFilePath), 30, 30)\r\n', _
                '    Local Const $cLabel2 = GUICtrlCreateLabel(''ConnectionString:'' & @CRLF & $sConnectionStringDb, 30, 90)\r\n\r\n', _
                '    GUICtrlSetColor($cLabel1, $vLabelColor)\r\n', _
                '    GUICtrlSetColor($cLabel2, $vLabelColor)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _GetFileNameWithoutExtension($sFilePath)\r\n', _
                '    Return StringRegExpReplace($sFilePath, ''^.*\\|\..*$'', '''')\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _CreateFreeTextLabel()\r\n', _
                '    Return GUICtrlCreateLabel('''', 30, 300, 600, 200)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _CreateRefreshFreeTextButton()\r\n', _
                '    Return GUICtrlCreateButton(''Text anzeigen'', 30, 550)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _UpdateFreeTextLabel($sEnvironmentFilePath)\r\n', _
                '    Local Const $sText = IniRead($sEnvironmentFilePath, ''Whatever'', ''FreeText'', Null)\r\n', _
                '    ConsoleWrite($sText & @CRLF)\r\n', _
                '    GUICtrlSetData($cFreeTextLabel, $sText)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _ShowGui()\r\n', _
                '    GUISetState(@SW_SHOW, $hGui)\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _DisposeAndExit()\r\n', _
                '    GUIDelete($hGui)\r\n', _
                '    Exit\r\n', _
                'EndFunc\r\n\r\n', _
                'Func _GuiEventListener($sEnvironmentFilePath)\r\n', _
                '    Local Const $iGuiCloseEvent = -3\r\n\r\n', _
                '    While True\r\n', _
                '        Switch GUIGetMsg()\r\n', _
                '            Case $iGuiCloseEvent\r\n', _
                '                ExitLoop\r\n', _
                '            Case $cButton\r\n', _
                '                _UpdateFreeTextLabel($sEnvironmentFilePath)\r\n', _
                '        EndSwitch\r\n', _
                '    WEnd\r\n\r\n', _
                '    _DisposeAndExit()\r\n', _
                'EndFunc\r\n' _
            ]
    
        For $sLine In $aLineList
            _AppendToFile($sMainFile, StringReplace($sLine, '\r\n', @CRLF))
        Next
    EndFunc
    
    Func _PrefillSettingsIniFile($sSettingsFile)
        Local Const $aLineList[] = _
            [ _
                '[Settings]\r\n', _
                'DebugModeOn = False\r\n', _
                'Environment = test-env\r\n', _
                '; Environment = prod-env\r\n', _
                '\r\n', _
                '[Gui]\r\n', _
                'Width  = 800\r\n', _
                'Height = 600\r\n' _
            ]
    
        For $sLine In $aLineList
            _AppendToFile($sSettingsFile, StringReplace($sLine, '\r\n', @CRLF))
        Next
    EndFunc
    
    Func _PrefillTestEnvironmentIniFile($sSettingsFile)
        Local Const $aLineList[] = _
            [ _
                '[Gui]\r\n', _
                'FontSize        = 14\r\n', _
                'BackgroundColor = 0x254768\r\n', _
                'LabelColor      = 0xD7D7D7\r\n\r\n', _
                '[Database]\r\n', _
                'ConnectionStringDb = "Server=myTestServerAddress;Database=myTestDataBase1;Trusted_Connection=True;"\r\n\r\n', _
                '[Whatever]\r\n', _
                'FreeText = Hier steht nun irgendetwas was zur Laufzeit immer wieder eingelesen wird, wenn der Button "Text anzeigen" verwendet wird.\r\n' _
            ]
    
        For $sLine In $aLineList
            _AppendToFile($sSettingsFile, StringReplace($sLine, '\r\n', @CRLF))
        Next
    EndFunc
    
    Func _PrefillProdEnvironmentIniFile($sSettingsFile)
        Local Const $aLineList[] = _
            [ _
                '[Gui]\r\n', _
                'FontSize        = 9\r\n', _
                'BackgroundColor = 0xD7D7D7\r\n', _
                'LabelColor      = 0x254768\r\n\r\n', _
                '[Database]\r\n', _
                'ConnectionStringDb = "Server=myProdServerAddress;Database=myProdDataBase1;Trusted_Connection=True;"\r\n\r\n', _
                '[Whatever]\r\n', _
                'FreeText = Ersetze in der INI diesen Text mit irgendeinen anderen und nutze den "Text anzeigen" Button.\r\n' _
            ]
    
        For $sLine In $aLineList
            _AppendToFile($sSettingsFile, StringReplace($sLine, '\r\n', @CRLF))
        Next
    EndFunc
    
    Func _AddTrailingBackslash($sPath)
        Return (StringRight($sPath, 1) == '\') ? $sPath : $sPath & '\'
    EndFunc
    
    Func _WriteFile($sFile, $sText)
        Local Const $iUtf8WithoutBomAndOverwriteCreationMode = 256 + 2 + 8
    
        Local $hFile = FileOpen($sFile, $iUtf8WithoutBomAndOverwriteCreationMode)
        FileWrite($hFile, $sText)
        FileClose($hFile)
    EndFunc
    
    Func _AppendToFile($sFile, $sText)
        Local Const $iUtf8WithoutBomAndAppendMode = 256 + 1
    
        Local $hFile = FileOpen($sFile, $iUtf8WithoutBomAndAppendMode)
        FileWrite($hFile, $sText)
        FileClose($hFile)
    EndFunc
    Alles anzeigen

    Hiermit wird auf dem Desktop das Verzeichnis ini-demo angelegt. Danach kann die Main.au3 (das eigentliche Beispiel) verwendet werden. Oder man kompiliert das Programm und führt die Exe im build Verzeichnis aus.


    👓 Das Ganze sieht dann so aus:
    pasted-from-clipboard.png

    Es gibt die settings.ini welche allgemeine Einstellungen beinhaltet, aber auch die Schlüssel "Environment", dessen Wert festlegt welche spezifische Konfiguration (eine weitere INI-Datei) verwendet werden soll. Hierbei gibt es den Wert test-env und prod-env. Je nachdem was in der settings.ini ausgewählt wird, sieht die GUI (welche ich zur Darstellung des Beispiels verwende) unterschiedlich aus.


    👓 test-env:
    pasted-from-clipboard.png

    👓 prod-env:

    pasted-from-clipboard.png

    (1) Der erste Anwendungsfall ist somit die Verwendung von Sub-Konfigurationen, die spezifisch für eine Umgebung gedacht sind. Der Wechsel des Wertes, vom Schlüssel "Environment", in der settings.ini bewirkt die unterschiedlichen Darstellungen und angezeigten Labels, je nach Umgebung. Greifbarer ist sicherlich die Datenbankverbindung, welche mit ConnectionStringDb in der jeweiligen Sub-INI (test-env.ini oder prod-env.ini) dargestellt ist.

    (2) Als zweites Beispiel für die Verwendung von INIs greife ich hier das Aktualisieren von Texten der GUI, zur Laufzeit des Programmes auf. Also wenn der Button "Text anzeigen" gedrückt wird, aktualisiert sich der Label-Text, welcher in der jeweiligen INI hinterlegt ist. Anders als beim Beispiel (1), bei dem nur einmalig die INI-Werte (der Sektionen "GUI" und "Database") gelesen werden, wird hier im Beispiel (2) die INI immer erneut befragt und liefert den dort geänderten Text zurück.


    👓 INI-Nutzung zur Laufzeit:

    Animiertes Bild zum Verständnis (GIF)

    pasted-from-clipboard.gif

    💡 Dies ist zunächst ein Zwischenstand. Ich werde diesen post sicherlich nochmal umformulieren und weiter beschreiben, jedoch erhoffe ich mir jetzt bereits, dass es verständlich ist. Ich freue mich über euer Feedback, Kritik in jeglicher Form oder einfach über Fragen dazu 🤝 .

    Viele Grüße

    Sven

  • GUICtrlScrolltext

    • SOLVE-SMART
    • 16. Februar 2023 um 14:02

    Zu Oscar :

    Auch dir natürlich Danke für das Beispiel bzw. für die UDF 👍 . Ich hatte zwar noch keinen Bedarf für so etwas, dennoch gut zu wissen das es damit einfacher machbar ist, Danke 😀 .

    Viele Grüße
    Sven

  • GUICtrlScrolltext

    • SOLVE-SMART
    • 16. Februar 2023 um 14:00

    Sehr wertvoller Hinweis Velted 👍 , Danke!

    Viele Grüße
    Sven

  • Anzeige langer Bindestrich in Edit

    • SOLVE-SMART
    • 16. Februar 2023 um 13:57

    Eine kleine Bitte hipfzwirgel:
    Kannst du wenn du Code postest, den </> Code-Block dazu nutzen (mit Auswahl "AutoIt" als Syntax-Highlighting). Denn somit kann man besser erfassen was du meinst.
    Außerdem geht so auch deine Formatierung/Einrückung nicht verloren. Ich habe das bei post #1 und #3 mal schnell nachgezogen, also nicht wundern 😇 .

    Viele Grüße
    Sven

  • Beispiele, Gedanken und Tipps bei der Nutzung von INI-Dateien

    • SOLVE-SMART
    • 15. Februar 2023 um 16:23
    Zitat von MojoeB

    Auf der Arbeit funktioniert die Funktion die ich selber gebaut habe. Da ich mir die mühe nicht zweimal machen will, hol ich die Tage die Funktion von der Arbeit und ändere Sie nochmal um.

    Nur die Ruhe MojoeB. Aus meiner Sicht keine Eile, ich schrieb ja extra "[...] Falls du Lust und Zeit haben solltest [...]"

    Zitat von Alina

    Wenn es zuhause nicht einwandfrei arbeitet oder gar nicht, stellt sich mir die Frage, was der Unterschied zwischen "Zuhause" und "Arbeit" ist?

    Ich glaube er meint das der Code-Stand auf der Arbeit ein anderer (neuerer) ist, welcher funktioniert und zu Hause hat er einen alten Stand.
    So habe ich es zumindest verstanden 😀 .

    Viele Grüße
    Sven

  • Probleme beim Empfangen von Modbus-Daten

    • SOLVE-SMART
    • 15. Februar 2023 um 09:44
    Zitat von Moombas

    [...] sondern leider auch GLobale Variablen, die Lokal in einer funktion deklariert werden usw. (macht man nicht) [...]

    Siehe meinen #2 Beitrag 😅 . Ich glaube umso dankbarer wird autoit_dau sein, wenn wir ihn helfen 😇 .

    Viele Grüße
    Sven

  • Probleme beim Empfangen von Modbus-Daten

    • SOLVE-SMART
    • 14. Februar 2023 um 17:59
    Zitat von autoit_dau

    Danke erst mal, ich versuche weiter zu kommen...

    Ja viel Erfolg dabei autoit_dau. Falls du weitere Fragen hast schlage ich vor, dass wir hier, gemeinsam mit dir Stück für Stück an einzelnen Funktionalitäten arbeiten und so nach und nach ein Skript erstellen, denn wie Velted es so treffend ausgedrückt hat 😅 , gibt es bei der Struktur deines Skriptes Verbesserungspotenzial. Dies machte es mir zumindest auch nicht so einfach, dein Code zu sichten (ein Review durchzuführen). Nur als Möglichkeit => "it's up to you".

    Viele Grüße
    Sven

  • Probleme beim Empfangen von Modbus-Daten

    • SOLVE-SMART
    • 13. Februar 2023 um 14:42

    Hi autoit_dau,

    das Review deines Skripts dauert ein wenig, aber vielleicht kannst du mir und den Anderen hier noch etwas helfen, indem du die INI-Datei (@ScriptDir & "\janitza.ini") oder eine Test-Ini bereit stellst, welche wir zur Fehlersuche verwenden können 😀 ?!

    • Ansonten gilt ganz allgemein Global nur außerhalb von Funktionen zu verwenden, da andernfalls der "Au3Check" Warnungen schmeißt.
    • Des Weiteren fehlt die Deklaration von $timer und $hStarttime.
      • Oder sollte $timer eher $hTimer aus Zeile 41 sein?!
    • Ist das Skript nur ein Auszug aus einem größeren oder warum sind so viele Includes (Libraries) eingebunden/vorhanden?
      • Nötig sind anscheinend nur:
    AutoIt
    #include-once
    #include <Array.au3>
    #include <Timers.au3>
    #include <WinAPI.au3>

    💡 Und noch etwas: Der untere Bereich ab Zeile 271 deines Skriptes wird nie erreicht. Denn nach deiner While Schleife gehst du ins Exit.

    Viele Grüße
    Sven

  • CBOR-UDF - (de-)Serialisieren von AutoIt-Variablen von und in ein standardisiertes Binärformat

    • SOLVE-SMART
    • 10. Februar 2023 um 15:33

    Hi AspirinJunkie,


    das ist ehrlich gesagt ziemlich cool 👍 . Ich probiere mich bei Gelegenheit mal ein wenig damit aus und komme ggf. mit Fragen oder "Wünschen" auf dich zu 😅 .
    Danke dir 🤝 .

    Viele Grüße
    Sven

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™