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

  • Tv Steuerung

    • BugFix
    • 24. Februar 2020 um 10:28

    Übrigens ist es gerade bei mehrdimensionalen Array eine Hilfe, wenn man die Indizes "sprechend" enumeriert, d.h. ihnen Variablennamen zuordnet, die leicht auf den Inhalt schließen lassen.

    C++
    ; Enumerieren der Indizes in "sprechende" Variablen für die Zeilen des Arrays
    Global Enum $TV1, $TV2, $Beamer, $VW, $D_Box, $PC
    
    ; Enumerieren der Spaltenindizes
    Global Enum $IP, $Port, $Name
    
    Global $iDefaultPort = 443, $iNecPort = 8080
    ; Dein Array
    Global $aDevices[][] = _
    [["192.168.0.10",$iDefaultPort, "TV 1"], _
    ["192.168.0.11",$iDefaultPort, "TV 2"], _
    ["192.168.0.12",$iDefaultPort, "Beamer"], _
    ["192.168.0.13",$iNecPort, "VW"], _
    ["192.168.0.14",$iNecPort, "D-Box"], _
    ["192.168.0.15",$iDefaultPort, "PC"]]
    
    ; Zugriff
    ConsoleWrite('IP  (D-Box): ' & $aDevices[$D_Box][$IP] & @CRLF)
    ConsoleWrite('Port (TV 1): ' & $aDevices[$TV1][$Port] & @CRLF)
    Alles anzeigen
  • TextToSpeech - mal wieder eine Zeitansage: SayTheTime

    • BugFix
    • 20. Februar 2020 um 22:20

    Vor laaanger Zeit hatten wir mal intensiv mit TextToSpeech gespielt. Dabei war übrigens dieses Skript entstanden.

    Das war mir jetzt in die Hände gefallen und ich habe es mal überarbeitet. Neben der Ausgabe der Zeit im offiziellen Modus sind 3 regionale Varianten wählbar. Variante 'A' (meine Heimat) ist schon etwas schräg und sicherlich für den einen oder anderen schwer verdaulich. :rofl:

    Skript und Bsp. sagen eigentlich alles notwendige.

    SayTheTime.au3
    C++
    ;-- TIME_STAMP   2020-02-20 21:49:32   v 0.1
    
    
    Opt('MustDeclareVars', 1)
    
    #cs
    
    Deutsche Stimme für Sprachausgabe herunterladen:  http://ulrichhanke.de/26/StimmeSteffi.html
    und installieren.
    
    Uhrzeitangaben, Stunden von 0 bis 23
    
    $_sType '' (Standard) , Uhzeitangabe im offiziellen Sprachgebrauch
        12:00               zwölf Uhr
        12:01 bis 12:59     zwölf Uhr und n Minute/n
        13:00               dreizehn Uhr
    
    
    Uhrzeitangaben, Stunden von 1 bis 12 , verbreitete regionale Angaben
    
    $_sType 'A' , very crazy :=) , Region: Magdeburger Börde/Altmark
        12:00               zwölf Uhr                                   STUNDE
        12:01 bis 12:10     1 bis 10 Minuten NACH zwölf                 MINUTEN nach STUNDE
        12:11 bis 12:14     4 bis 1 Minuten VOR VIERTEL eins            MINUTEN vor VIERTEL angefangene STUNDE
        12:15               VIERTEL eins                                VIERTEL angefangene STUNDE
        12:16 bis 12:19     1 bis 4 Minuten NACH VIERTEL eins           MINUTEN nach VIERTEL angefangene STUNDE
        12:20 bis 12:29     10 bis 1 Minuten VOR HALB eins              MINUTEN vor HALB angefangene STUNDE
        12:30               HALB eins                                   HALB angefangene STUNDE
        12:31 bis 12:40     1 bis 10 Minuten NACH HALB eins             MINUTEN nach HALB angefangene STUNDE
        12:41 bis 12:44     4 bis 1 Minuten VOR DREIVIERTEL eins        MINUTEN vor DREIVIERTEL angefangene STUNDE
        12:45               DREIVIERTEL eins                            DREIVIERTEL angefangene STUNDE
        12:46 bis 12:49     1 bis 4 Minuten NACH DREIVIERTEL eins       MINUTEN nach DREIVIERTEL angefangene STUNDE
        12:50 bis 12:59     10 bis 1 Minuten VOR eins                   MINUTEN vor angefangene STUNDE
    
    $_sType 'B' , Region vorwiegend: Mittel-/Norddeutschland
        12:00               zwölf Uhr                                   STUNDE
        12:01 bis 12:14     1 bis 14 Minuten NACH zwölf                 MINUTEN nach STUNDE
        12:15               VIERTEL eins                                VIERTEL angefangene STUNDE
        12:16 bis 12:29     14 bis 1 Minuten VOR HALB eins              MINUTEN vor HALB angefangene STUNDE
        12:30               HALB eins                                   HALB angefangene STUNDE
        12:31 bis 12:44     1 bis 14 Minuten NACH HALB eins             MINUTEN nach HALB angefangene STUNDE
        12:45               DREIVIERTEL eins                            DREIVIERTEL angefangene STUNDE
        12:46 bis 12:59     14 bis 1 Minuten VOR eins                   MINUTEN vor angefangene STUNDE
    
    $_sType 'C' , Region vorwiegend: Süddeutschland
        12:00               zwölf Uhr                                   STUNDE
        12:01 bis 12:14     1 bis 14 Minuten NACH zwölf                 MINUTEN nach STUNDE
        12:15               VIERTEL NACH zwölf                          VIERTEL nach STUNDE
        12:16 bis 12:19     16 bis 19 Minuten nach zwölf                MINUTEN nach STUNDE
        12:20 bis 12:29     10 bis 1 Minuten VOR HALB eins              MINUTEN vor HALB angefangene STUNDE
        12:30               HALB eins                                   HALB angefangene STUNDE
        12:31 bis 12:40     1 bis 10 Minuten NACH HALB eins             MINUTEN nach HALB angefangene STUNDE
        12:41 bis 12:44     19 bis 16 Minuten VOR eins                  MINUTEN vor angefangene STUNDE
        12:45               VIERTEL VOR eins                            VIERTEL vor angefangene STUNDE
        12:46 bis 12:59     14 bis 1 Minuten VOR eins                   MINUTEN vor angefangene STUNDE
    
    #ce
    
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _SayTheTime
    ; Description ...: Use TextToSpeech with the passed time string.
    ; Syntax ........: _SayTheTime([$_sTime = ''])
    ; Parameters ....: $_sTime              - [optional] The time string. Default is '', current time.
    ; ...............:                        Pass a defined time with the function "_GetTime".
    ; Return values .: None
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _SayTheTime($_sTime='')
        $_sTime = $_sTime = '' ? _GetTime() : $_sTime
        Local Static $bInit = False
        Local Static $oTalk
        If Not $bInit Then $bInit = __InitSAPI($oTalk)
        If $bInit Then $oTalk.Speak($_sTime)
    EndFunc
    
    
    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GetTime
    ; Description ...: Creates a time string for a passed or (by default) the current time with a selected type.
    ; Syntax ........: _GetTime([$_hr = -1[, $_min = -1[, $_sType = '']]])
    ; Parameters ....: $_hr                 - [optional] The hour. Default is -1, current hour.
    ;                  $_min                - [optional] The minute. Default is -1, current minute.
    ;                  $_sType              - [optional] The way of speaking. Default is '', the official kind.
    ; Return values .: The time string.
    ; Author ........: BugFix
    ; ===============================================================================================================================
    Func _GetTime($_hr=-1, $_min=-1, $_sType='')
        $_hr = $_hr = -1 ? Int(@HOUR) : $_hr
        $_min = $_min = -1 ? Int(@MIN) : $_min
        Local Static $aHour[] = ['Zwölf','Eins','Zwei','Drei','Vier','Fünf','Sechs','Sieben','Acht','Neun','Zehn','Elf','Zwölf', _
                                 'Eins','Zwei','Drei','Vier','Fünf','Sechs','Sieben','Acht','Neun','Zehn','Elf']
        Local Static $aMin[] = ['','Eine','Zwei','Drei','Vier','Fünf','Sechs','Sieben','Acht','Neun','Zehn','Elf','Zwölf', _
                                'Dreizehn','Vierzehn','','Sechzehn','Siebzehn','Achtzehn','Neunzehn']
        Local $sMin = '', $sConnect = '', $sQuart = '', $sHour = $aHour[$_hr], $sUnit = 'Minuten '
        If $_sType = '' Then ; offizielle Zeit
            Switch $_min
                Case 0
                    $sMin = ''
                Case 1
                    $sMin = ' und eine Minute'
                Case Else
                    $sMin = ' und ' & $_min & ' Minuten'
            EndSwitch
            Return StringFormat('%s Uhr%s', $_hr, $sMin)
        EndIf
        Local $bNextHour = $_min = 0 ? False : True
    
        Switch $_min
            Case 1 To 10
                $sMin = $aMin[$_min]
                $sConnect = 'Nach'
                $bNextHour = False
            Case 11 To 14
                $sMin = $_sType='A' ? $aMin[15-$_min] : $aMin[$_min]
                $sConnect = $_sType='A' ? 'Vor' : 'Nach'
                $sQuart = $_sType='A' ? 'Viertel' : ''
                $bNextHour = $_sType='A' ? True : False
            Case 15
                $sMin = $_sType='C' ? 'Viertel' : ''
                $sConnect = $_sType='C' ? 'Nach' : ''
                $sQuart = $_sType='C' ? '' : 'Viertel'
                $bNextHour = $_sType='C' ? False : True
            Case 16 To 19
                $sMin = $_sType='A' ? $aMin[$_min-15] : ($_sType='C' ? $aMin[$_min] : $aMin[30-$_min])
                $sConnect = StringInStr('AC',$_sType) ? 'Nach' : 'Vor'
                $sQuart = $_sType='A' ? 'Viertel' : ($_sType='C' ? '' : 'Halb')
                $bNextHour = $_sType='C' ? False : True
            Case 20 To 29
                $sMin = $aMin[30-$_min]
                $sConnect = 'Vor'
                $sQuart = 'Halb'
            Case 30
                $sMin = ''
                $sConnect = ''
                $sQuart = 'Halb'
            Case 31 To 40
                $sMin = $aMin[$_min-30]
                $sConnect = 'Nach'
                $sQuart = 'Halb'
            Case 41 To 44
                $sMin = $_sType='A' ? $aMin[45-$_min] : ($_sType='C' ? $aMin[60-$_min] : $aMin[$_min-30])
                $sConnect = StringInStr('AC',$_sType) ? 'Vor' : 'Nach'
                $sQuart = $_sType='A' ? 'Dreiviertel' : ($_sType='C' ? '' : 'Halb')
            Case 45
                $sMin = $_sType='C' ? 'Viertel' : ''
                $sConnect = $_sType='C' ? 'Vor' : ''
                $sQuart = $_sType='C' ? '' : 'Dreiviertel'
            Case 46 To 49
                $sMin = $_sType='A' ? $aMin[$_min-45] : $aMin[60-$_min]
                $sConnect = $_sType='A' ? 'Nach' : 'Vor'
                $sQuart = $_sType='A' ? 'Dreiviertel' : ''
            Case 50 To 59
                $sMin = $aMin[60-$_min]
                $sConnect = 'Vor'
                $sQuart = ''
        EndSwitch
        $sUnit = $_min > 1 ? (($_min=15 Or $_min=45) ? '' : $sUnit) : 'Minute '
    
        If $bNextHour Then ; Zeitangabe als Teil der folgenden Stunde
            $_hr = $_hr = 23 ? 0 : $_hr +1
            $sHour = $aHour[$_hr]
        EndIf
    
        Return StringFormat('%s%s%s%s%s%s%s%s', $sMin, ($sMin=''?'':' '), ($sMin=''?'':$sUnit), _
            $sConnect, ($sConnect=''?'':' '), $sQuart, ($sQuart=''?'':' '), $sHour)
    EndFunc
    
    
    ; #INTERNAL_USE_ONLY# ===========================================================================================================
    ; Name ..........: __InitSAPI
    ; Description ...: Creates the SAPI.SpVoice-Object and select the german voice.
    ; ===============================================================================================================================
    Func __InitSAPI(ByRef $_oTalk)
        $_oTalk = ObjCreate('SAPI.SpVoice')
        If Not IsObj($_oTalk) Then
            MsgBox(16, 'FEHLER', '"SAPI.SpVoice" ist nicht installiert')
            Return False
        EndIf
        Local $oVoices = $_oTalk.GetVoices("Language=407")
        If $oVoices.Count < 1 Then
            MsgBox(16, 'FEHLER', 'Keine deutsche Stimme installiert')
            Return False
        EndIf
        $_oTalk.Voice = $oVoices.Item(0)
        Return True
    EndFunc
    Alles anzeigen
    Bsp.
    C++
    ;-- TIME_STAMP   2020-02-20 21:52:11
    
    Opt('MustDeclareVars', 1)
    
    #include 'SayTheTime.au3'
    
    ; "Offizielle Zeit" (jetzt)
    _SayTheTime()
    Sleep(1000)
    
    ; Regionale Variante 'A' (jetzt)
    _SayTheTime(_GetTime(-1, -1, 'A'))
    Sleep(1000)
    
    ; Regionale Variante 'B' (jetzt)
    _SayTheTime(_GetTime(-1, -1, 'B'))
    Sleep(1000)
    
    ; Regionale Variante 'C' (jetzt)
    _SayTheTime(_GetTime(-1, -1, 'C'))
    Sleep(1000)
    
    ; jetzt alle 4 Varianten mit vorgegebener Zeit (17:19)
    Local $hh = 17, $mm = 19
    
    ; "Offizielle Zeit"
    _SayTheTime(_GetTime($hh, $mm))
    Sleep(1000)
    
    ; Regionale Variante 'A'
    _SayTheTime(_GetTime($hh, $mm, 'A'))
    Sleep(1000)
    
    ; Regionale Variante 'B'
    _SayTheTime(_GetTime($hh, $mm, 'B'))
    Sleep(1000)
    
    ; Regionale Variante 'C'
    _SayTheTime(_GetTime($hh, $mm, 'C'))
    Alles anzeigen

    Dateien

    SayTheTime[0.1].au3 8,34 kB – 462 Downloads SayTheTime_Bsp.au3 753 Byte – 560 Downloads
  • Auswahl verarbeiten

    • BugFix
    • 20. Februar 2020 um 10:31

    Auch wenn es inhaltlich absolut identisch ist, gefällt mir diese kurze Variante besser:

    C++
    Global Enum Step *2 $DRIVE, $PATH, $NAME, $EXT
    Global $aDatei[4] = ["C:\", "Ordner1\Unterordner1\", "Datei", ".exe"]
    
    ConsoleWrite(_GetPathInfo($aDatei, BitOR($PATH, $NAME)) & @CRLF)
    
    Func _GetPathInfo($_aFile, $_iSelect)
        Local $sOut = BitAND($_iSelect, $DRIVE) ? $_aFile[0] : ''
        $sOut &= BitAND($_iSelect, $PATH) ? $_aFile[1] : ''
        $sOut &= BitAND($_iSelect, $NAME) ? $_aFile[2] : ''
        $sOut &= BitAND($_iSelect, $EXT) ? $_aFile[3] : ''
        Return $sOut
    EndFunc
    Alles anzeigen
  • AutoItX - das unbekannte Wesen

    • BugFix
    • 20. Februar 2020 um 09:22
    Zitat von Professor Bernd

    dass die Standard-Installation von AutoIt3 auch AutoItX installiert und es somit jeder auf seinem PC nutzen kann, wenn er AutoIt3 installiert hat.

    Ja, so ist es.

    Aber dran denken: AutoItX3.dll enthält ausschließlich die nativen AutoIt-Funktionen. UDF aus der Installation oder eigene Funktionen kannst du damit nicht ansprechen.

    AutoItX3 ist übrigens ganz praktisch, wenn man statt z.B. Excel aus einem AutoIt-Skript heraus zu manipulieren, AutoIt in die VBA-Umgebung einbindet und inside AutoIt verwendet (s. hier).

  • PSPad4AutoIt3 (Editor IDE)

    • BugFix
    • 17. Februar 2020 um 21:22

    Packs doch vorübergehend einfach auf ein Google Drive und poste den Freigabelink. Da hast du 15 GB Platz. :P

  • Ausgabe in DOS-Fenster umleiten

    • BugFix
    • 17. Februar 2020 um 11:24

    Du kannst doch ein Skript mit GUI auch als cui Kompilieren. Dann klappt das mit der Ausgabe in die Windows-Shell.

    Folgendes Skript als cui kompiliert und aus der Windows-Shell gestartet:

    C++
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=test_GUI.exe
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    
    GUICreate('Test')
    $bt1 = GUICtrlCreateButton('Button 1', 10, 10, 80, 22)
    $bt2 = GUICtrlCreateButton('Button 2', 10, 40, 80, 22)
    GUISetState()
    
    ConsoleWrite('GUI wird angezeigt' & @CRLF)
    
    While True
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case -3
                ConsoleWrite('Programm wird beendet' & @CRLF)
                Exit
            Case $bt1, $bt2
                ConsoleWrite('geklickt: ' & GUICtrlRead($nMsg) & @CRLF)
                MsgBox(0, '', 'geklickt: ' & GUICtrlRead($nMsg))
        EndSwitch
    WEnd
    Alles anzeigen

    GUI_cui-compiled.PNG

  • Ausgabe in DOS-Fenster umleiten

    • BugFix
    • 17. Februar 2020 um 10:32
    Zitat von Domi78

    dass es nicht möglich ist, mit ConsoleWrite() die Ausgabe auf die Eingabeaufforderung umzuleiten, ohne das Programm als DOS-Programm zu kompilieren.

    Ich verstehe den Hintergrund nicht. Möchte ich beim Ausführen einer *.au3 eine Konsolenausgabe, landet diese im Konsolenfenster des Editors, in dem die *.au3 geöffnet ist - das passt.

    Mir fällt eigentlich keine Situation ein, in der ich aus der Entwicklungsumgebung eine Ausgabe in die Windows-Konsole senden wollte. Vielleicht kannst du ja mal ein entsprechendes Szenario erklären?

  • Visual Studio Code & AutoIt

    • BugFix
    • 17. Februar 2020 um 09:37
    Zitat von PixelStorm

    ich weiss nicht ob ich deinen Post richtig verstanden habe, aber bei mir funktioniert die Ausgabe von Array Variablen auch.

    Hast du leider missverstanden.

    Es geht um das Setzen des Cursors in die Variable und das Einfügen einer Debugzeile für diese Variable.

    Bsp.

    C++
    ; Pipe ist die Cursorposition
    For $i = 0 To UBound($aTest) -1
        $a|Test[$i] = $aTest[$i] *2
    Next

    Wenn ich jetzt den Shortcut für DebugToConsole ausführe sieht das bei VSCode so aus:

    C++
    For $i = 0 To UBound($aTest) -1
        $aTest[$i] = $aTest[$i] *2
        ;### Debug CONSOLE ↓↓↓
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aTest = ' & $aTest & @CRLF & '>Error code: ' & @error & @CRLF)
    Next

    Das ist natürlich falsch. Ich will ja den Wert des Arrays am Index $i ausgeben.

    Für SciTE habe ich diese Funktion umgeschrieben und bekomme für DebugToConsole folgenden Output:

    C++
    For $i = 0 To UBound($aTest) -1
        $aTest[$i] = $aTest[$i] *2
    ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aTest[" & $i & "] --> " & $aTest[$i] & @LF)
    Next
    
    ; ich habe 3 Debugvarianten:
    ; - nur Wert (wie oben)
    ; - Wert & @error (ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aTest[" & $i & "] --> " & $aTest[$i] & @LF & "!@ " & @TAB & "#Error: " & @error & @LF))
    ; - Wert & @error & @extended (ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $aTest[" & $i & "] --> " & $aTest[$i] & @LF & "!@ " & @TAB & "#Error: " & @error & @TAB & "#Extended: " & @extended & @LF)) 

    Meine Debugversion erfasst auch den Schleifenzähler allein ( also Cursor in $|i und dann Debugaufruf). Da wirft VSC einen Fehler.

  • Eingabe in Inputboxen in Großbuchstaben wandeln

    • BugFix
    • 16. Februar 2020 um 12:12
    Zitat von Frank_S

    Ist aber extrem aufwändig und ich überlege aus diesem Grund, AutoIt schnell wieder den Rücken zu kehren und mir eine logischere Programmiersprache zu suchen.

    Das soll aufwändig sein? :rofl:

    Mit folgendem AutoIt-Code wird eine GUI mit Standardschaltflächen angezeigt und auf den Close-Button reagiert:

    C++
    GUICreate()
    GUISetState()
    Do
    Until GUIGetMsg() = -3

    Nur 4 Zeilen!!

    Nun mach dasselbe mal in C / C++. Würde so aussehen:

    C++
    #include <windows.h>
    const char g_szClassName[] = "myWindowClass";
    // the Window Procedure
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
        //Step 1: Registering the Window Class
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
        if(!RegisterClassEx(&wc))
        {
            MessageBox(NULL, "Window Registration Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
        // Step 2: Creating the Window
        hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            g_szClassName,
            "The title of my window",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
            NULL, NULL, hInstance, NULL);
        if(hwnd == NULL)
        {
            MessageBox(NULL, "Window Creation Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);
        // Step 3: The Message Loop
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    Alles anzeigen

    Soviel zum Thema Aufwand.

    "logischere" ? - Was ist das denn für eine Wortschöpfung? Entweder logisch oder unlogisch. Und Programmiersprachen können per se niemals unlogisch sein - nicht mal Brainfuck. :P

  • Eingabe in Inputboxen in Großbuchstaben wandeln

    • BugFix
    • 16. Februar 2020 um 11:41

    Es geht NUR mit GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')!

    Du kannst nicht auf die GUIMsg(Inputfeld) reagieren. Das hatte ich doch schon in meinem ersten Beitrag geschrieben. Hast du mein Bsp. überhaupt getestet?

    Ich habe deinen Code mal angepasst (und etwas schlanker gemacht):

    C++
    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    #Region ### START Koda GUI section ### Form=h:\downloads\koda designer autoit\forms\pkt_01.kxf
    Global $Form1 = GUICreate("PosKomTool", 900, 770, 319, 134)
    Global $MenuItem1 = GUICtrlCreateMenu("&Datei")
    Global $MenuItem3 = GUICtrlCreateMenuItem("Datei speichern", $MenuItem1)
    Global $MenuItem2 = GUICtrlCreateMenuItem("Beenden", $MenuItem1)
    Global $MenuItem4 = GUICtrlCreateMenu("&Extras")
    Global $MenuItem7 = GUICtrlCreateMenuItem("Einstellungen", $MenuItem4)
    Global $MenuItem6 = GUICtrlCreateMenuItem("Einst. sichern", $MenuItem4)
    Global $MenuItem5 = GUICtrlCreateMenu("&Hilfe")
    Global $MenuItem8 = GUICtrlCreateMenuItem("Über", $MenuItem5)
    Global $btnNeu = GUICtrlCreateButton("&Neues Ticket", 424, 64, 193, 40)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0x00FF00)
    Global $fraHardware = GUICtrlCreateGroup("Hardware von:", 24, 112, 377, 417)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    GUICtrlSetBkColor(-1, 0xC0C0C0)
    GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM + $GUI_DOCKHCENTER)
    ; Button-ID in einem Array auffangen. Erstes Element: "$aBtn[$Bt1]" = "Button1"
    Global Enum $Bt1, $Bt2, $Bt3, $Bt4, $Bt5, $Bt6, $Bt7, $Bt8, $Bt9, $Bt10, $Bt11, $Bt12, $Bt13, $Bt14, $Bt15, $Bt16, $Bt17, $Bt18, $Bt19, $Bt20
    Global $aBtn[20], $iX = 40, $iY = 152-36
    For $i = 0 To 19
        $iY += 36
        $aBtn[$i] = GUICtrlCreateButton('Button' & $i+1, $iX, $iY, 165, 33)
        If $i = 9 Then
            $iX = 214
            $iY = 152-36
        EndIf
    Next
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    Global $comUser = GUICtrlCreateCombo("", 624, 64, 201, 40, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL, $CBS_NOINTEGRALHEIGHT, $CBS_UPPERCASE))
    GUICtrlSetData(-1, "POSREPAIR|F.SCHOENBRODT|M.FISCHER|S.BRAEKER", "POSREPAIR")
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    Global $txtKunde = GUICtrlCreateInput("", 424, 120, 49, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
    GUICtrlSetLimit(-1, 3)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    Global $txtVST = GUICtrlCreateInput("123456789012", 477, 122, 137, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
    GUICtrlSetLimit(-1, 12)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    Global $txtID = GUICtrlCreateInput("20191206-1000001082", 622, 121, 201, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
    GUICtrlSetLimit(-1, 12)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    Global $txtBemerkung = GUICtrlCreateEdit("", 24, 48, 241, 57)
    GUICtrlSetData(-1, "txtBemerkung")
    Global $comPakete = GUICtrlCreateCombo("", 424, 160, 193, 30, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "x|kein Versand|1|2|3|4|5|6|7|8|9|10")
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    
    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                Exit
            Case $btnNeu
            Case $comUser
            Case $comPakete
            Case $aBtn[$Bt1]
                ConsoleWrite('Button1' & @CRLF)
            Case $aBtn[$Bt2]
                ConsoleWrite('Button2' & @CRLF)
        EndSwitch
    WEnd
    
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $iIDFrom = BitAND($iwParam, 0xFFFF)                 ; Low Word
        Local $iCode = BitShift($iwParam, 16)                     ; Hi Word
        If $iIDFrom <> $txtKunde Then Return $GUI_RUNDEFMSG       ; Msg kommt nicht von zu kontrollierendem Input
        If $iCode = $EN_CHANGE Then                               ; Inhalt wurde geändert
            Local $sRead = GUICtrlRead($iIDFrom)                  ; Inhalt Input lesen
            If StringLen($sRead) = 0 Then Return $GUI_RUNDEFMSG   ; Input ist leer
            GUICtrlSetData($iIDFrom, StringUpper($sRead))         ; Text zurückschreiben in Inputfeld
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc  ;==>WM_COMMAND
    Alles anzeigen
  • Eingabe in Inputboxen in Großbuchstaben wandeln

    • BugFix
    • 15. Februar 2020 um 21:00

    Ich nehme an, $txtKunde ist das Inputfeld?

    Du musst erst den Inhalt des Feldes lesen ( GuiCtrlRead($txtKunde) ) , den Inhalt umwandeln und dann in das Feld zurück schreiben.

  • Eingabe in Inputboxen in Großbuchstaben wandeln

    • BugFix
    • 15. Februar 2020 um 18:07

    Du registrierst die Message, wertest die Eingabe aus und schreibst (bei Bedarf) die korrigierte Eingabe zurück:

    C++
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    Global $hGui = GUICreate('Test')
    Global $cInput = GUICtrlCreateInput('', 20, 20, 150, 20)
    
    GUISetState()
    
    GuiRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    
    While 1
        Switch GUIGetMsg()
            Case -3
                Exit
        EndSwitch
    WEnd
    
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
        If $iIDFrom <> $cInput Then Return $GUI_RUNDEFMSG
        Local $sRead = GUICtrlRead($iIDFrom)
        Local $iLen = StringLen($sRead)
        If $iLen = 0 Then Return $GUI_RUNDEFMSG
        Local $sLastChar = StringRight($sRead, 1)
        Local $iAscii = Asc($sLastChar)
        Local $sReplace = $sLastChar
        If $iAscii > 96 And $iAscii < 123 Or _
           $iAscii = 228 Or $iAscii = 246 Or $iAscii = 252 Then $sReplace = Chr($iAscii-32) ; oder: = StringUpper($sLastChar)
        GUICtrlSetData($iIDFrom, StringLeft($sRead, $iLen-1) & $sReplace)
        Return $GUI_RUNDEFMSG
    EndFunc  ;==>WM_COMMAND
    Alles anzeigen


    EDIT:

    Ich hatte schon viel zu kompliziert gedacht. StringUpper reagiert ja sowieso nur auf Buchstaben, eine vorherige Prüfung ist also sinnlos.

    C++
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
        Local $iIDFrom = BitAND($iwParam, 0xFFFF)           ; Low Word
        If $iIDFrom <> $cInput Then Return $GUI_RUNDEFMSG   ; Msg kommt nicht von zu kontrollierendem Input
        Local $sRead = GUICtrlRead($iIDFrom)                ; Inhalt Input lesen
        If StringLen($sRead) = 0 Then Return $GUI_RUNDEFMSG ; Input ist leer
        GUICtrlSetData($iIDFrom, StringUpper($sRead))       ; Text zurückschreiben in Inputfeld
        Return $GUI_RUNDEFMSG
    EndFunc  ;==>WM_COMMAND
  • Visual Studio Code & AutoIt

    • BugFix
    • 15. Februar 2020 um 14:37

    Ich habe mal nachgeschaut, inzwischen gibt es eine AutoIt-Erweiterung von Damien, die soweit gut funktioniert.

    Was mir nach wie vor nicht gefällt: Die Debug-Ausgabe funktioniert nicht mit Array-Variablen und die Variablen müssen mindestens 2 Zeichen lang sein (nach dem $) um erkannt zu werden.
    Vermutlich kann man zur Erkennung eine eigene Funktion schreiben (wie ich es für SciTE gemacht habe) - aber wie gesagt: JS ist echt nicht mein Ding.

  • Kreisausschnitt mittels _GDIPlus_ und PixelCheckSum

    • BugFix
    • 13. Februar 2020 um 12:40
    C++
    ; Ergebnis einer ganzzahligen Division ist ein Integerwert
    Local $Zahl = 6 / 2
    ConsoleWrite('IsInt(6/2) '& (IsInt($Zahl) ? 'JA' : 'NEIN')& @CRLF)
    
    ; Umwandeln in Hex sollte "0x00000003" ergeben
    Local $sHex1 = '0x' & Hex(6/2)
    Local $sHex2 = '0x' & Hex(Int(6/2))
    Local $sHex3 = '0x' & Hex(3)
    Local $sHex4 = '0x' & Hex(3.0)
    ConsoleWrite('   6 / 2 =  ' & $sHex1 & @CRLF)
    ConsoleWrite('Int(6/2) =  ' & $sHex2 & @CRLF)
    ConsoleWrite('       3 =  ' & $sHex3 & @CRLF)
    ConsoleWrite('     3.0 =  ' & $sHex4 & @CRLF)
    Alles anzeigen

    Das führt zu einem falschen Ergebnis.

    Obwohl "6 / 2" ein Integerwert ist, wird dieser von der Hexfunktion nicht als solcher erkannt.

    Zitat

    Function Hex

    Numbers passed as non-integers (those with decimal separator or exponent) are processed as doubles.

    Das Ergebnis ist (auch aus Sicht der AutoItfunktion "IsInt") ein Integer, tatsächlich ergibt 6/2 aber nicht 3, sondern 3.0! Und das ist ein Double.

    Erst mit "Hex(Int($Zahl))" erhält man das erwartete Ergebnis.

    Und die Länge 1 ist völlig korrekt, Vornullen zählen nicht.

  • Visual Studio Code & AutoIt

    • BugFix
    • 13. Februar 2020 um 12:14

    OK, dann gibt es wahrscheinlich ein neues AutoIt Repository. Ich hatte das mal vor gut einem Jahr installiert - mit o. a. Ergebnis.

  • Visual Studio Code & AutoIt

    • BugFix
    • 13. Februar 2020 um 10:25

    VSCode hat einen enormen Nachteil: Man kann nicht sauber in die Konsole debuggen!

    Bsp.-Code:

    C++
    ConsoleWrite('Let''s go!' & @LF)
    For $i = 1 To 10 Step +1
      ConsoleWrite($i & @LF)
      Sleep(500)
    Next
    ConsoleWrite('Done!' & @LF)

    Output VSCode (falsch) - Ausgabe auch nicht während des Programmablaufs, sondern erst nach Beendigung:

    Let's go!
    1

    Output SciTE (richtig) - Ausgabe kontinuierlich bei jedem ConsoleWrite-Befehl:

    Let's go!

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    Done!


    Um VSCode sinnvoll nutzen zu können, muss noch viel dran geschraubt werden (die Konsolenausgabe kann sicher auch realisiert werden). Ich hatte mal angefangen mein eigenes Package für AutoIt zu erstellen. Aber es war dann einfach zu viel, was mir fehlt (umfangreiche Events, wie in SciTE, auf die ich reagieren kann) - da habe ich es gelassen (und auch, weil ich mich mit JS nicht wirklich anfreunden kann :whistling:).

  • Item ID eines TreeView Items nach Suche per _GUICtrlTreeView_GetNext

    • BugFix
    • 12. Februar 2020 um 17:24

    Die UDF sind da häufig sehr großzügig mit der Interpretation von ID und/oder Handle. 8o

    Was anfangs vermutlich als Komfortverhalten genutzt wurde (Funktion verlangt ein Handle - ID wird übergeben - Funktion holt sich Handle für diese ID und funktioniert ohne Fehlermeldung) sehe ich heute als Verleitung zu schlampiger Programmierung. ;)
    Wenn eine Funktion ein Handle braucht, sollte sie auch nichts anderes akzeptieren. Das würde auch viele funktionsinterne Abfragen und/oder Umwandlungsroutinen obsolet machen.

    Insofern ist es sinnvoll nicht nur die UDF einzubinden, sondern auch mal zu öffnen und sich die Funktionen detailliert anzuschauen.


    EDIT:

    Die Beispiele zur UDF sind leider total verwirrend.

    Funktionsbeschreibung:

    _GUICtrlTreeView_SelectItem ( $hWnd, $hItem [, $iFlag = 0] )

    $hItem - Handle to the item

    Im Bsp. dazu:

    Erstellung der Item mit nativer Funktion und speichern der ID:

    $aidItem[$x] = GUICtrlCreateTreeViewItem(StringFormat("[%02d] New Item", $x), $idTreeView)

    Übergen wird beim Aufruf die ID, obwohl die Beschreibung ein Handle verlangt!

    _GUICtrlTreeView_SelectItem($idTreeView, $aidItem[$iRand])

    Das zieht sich leider wie ein roter Faden durch einige Hilfebeispiele.

  • Item ID eines TreeView Items nach Suche per _GUICtrlTreeView_GetNext

    • BugFix
    • 12. Februar 2020 um 16:29
    Zitat von r_eisner

    Mein Problem ist, dass _GUICtrlTreeView_GetItemParam

    die Item ID verlangt,

    Jetzt erst gesehen: Dass der Parameter eine ID sein soll steht zwar in der Funktionsbeschreibung - die Funktion weiß davon aber nichts. Wenn man sich die Funktion anschaut, wird dort ausschliesslich das Handle verwendet (und erwartet).

  • Item ID eines TreeView Items nach Suche per _GUICtrlTreeView_GetNext

    • BugFix
    • 12. Februar 2020 um 15:15
    Zitat von alpines

    Wenn das Handle gebraucht wird dann auch das Handle mit GUICtrlGetHandle($id...) übergeben.

    Genau deshalb schrieb ich ja:

    Zitat von BugFix

    Die ID speichere ich mit zugehörigem Handle ( hWnd = GUICtrlGetHandle(ID) )

    Und ob Handle oder ID verlangt wird, ist jeder Funktionsbeschreibung zu entnehmen, von der ich ausgehe, dass der Anwender sie liest. :P

  • Item ID eines TreeView Items nach Suche per _GUICtrlTreeView_GetNext

    • BugFix
    • 12. Februar 2020 um 15:01

    Nun, die Funktion _GUICtrlTreeView_AddChild ist, höflich formuliert, nicht unbedingt sinnvoll. Ich habe mir angewöhnt, TreeViewItem ausschliesslich mit ID = GUICtrlCreateTreeViewItem zu erstellen.

    Die ID speichere ich mit zugehörigem Handle ( hWnd = GUICtrlGetHandle(ID) ) in einem 2D-Array ( [[ID,hWnd], [ID,hWnd], ...] ), welches ich dann bei Bedarf durchsuche. So kannst du Handle und/oder ID jedes Item jederzeit nutzen.

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™