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

Beiträge von BugFix

  • SciTE - Option "MustDeclareVars" mittels Property automatisch setzen

    • BugFix
    • 24. März 2020 um 09:47

    Sorry Bitnugger , dass du jetzt hier schon über ein Jahr in dem Thread auf mich warten musst. ;)

    Das von dir geschilderte Verhalten ist natürlich unerwünscht aber dem Event geschuldet, auf das das Lua Skript reagiert (OnBeforeSave). Ist auch etwas eine Sackgasse, da es ja recht viele Ausnahmebedingungen in unterschiedlichen Konstellationen gibt.

    Ich habe mir jetzt mal eine Notlösung gebastelt, dass ich bei aktiver Option für das gerade offene Skript das Einfügen verhindere. Dazu füge ich (irgendwo im Skript) den Kommentar ;[mdv0] ein. Hier in der Funktion Zeilen 6,7

    Code
    opt.InsertMustDeclare = function(_opt)
        local caret = editor.CurrentPos
        local firstVisible, iDiff = editor.FirstVisibleLine, 0
        -- Inhalt Editor auslesen
        local fileread = editor:GetText()
        -- trotz aktiver Option in einzelnem Skript Abwahl der Option möglich:  ;[mdv0]
        if fileread:find(';%[mdv0%]') then return end
        -- suchen, ob bereits Deklaration vorhanden
        local optstart, optend, opttxt, posval, val = fileread:find('([Oo]pt%s*%(["'.."'"..'][Mm]ust[Dd]eclare[Vv]ars["'.."'"..']%s*,%s*()(%d)%s*%))')
    -- print('Debug: optstart, optend, opttxt, posval, val', optstart, optend, opttxt, posval, val)
        -- abhängig von gesetzter Property
        if _opt == 1 then                    -- Option MIT Deklarationspflicht NUR NEUDATEI
            local bTimeStamp1st = (tonumber(props['Opt.MustDeclareVars.TimeStamp.First']) == 1)
            if bTimeStamp1st then
                local a, e = fileread:find(';%-%- TIME_STAMP.*\r\n')
                editor:InsertText(e, "Opt('MustDeclareVars', 1)\n")    -- in Zeile hinter TimeStamp (und Leerzeile) einfügen
            else
                editor:InsertText(0, "Opt('MustDeclareVars', 1)\n")    -- in erster Zeile einfügen
            end
            iDiff = 1
        elseif _opt == 2 then                -- Option MIT Deklarationspflicht ALLE DATEIEN
            if optstart == nil then                                  -- keine Optionsdeklaration im Skript
                editor:InsertText(0, "Opt('MustDeclareVars', 1)\n")    -- in erster Zeile einfügen
                iDiff = 1
            else                                                    -- Deklaration existiert
                if val == 1 then                                    -- korrekte Option gesetzt
                    return
                else                                                -- Option muss geändert werden
                    editor:SetSelection(posval-1, posval)            -- Wert der Option markieren
                    editor:ReplaceSel(1)                            -- Markierung ersetzen mit "1"
                end
            end
        else                                -- Option OHNE Deklarationspflicht
            if optstart == nil then                                  -- keine Optionsdeklaration im Skript
                return                                                -- keine Aktion erforderlich
            else                                                    -- Deklaration existiert
                if val == 0 then                                    -- korrekte Option gesetzt
                    return
                else                                                -- Option muss geändert werden
                    editor:SetSelection(posval-1, posval)            -- Wert der Option markieren
                    editor:ReplaceSel(0)                            -- Markierung ersetzen mit "0"
                end
            end
        end
        if iDiff == 1 then caret = caret + 27 end                    -- Cursorposition verschiebt sich um Länge des Eintrags
        editor:SetSelection(caret, caret)                            -- Cursor an alte Position setzen
        editor.FirstVisibleLine = firstVisible +iDiff                -- erst sichtbare Zeile an vorige Position
    end
    Alles anzeigen

    Aber ich werde mir mal weiter Gedanken machen, ob sich das anders gestalten lässt. Hauptproblem ist beim Speichern: Woher soll ich wissen ob das der erste Speichervorgang (und somit die Erfordernis zum Einfügen der Option) ist oder ich auf ein existierendes Skript zugreife. Sicher geht das nur über irgendeine Kennzeichnung (wie meine momentane Lösung). Bin da aber völlig offen für Ideen.

  • Hooking & DLL-Injection

    • BugFix
    • 23. März 2020 um 21:48
    Zitat von alpines

    Na klar ist das realisierbar. Siehe AutoIt Debugger

    Das habe ich ja angesprochen, wie sinnfrei das Teil ist.

    Im reinen Interpreter ist live Debuggen nicht möglich. Erst muss der Code insgesamt interpretiert werden, um Wert für Wert Ausgabe, wie bei einem Hochsprachen Debugger zu erhalten.

    Das hat nichts mit Schritt für Schritt zu tun - auch wenn die Ausgabe es vorgaukelt.

  • Hooking & DLL-Injection

    • BugFix
    • 23. März 2020 um 20:27

    Das ist für eine Interpretersprache nicht realisierbar. Es gibt Ansätze, da wird das Skript übersetzt in ein Laufzeitskript (z. B. alle Schleifendurchläufe werden als einzelne Befehlszeilen mit jeweiligen Werten in das Skript geschrieben).

    Kann ich mich nicht mit anfreunden.

    Es ist also kein Problem der IDE, sondern ein Problem der Spracharchitektur.

  • Hooking & DLL-Injection

    • BugFix
    • 23. März 2020 um 11:08
    Zitat von PSblnkd

    Ein weiteres Problem wäre die Erweiterung des SciTE-Editors (IDE) mit der Funktionalität "STEP" u.ä. - so, wie es bei der VBA-IDE üblich ist. Der separate AutoIt-Debugger läuft bei mir leider nicht ... und ich bin es leid immer mit unzähligen MsgBoxen zu arbeiten.

    Was ist STEP? Ich habe schon unzählige AddOns für SciTE erstellt (nimmt ein eigenes Unterforum ein). Wenn es lösbar ist wirds auch gelöst.

    Beschreibe mal das genaue Verhalten in allen Einzelschritten (Taste drücken, Taste lösen, Aktion-vor-Speichern, etc.)

  • Iteratoren - ArrayIter.au3

    • BugFix
    • 23. März 2020 um 10:27
    Zitat von Professor Bernd

    Was hat es denn damit auf sich? Ist das so, damit es nicht in das Script übertragen wird, das die UDF einbindet?

    Ja, wenn das eingebundene Skript die Option enthält und das aufrufende Skript anschließend keine anders lautende Option setzt, gilt das für das gesamte Skript. Eine UDF hat jedoch nicht in die Gestaltung des Main-Skripts einzugreifen.

  • Iteratoren - ArrayIter.au3

    • BugFix
    • 23. März 2020 um 09:08
    Zitat von autoiter

    Mir ist aufgefallen, dass ArrayIter.au3 mit Opt('MustDeclareVars', 1) beginnt. In ein UDF File gehört das nicht.

    Hast recht - das ist der Fluch der Automatisierung. Wenn ich ein au3 Skript speichere wird das automatisch eingefügt.

  • Iteratoren - ArrayIter.au3

    • BugFix
    • 23. März 2020 um 00:01
    Zitat von Xenon

    Aber vielleicht fällt dir ja eine andere Lösung ein.

    Ja, schon erledigt. s. Post 1.

  • Iteratoren - ArrayIter.au3

    • BugFix
    • 22. März 2020 um 23:28

    Wenn man eine Zeit lang in anderen Sprachen programmiert und wieder mit AutoIt skriptet, fällt einem auf, wie nützlich z.B. Iteratoren sind. Leider läßt die AutoIt-Syntax das Definieren von Iteratoren als Parameter nicht direkt zu. Ich habe hier mal Anleihe bei der Programmiersprache nim genommen (oops, das Wortspiel war ungewollt) und dortige Sequence templates (eine Art Makros) für 1D-Array in AutoIt adaptiert.

    Es werden Bedingungen/Operationen an das Array übergeben mit denen über alle Elemente iteriert wird. In den Bedingungen wird "it" als Platzhalter für die Werte, über die iteriert wird, verwendet - s. Bsp.

    AutoIt
     ;-- TIME_STAMP   2020-03-23 00:00:36
    
    Opt('MustDeclareVars', 1)
    
    #include 'ArrayIter.au3'
    
    #cs
    ========================================================================================== FUNCTIONS
        _ArrayFilterIt
            Iteriert über das Array und erstellt ein Ergebnisarray mit den gültigen Werten der Bedingung
    
        _ArrayKeepItIf
            Iteriert über das Array und behält nur die gültigen Werte der Bedingung
    
        _ArrayAllIt
            Prüft ob für alle Einträge des Arrays die Bedingung zutrifft
    
        _ArrayAnyIt
            Prüft ob für mindestens einen Eintrag des Arrays die Bedingung zutrifft
    
        _ArrayMapIt
            Iteriert über das Array und erstellt ein Ergebnisarray mit den Ergebnissen der Operation
    
        _ArrayApplyIt
            Iteriert über das Array und führt die Operation für jedes Element des Arrays aus
    ========================================================================================= /FUNCTIONS
    #ce
    
    Local $aN[] = [10,12,13,15,16,17,19,22,30,40]
    
    ; Rückgabe Array mit allen Treffern (zw. 10 und 20)
    Local $aRes = _ArrayFilterIt($aN, '&it > 10 and &it < 20')
    _ArrayWrite($aRes, '[_ArrayFilterIt] Ergebnisarray: alle Zahlen zw. 10 und 20')
    
    ; Ersetzt das Ausgangsarray mit den Treffern (gerade Zahlen)
    _ArrayKeepItIf($aN, 'Mod(&it, 2) = 0')
    _ArrayWrite($aN, '[_ArrayKeepItIf] alle geraden Zahlen')
    
    ; Prüft ob alle Einträge die Bedingung erfüllen (gerade Zahlen? true/false)
    ConsoleWrite('[_ArrayAllIt] alles gerade? ' & _ArrayAllIt($aN, 'Mod(&it, 2) = 0') & @LF & @LF)
    
    ; Prüft ob ein Eintrag die Bedingung erfüllt (ungerade Zahlen? true/false)
    ConsoleWrite('[_ArrayAnyIt] min. 1-mal ungerade? ' & _ArrayAnyIt($aN, 'Mod(&it, 2)') & @LF & @LF)
    
    ; Ergebnisarray mit Item die der Bedingung entsprechen
    Local $aS[] = ["foo", "bar", "baz", "foobar"]
    $aRes = _ArrayFilterIt($aS, 'StringLen("&it") = 3 and StringMid("&it", 1, 1) = "b"')
    _ArrayWrite($aRes, '[_ArrayFilterIt] Länge=3, beginnt mit "b"')
    
    ; alternativ mit Übergabe einer Funktion
    _ArrayKeepItIf($aS, '_yield("&it")')
    _ArrayWrite($aS, '[_ArrayKeepItIf - yield] Länge=3, beginnt mit "b"')
    
    Func _yield($_p)
        Return (StringLen($_p) = 3 And StringMid($_p, 1, 1) = 'b')
    EndFunc
    
    ; Operation mit jedem Item - neues Array
    Local $aH[] = ["p", "a", "b"]
    $aRes = _ArrayMapIt($aH, '"</" & "&it" & ">"')
    _ArrayWrite($aRes, '[_ArrayMapIt] Tag-Einfassung')
    
    ; Operation mit jedem Item - im Array selbst
    Local $aI[] = [10,20,30,40]
    _ArrayApplyIt($aI, '&it / 5')
    _ArrayWrite($aI, '[_ArrayApplyIt] Division')
    
    
    
    Func _ArrayWrite(ByRef $_a, $_sTitle='')
        Local $s = $_sTitle <> '' ? $_sTitle & @LF : ''
        For $i = 0 To UBound($_a) -1
            $s &= $_a[$i] & '  '
        Next
        ConsoleWrite($s & @LF & @LF)
    EndFunc
    Alles anzeigen

    EDIT 23.03.2020:

    Wie korrekt angemerkt wurde, gehört Opt('MustDeclareVars', 1) nicht in eine UDF. Passiert bei mir automatisch beim Speichern. Habe das nun korrigiert, ebenso ein paar Schreibfehler in den Funktionsbeschreibungen.

    Dateien

    ArrayIter.au3 5,99 kB – 546 Downloads
  • Bat datei ausführen und noch mehr Befehle eingeben

    • BugFix
    • 21. März 2020 um 16:10

    Du kannst das natürlich auch dynamisch machen, indem du aus einer Textdatei die CmdLets zur Laufzeit in das Programm cmdget einliest. Dann brauchst du bei Ergänzungen nicht neu kompilieren.

  • Hooking & DLL-Injection

    • BugFix
    • 21. März 2020 um 13:17
    Zitat von Yjuq

    Das kommt darauf an um was für eine Software es sich handelt und welche Lizenzen damit verbunden sind.

    Genau darauf hatte ich in meinem ersten Post hingewiesen.

  • Bat datei ausführen und noch mehr Befehle eingeben

    • BugFix
    • 21. März 2020 um 12:26
    Zitat von BinSchonDa

    Die Befehle sind zum Teil sehr komplex und sollten eben automatisch eingegeben werden können. Aber ich kann eben nur ein neues Cmd-Fenster öffnen und dann Befehle eingeben lassen.

    Dann speichere die Befehle als CmdLets in einer Datei und ruf sie per Alias ab (Kopieren in die Zwischenablage). Noch als Parameter "?" bzw. "help" um alle Alias mit Befehlen anzeigen zu lassen:

    Dateiname z.B. cmdget.exe. Aufruf: cmdget ALIAS --> z.B. cmdget config

    Code
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;-- TIME_STAMP   2020-03-21 12:23:12
    
    Opt('MustDeclareVars', 1)
    
    
    If $CMDLINE[0] = 0 Then
        ConsoleWrite('Kein CmdLet-Identifier übergeben' & @CRLF)
    Else
        Global $aCmdLet[2][2] = [ _
            ["config", "ipconfig /all"], _
            ["communication", "arp -a"]]
    
        If $CMDLINE[1] = "help" Or $CMDLINE[1] = "?" Then  ; alle Alias & Befehle ausgeben
            Local $sOut = ''
            For $i = 0 To UBound($aCmdLet) -1
                $sOut &= StringFormat('%s:\t%s\n', $aCmdLet[$i][0], $aCmdLet[$i][1])
            Next
            ConsoleWrite($sOut & @CRLF)
            Exit
        EndIf
    
        For $i = 0 To UBound($aCmdLet) -1
            If $aCmdLet[$i][0] = $CMDLINE[1] Then
                ClipPut($aCmdLet[$i][1])
                ConsoleWrite("Befehl in Zwischenablage kopiert" & @CRLF)
                Exit
            EndIf
        Next
        ConsoleWrite(StringFormat('Kein CmdLet mit Namen "%s" gefunden.\n', $CMDLINE[1]))
    EndIf
    Alles anzeigen
  • Hooking & DLL-Injection

    • BugFix
    • 20. März 2020 um 11:24

    Wenn du z.B. zusätzliche Menüpunkte in eine Software durch Hooking integrierst, verwendest du die Software nicht mehr bestimmungsgemäß. Der Autor hat für seine Software ein bestimmtes Verhalten und Aussehen bestimmt. Da darf man nicht ohne Weiteres dran basteln. Ich handhabe das so, dass eine extra Software läuft und wenn ein bestimmtes Menü der Warenwirtschaftssoftware geöffnet wird, blende ich ein Fenster ein mit zusätzlichen Optionen.

    Zitat von PSblnkd

    Auch in Windows selbst kann durch DLL-Injection Zusätzliches oder - leider auch - Gegensätzliches bewirkt werden. Beispielweise kommt im Kontextmenü des Win-Explorers ein zusätzlicher Menüpunkt, wenn das Packerprogramm "winzip" oder "7-zip" installiert wurde.

    Wenn das nicht erlaubt wäre, gäbe es auch nicht die diesbezüglichen WinAPI-Funktionen.

    Einträge für Kontextmenüs werden in die Registry geschrieben, das hat nullkommanix mit Injection zu tun.


    Zitat von PSblnkd

    Was ich nicht verstehe - die AutoIt-UDF _WinAPI_SetWindowsHookEx hat nichts mit der gleichnamigen WinAPI-Funktion zu tun, d.h. sie basiert nicht auf deren Grundlage. Bisher war ich immmer noch der Ansicht, dass die UDFs des "WinAPI Management" einen Teil der in AutoIt umgesetzten WinAPI-Funktionen sind.

    Mit der Meinung bist du aber ganz alleine. Mal in die Includes geguckt? :whistling:

    Zitat von Includes: WinAPISys

    Func _WinAPI_SetWindowsHookEx($iHook, $pProc, $hDll, $iThreadId = 0)

    Local $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", $iHook, "ptr", $pProc, "handle", $hDll, _

    "dword", $iThreadId)


    Zitat von PSblnkd

    Wenn sich hier im deutschen Sprachraum noch niemand damit befasst hat, werde ich mich wohl oder übel durch den englischen Wust wühlen müssen ...

    Benutze mal die Erweiterte Forumssuche, Suchwort "Hook" - 216 Treffer.

  • Hooking & DLL-Injection

    • BugFix
    • 15. März 2020 um 22:51

    Das ist vorrangig ein rechtliches Problem. Die meisten Softwarelizenzen gestatten die Nutzung "as is". Du darfst keine Änderungen vornehmen. Einzige Ausnahmen stellen quelloffene Programme dar.

    Was m. E. möglich ist, da nicht in das Programm eingegriffen wird, sind Overlay Buttons/Menüs.

    Mit den von dir genannten Funktionen kann man durchaus auch direkt in den Programmablauf eingreifen. Aus vorab angeführten Gründen ist dies aber kaum mit Bsp. unterlegt. Es würde auch gegen unsere Forenregeln verstoßen und wird somit nicht supportet.

  • Große Datei durchsuchen - Optimierungsvorschläge gesucht

    • BugFix
    • 15. März 2020 um 13:04

    Also, die Anwendung von GoToDefinition findest du dann z.B. in "AutoIt Tools.lua" in der Funktion "AutoItTools:OpenInclude".

    Die Suche ist hier ganz simpel geregelt: Übergabe Suchbegriff (von Cursorposition) mit Name der Datei, wo zu suchen ist an die Funktion. In Lus ist das mit einer Regex-ähnlichen Suche gelöst.

  • Große Datei durchsuchen - Optimierungsvorschläge gesucht

    • BugFix
    • 15. März 2020 um 12:08

    Es ging doch nur um das Verfahren, wie Begriffe (Definitionen) zu finden sind. Ob diese anschließend als CallTip oder zum Aufruf der Datei mit der Definition und Anzeige derselben verwendet wird, ist letztlich obsolet.

    Darauf wollte ich aufmerksam machen.

  • Große Datei durchsuchen - Optimierungsvorschläge gesucht

    • BugFix
    • 15. März 2020 um 11:50

    Schau dir mal folgende Funktionen im Ordner C:\Program Files (x86)\AutoIt3\SciTE\lua an:

    AutoItGotoDefinition.lua

    AutoItAutoCompletenew.lua

    LUAAutoComplete.lua

    Dort wird das Wesentliche für CallTip und Autovervollständigung geregelt.

    Für andere Sprachen kannst du mit dem Begriff "goto definition" googeln.

  • Installation: 64Bit vs. 32Bit Version

    • BugFix
    • 15. März 2020 um 10:49
    Zitat von TJF

    Mir fällt gerade kein Fall ein, der die 32Bit Version für mich rechtfertigen würde.

    Und so unterschiedlich sind die Betrachtungsweisen. Ich wüsste akut nicht, welchen Vorteil es für meine Programme bringen würde, wenn ich sie in 64Bit AutoIt-Installation erstelle. Insofern ist die benannte Kompatibilität schon ein Grund bei 32Bit zu bleiben. Geht für mich auch in die Richtung: Never change a running system.

  • Große Datei durchsuchen - Optimierungsvorschläge gesucht

    • BugFix
    • 15. März 2020 um 10:34

    Du willst doch CallTip realisieren? Dafür haben doch eigentlich alle Editoren (die Programmier PlugIns haben) bereits die passende Funktion. Heißt auch noch Editorübergreifend fast überall GoToDefinition.

    Du brauchst also das Rad nicht neu erfinden. Die Funktion findest du in diversen Sprachen. SciTE hat sie in Lua, SublimeText in Python, Atom und VSCode verwenden glaub ich JavaScript. Es ist vermutlich einfacher, wenn du diese funktionierenden Funktionen als Blaupause nimmst.

  • Excel - hinterlegte IP auslesen

    • BugFix
    • 13. März 2020 um 08:25

    Hast du mein Makro getestet? Die IP erscheint in deinem Excel als QuickTip. Das Makro ersetzt den Text der Zelle mit dessen QuickTip - also der IP. - Das ist doch, was du wolltest.

  • Excel - hinterlegte IP auslesen

    • BugFix
    • 12. März 2020 um 19:25

    Mit folgendem Makro kannst du auf einen Rutsch alle Einträge mit deren Quick-Infos (IP's) ersetzen.

    C++
    Sub replTxtWithQuick()
        Dim count As Integer
        Dim quick As String
            
        ' count hyperlinks
        count = 0
        For Each Link In ActiveSheet.Hyperlinks
            count = count + 1
        Next
        
        ' replace text with quick info
        For i = 1 To count
            quick = ActiveSheet.Hyperlinks(i).ScreenTip
            If quick <> "" Then
                ActiveSheet.Hyperlinks(i).TextToDisplay = quick
            End If
        Next
    End Sub
    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™