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

  • Artikelpreise aus Onlinekatalog in Rechnungsprogramm oder .xlsx

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

    Hi Swiffer,

    ich war gut beschäftigt in den letzten Tagen, daher nun erst meine Rückmeldung 😇 . Also:

    Zitat von Swiffer

    Das geht ja sehr schnell mit den Daten abfragen. Super! :)

    Ja es muss auch nicht viel mit der Seite/den Seiten getan werden, außer eben das Auslesen von Texten. Daher geht es fix 😀 .

    Zitat von Swiffer

    Es kommt zwar eine Meldung von Cloudflare ich sei blockiert, die Preise werden jedoch trotzdem abgerufen und der "normale" Seitenaufruf funktioniert auch noch.

    Falls du bzw. die Webdriver-Instanz wirklich als blockiert von Cloudflare eingestuft ist/seid (auf Grund des User-Agents, IP etc.), dann prüfe bitte mal ob du wirklich alle Einträge der drei Seiten noch in die CSV generiert/aufgelistet bekommst. Denn es sollten Stand heute (10.02.2023) 122 Produkte sein (wie auf der Webseite gezeigt). D.h. du solltest auch 122 Zeilen (plus den Header) in deiner jeweiligen CSV haben.

    ☝ Falls dies nicht der Fall ist, dann melde dich bitte. Dann muss ich etwas umstellen, damit auch die beiden anderen Seiten (man befindet sich am Anfang auf Seite 1 von 3 ...) wieder gelesen werden.

    Zitat von Swiffer

    Ich habe 18$iDelay jetzt mal auf 600 gesetzt in der Hoffnung weniger Gefahr zu laufen eine IP-Sperre zu erhalten. Vor allem beim testen.

    Das ist egal, wenn du geblockt sein solltest, bringt dir das Delay auch nix mehr 🤣 . Also es dient eher der Robustheit im Ablauf. Wie im post #41 beschrieben, solltest du es nicht unter 300 ms setzen, aber nach oben geht immer (wird nur langsamer die Ausführung damit).

    Zitat von Swiffer

    Frage(n):

    Ich habe 151 in _NavigateTo('https://richner.teamonline.ch/search/?q=f%FCllventil') geändert.

    Die Seite öffnet, das File wird erstellt aber es sind keine Preise enthalten. Es gibt keine Fehlermeldung.

    Muss ich sonst noch etwas ändern, wenn ich die Daten von einer anderen Richner-Seite abrufen möchte?

    Kurz gesagt:
    Das war nicht teil deiner Anforderung am Anfang 😅 , daher geht dies auch nicht so ohne weiteres.

    Ausführlich:
    Je nach Aufbau der verschiedenen Seiten zu denen du navigierst, benötigt es auch teils völlig andere Selektoren um mit den Elementen der Seite zu interagieren. Der Aufbau ist jedoch fast immer gleich. Ich kann dir dabei helfen/dich unterstützen, wenn du mir mal ein, zwei oder drei weitere Seiten von "richner*.ch" schreibst welche du verwenden willst/musst, damit ich erstmal schauen kann ob die Unterschiede groß sind. Bestenfalls kann ich dich dann in die Lage versetzen den bereits vorhandenen Code soweit auszubauen, dass du das selbst erweitern kannst 🤝 .

    Zitat von Swiffer

    Nochmals vielen Dank für Dein Engagement! Es eilt wie immer nicht.

    Gerne 😇 .

    Viele Grüße
    Sven

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

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

    Hi MojoeB,

    Danke dir für dein Statement zur Verwendung des INI Formats 👍 .

    Zitat von MojoeB

    [...] ich nutze meine eigne Funktion, indem ich zwar das ini Format nutze aber dort dann auch um Strings abzulegen die nicht alle sehen sollen, auf Wunsch liest meine func eigne verschlüsselte Dateien aus die im unverschlüsseltem zustand so aufgebaut sind wie eine ini datei, egal ob *ini *txt selbst erstellte Datei Formate. [...]

    Hier würde mich interessieren wie genau das bei dir aussieht? Falls du Lust und Zeit haben solltest, würde ich mich über ein Beispiel freuen, klingt interessant 😀 .

    Zitat von MojoeB

    [...] Ansonsten nutze ich auch noch das Format um von einem Programm Zuweisungen auf ein Fremdes Programm IDs miteinander zu verbinden. [...]

    Auch hier wäre ein Beispiel ziemlich hilfreich. Ich habe zwar ein Bild vor Augen, was du das tust, jedoch ist es anderen ggf. nicht ganz klar, was du damit meinst.

    Zitat von Racer

    [...] Ich sehe den Vorteil von INIs das es viele Programmier- oder Scriptsprachen leicht lesen können. Für ein Projekt wo ich in AutoIT schreibe, der Kollege in Powershell und der Dritte seine VB-Scripts anpasst sind die INIs von ganz großer Bedeutung: Ich schreibe Werte rein, das nächste Tool liest es aus....gibt sicher 1000 andere Möglichkeiten, aber das war am einfachsten. [...]

    Auch dir Racer Danke für deine Beschreibung und Einschätzung 👍 . Ich teile deine Meinung für den von dir beschriebenen Anwendungsfall schon => "Programmier- oder Scriptsprachen können leicht mit INIs umgehen". Doch für andere Anwendungsfälle1 gilt es meiner Wahrnehmung nach nicht, das der Umgang mit INIs einfacher ist als der mit JSON, XML oder YAML.

    Ich versuche, nachdem ich auch ein ganz konkretes INI-Verwendungsbeispiel mal aufgezeigt habe, euren Input und den der anderen hier Beitragenden zusammenzufassen und es im post #1 aufzubereiten/darzustellen 😀 .


    Viele Grüße
    Sven

    1 Ich nehme Bezug auf "Frage/Anregung/Beispiel" im post #10 (ganz unten).

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™