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

  • JSON-UDF

    • BugFix
    • 11. November 2022 um 23:34
    Zitat von AspirinJunkie

    als hättest du es geschafft die Funktionalität simpler und effektiver umzusetzen als bei meiner JSON_Get.

    Danke für die Blumen - aber nicht wirklich. ;)

    _JSON_Query ist quasi _JSON_Get mit der Möglichkeit statt Indizes Bedingungen für die Arrays zu übergeben.

    Im Prinzip mache ich nur Folgendes:

    • sind Bedingungen in den Array-Pattern enthalten?

    wenn nein: Return _JSON_Get mit dem übergebenen Pattern (Man braucht also _JSON_Get nicht mehr aufrufen, macht _JSON_Query sowieso)

    wenn ja:

    • erste Arrayposition mit Bedingung im Pattern suchen

    • den Teil des Patterns davor (repräsentiert das Array) mit _JSON_Get abfragen - liefert das Array

    • durch dieses Array iterieren und vergleichen ob der Schlüssel an der Indexposition den Wert aus der Bedingung liefert - wenn ja: das ist der gesuchte Index

    • im Ausgangspattern die Bedingung mit dem gefundenen Index ersetzen

    • das Ganze wiederholen bis keine Bedingung mehr gefunden wird

    Jetzt enthält das Pattern statt der Bedingungen die zugehörigen Indizes.

    Mit diesem Pattern rufe ich jetzt _JSON_Get auf

    Zitat von AspirinJunkie

    Ich würde diesen Denkansatz spontan gerne verwenden um die JSON_Get-Syntax, nach deiner Zustimmung, um eine Filterfähigkeit zu erweitern, anstatt eine Extra-Funktion mit hinzuzufügen (Credits natürlich entsprechend anpassen).

    Kannst Du gerne tun.

    Zitat von AspirinJunkie

    Im Grunde überlege ich auch die Funktion namentlich von JSON zu trennen, da die Funktion JSON_Get als auch deine JSON_Query() eigentlich gar nicht auf JSON beschränkt ist sondern allgemein verschachtelte AutoIt-Strukturen behandeln kann.

    Da ist was dran. Ich hatte auch schon überlegt, wie ich das SQL-ähnlich gestalten kann, um auch komplex Filtern zu können, z.B. aus einer JSON / einer Map / einem Array ... mit Personendaten (sagen wir mal: "Name", "Vorname", "Geschlecht", "Alter", "PLZ", "Ort", "Strasse", "Nr", "Beruf", "Jahreseinkommen") wollen wir alle Männer unter 40 mit einem jährl. Einkommen von XYZ im PLZ-Gebiet 10... abfragen. Wir können also zwischen 0 und n Ergebnisse bekommen - das Ergebnis dann wiederum in einer brauchbaren Form ausgeben (enumeriertes Array, Map, Dictionary...).

    Die Syntax kann man tatsächlich extrem zusammenstreichen:

    select - braucht man nicht, ist das einzige Ziel beim Filtern

    fields - ja, das muss sein

    from table - braucht man auch nicht, ist immer rückbezüglich auf die Position im Pattern

    where - das Schlüsselwort ist auch unnütz, na klar kommen nun die Bedingungen

    conditions - genau, das brauchen wir

    Bleibt nur die Gestaltung der Operatoren, da liebäugele ich mit den C++/Phyton Operatoren: and = &&, or = Doppelte-Pipe (wird vom Editor als Smiley gezeigt), not = !. (Symbole sind m.M.n. einfacher/eindeutiger zu Parsen, als Worte). Zusätzlich natürlich: < = > und auch contains - wobei ich dafür wiederum auch ein Symbol verwenden würde, vielleicht: ?

    Damit sollten eigentlich wesentliche Filteroperationen möglich sein. Es wird sicher nur etwas aufwändig, die Auswertelogik zu gestalten (Berücksichtigung aller Klammerausdrücke, Rangfolge der Operatoren). Aber es hat ja auch keiner behauptet, dass sowas ein Spaziergang sei. :rofl:

  • JSON-UDF

    • BugFix
    • 11. November 2022 um 17:59

    Hi AspirinJunkie ,

    ich habe mal eine zusätzliche Funktion erstellt, die es erlaubt anstelle von einem Index für ein Array, eine Bedingung zur Identifizierung des Index zu übergeben.
    Solange ein Array nur Werte enthält, ist das uninteressant. Habe ich aber Schlüssel-Wert Auflistungen, kann ich anhand des Wertes eines Schlüssels den Eintrag im Array lokalisieren.

    Bisher würde ich mir das Array ausgeben lassen und dann das Array weiter abfragen.

    Ich fand es aber reizvoll die Bedingungen der Auswahl anstelle des Index zu übergeben und direkt auf den Inhalt zuzugreifen. Das funktioniert in der Form auch verschachtelt.

    Hier mal mein Bsp. JSON

    JSON
    {
      "date": "2022-11-10",
      "author": "BugFix",
      "errorlist": [
        {
          "err": 1,
          "name": "NO_BATTERY",
          "special": [
            {
              "voltage": 12.5,
              "model": "alpha"
            },
            {
              "voltage": 15,
              "model": "beta"
            },
           {
              "voltage": 24,
              "model": "gamma"
            }      ]
        },
        {
          "err": 2,
          "name": "DISPLAY_ERR",
          "special": [
            {
              "voltage": 12.5,
              "model": "delta"
            },
            {
              "voltage": 15,
              "model": "epsilon"
            },
            {
              "voltage": 24,
              "model": "zeta"
            }
          ]
        }
      ]
    }
    Alles anzeigen

    Hier meine Funktion

    AutoIt
    #include "JSON_Dictionary.au3"
    ; #FUNCTION# ======================================================================================
    ; Name ..........: _JSON_Query
    ; Description ...: Call function for _Json_Get that converts passed conditions into the corresponding array indices.
    ;                  DictionaryKey1.DictionaryKey2.[Condition_4_Determining_The_Index].DictionaryKey3...
    ;                  Condition: "key_in_array = value"
    ; Syntax ........: _JSON_Query(ByRef $o_Object, $s_Pattern)
    ; Parameters ....: $o_Object      - a nested AutoIt datastructure (Arrays, Dictionaries, basic scalar types)
    ;                  $s_Pattern     - query pattern like described above
    ; Return values .: Success - Return the queried object out of the nested datastructure
    ;                  Failure - Return "" and set @error to:
    ;                        @error = 1 - pattern is not correct
    ;                              = 2 - keyname query to none dictionary object
    ;                              = 3 - keyname queried not exists in dictionary
    ;                              = 4 - index query on none array object
    ;                              = 5 - index out of array range
    ; Author ........: BugFix
    ; =================================================================================================
    Func _JSON_Query(ByRef $o_Object, $s_Pattern)
        ; check for index-condition, replace condition with its index
        Local $sCondPattern = '\[([\D\S][^\]]+)\]', $aSplitCond, $sPatternNew = $s_Pattern, $sPatternPart, $aTmp
        If StringRegExp($s_Pattern, $sCondPattern) Then
            Local $iOffset = 1, $aCondition
            While True
                $aCondition = StringRegExp($sPatternNew, $sCondPattern, 1, $iOffset)
                If @error Then
                    ExitLoop
                Else
                    $iOffset = @extended
                    $sPatternPart = StringLeft($sPatternNew, $iOffset -1) ; gets: DictionaryKey1.DictionaryKey2.[Condition4DeterminingTheIndex]
                    $sPatternPart = StringLeft($sPatternPart, StringInStr($sPatternPart, '.[', 0, -1) -1) ; gets: DictionaryKey1.DictionaryKey2
                    $aTmp = _JSON_Get($o_Object, $sPatternPart)
                    ; now search the index by condition
                    $aSplitCond = StringRegExp($aCondition[0], '\s*(.+)\s*=\s*(.+)', 1)
                    For $i = 0 To UBound($aTmp) -1
                        If $aTmp[$i].Item($aSplitCond[0]) = $aSplitCond[1] Then
                            $iOffset -= (StringLen($aSplitCond[0]) - StringLen($i))
                            $sPatternNew = StringReplace($sPatternNew, $aCondition[0], $i)
                            ExitLoop
                        EndIf
                    Next
                EndIf
            WEnd
            $s_Pattern = $sPatternNew
    ;~         ; ConsoleWrite("@@_Debug_line" & @TAB & @TAB & @ScriptLineNumber & "   var: $sPatternNew --> " & $sPatternNew & @LF)
        EndIf
        Return _JSON_Get($o_Object, $s_Pattern)
    EndFunc   ;==>_JSON_Query
    
    
    Global $sJson = _
    '{' & @CRLF & _
    '  "date": "2022-11-10",' & @CRLF & _
    '  "author": "BugFix",' & @CRLF & _
    '  "errorlist": [' & @CRLF & _
    '    {' & @CRLF & _
    '      "err": 1,' & @CRLF & _
    '      "name": "NO_BATTERY",' & @CRLF & _
    '      "special": [' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 12.5,' & @CRLF & _
    '          "model": "alpha"' & @CRLF & _
    '        },' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 15,' & @CRLF & _
    '          "model": "beta"' & @CRLF & _
    '        },' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 24,' & @CRLF & _
    '          "model": "gamma"' & @CRLF & _
    '        }' & @CRLF & _
    '      ]' & @CRLF & _
    '    },' & @CRLF & _
    '    {' & @CRLF & _
    '      "err": 2,' & @CRLF & _
    '      "name": "DISPLAY_ERR",' & @CRLF & _
    '      "special": [' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 12.5,' & @CRLF & _
    '          "model": "delta"' & @CRLF & _
    '        },' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 15,' & @CRLF & _
    '          "model": "epsilon"' & @CRLF & _
    '        },' & @CRLF & _
    '        {' & @CRLF & _
    '          "voltage": 24,' & @CRLF & _
    '          "model": "zeta"' & @CRLF & _
    '        }' & @CRLF & _
    '      ]' & @CRLF & _
    '    }' & @CRLF & _
    '  ]' & @CRLF & _
    '}' & @CRLF
    
    
    Global $oJson = _JSON_Parse($sJson)
    If @error Then ConsoleWrite('@error: ' & @error & @CRLF)
    
    ConsoleWrite("err=2.model=epsilon.voltage: " & _JSON_Query($oJson, "errorlist.[err=2].special.[model=epsilon].voltage") & @CRLF)
    Alles anzeigen
  • Datensätze als Array of struct speichern

    • BugFix
    • 10. November 2022 um 14:06
    Zitat von Moombas

    Wenn man ein ArrayofStruct hat, dieses "einfach" zu speichern.

    Ich vermute das man dafür eine eigene Fumnktion bauen muss, richtig?

    Die ist doch enthalten im Bsp.: _WriteData

  • ​Sammlung: Nim Snippets / Procedures

    • BugFix
    • 10. November 2022 um 11:10

    • JSON Datei in einer Anwendung erstellen

    • Daten Hinzufügen

    • Daten Ändern

    Nim
    import std/[json, os]
    import winim/lean # für msgBox
    
    #-------------------------------------------------------------------------------
    proc msgBox(caption, text: string, flag: int = 0) =
      let
        lpcaption = newWideCString(caption, caption.len)
        lptext = newWideCString(text, text.len)
        uType = cast[UINT](flag)
      MessageBox(0, cast[LPCWSTR](lptext), cast[LPCWSTR](lpcaption), uType)
    #-------------------------------------------------------------------------------
    
    
    let jsonFile = "test.JSON"
    var parsedJson: JsonNode
    
    
    if fileExists(jsonFile):  # bestehende JSON lesen
      parsedJson = parseFile(jsonFile)
    else:                     # JSON erstellen
      parsedJson = %* {"date": "2022-11-10", "author": "BugFix"}
    
    
    msgBox("Inhalt \"parsedJson\" nach Start", parsedJson.pretty(), 64)
    
    
    # Daten hinzufügen (wenn noch nicht vorhanden)
    if not parsedJson.contains("errorlist"):
      parsedJson["errorlist"] = %* [{"err": 1, "name": "NO_POWER"}, {"err": 2, "name": "DISPLAY_ERR"}]
      msgBox("Inhalt \"parsedJson\" nach Hinzufügen", parsedJson.pretty(), 64)
    
    
    # Daten ändern: Change "name" bei "err: 1"
    for jsne in parsedJson["errorlist"].getElems():
      if jsne["err"].getInt() == 1:
        if jsne["name"].getStr() == "NO_POWER":
          jsne["name"] = newJString("NO_BATTERY")
          msgBox("Inhalt \"parsedJson\" nach Änderung", parsedJson.pretty(), 64)
        break
    
    
    # in Datei schreiben
    writeFile(jsonFile, pretty(parsedJson))
    Alles anzeigen
  • Datensätze als Array of struct speichern

    • BugFix
    • 10. November 2022 um 08:40
    Zitat von Moombas

    wäre bei PLZ nicht int anstatt char besser?

    Nein: Es gibt PLZ, die mit "0" beginnen. ;)

  • Aufteilen eines Array-Index in 2 Werte

    • BugFix
    • 9. November 2022 um 10:47
    Zitat von Moombas

    Dauert das denn signifikannt länger?

    Was passiert beim ReDim:

    - Speicherplatz in neuer Größe anfordern

    - Daten vom alten Speicherplatz an den neuen Speicherplatz kopieren

    - alten Speicher freigeben

    D.h., mit jedem Element das hinzukommt, wird ein Element mehr kopiert beim ReDim. Für kleine Größen sicher nicht relevant, aber wenn das anwächst wird es spürbar.

    Und selbst wenn du es nicht unbedingt spürst, ist es für meinen Geschmack einfach unschön. (Und in Zeiten, wo man von Nachhaltigkeit spricht: Das kostet auch Energie. :whistling: )

  • Aufteilen eines Array-Index in 2 Werte

    • BugFix
    • 9. November 2022 um 10:32
    Zitat von Moombas

    Wäre es nicht besser auch dieses Array dynamisch zu vergrößern anstatt einen fix-wert zu nutzen, der sich ja immer ändern kann?

    Bei Arrays, wo die finale Größe immer gleich ist mach ich das auch so aber bei welchen wie hier die unter bestimmten Bedingungen eine andere Größe haben können mag ich den dynamischen Gedanken wesentlich lieber.

    Wenn viele Einträge zu erwarten sind, sollte man das kontinuierliche Vergrößern des Array (_ArrayAdd, ReDim) vermeiden. Jede dieser Aktionen braucht gefühlt mehr Zeit als der Rest des Skriptes.

    Wenn man nicht weiß, wieviel Einträge zu erwarten sind, legt man erst mal eine fiktive Größe von 1000 vor (kann auch 10.000 sein, tut niemandem weh). Und nach jeder Vergrößerung des Zählers prüft man, ob dieser Wert erreicht wurde. Wenn ja, wird an dieser Stelle ein ReDim mit Erweiterung des Array um die Blockgröße vorgenommen. Somit sind die Vorteile von fixem Array und Dynamik vereint.

    Kann dann so aussehen:

    AutoIt
    Global $iBlockSizeArray = 500
    Global $iCountArray = 0
    Global $aResult[$iBlockSizeArray][2]
    
    For $a In $b
        If $iCountArray +1 > UBound($aResult) Then ReDim $aResult[UBound($aResult) +$iBlockSizeArray][2]
        ; .. Code
        $aResult[$iCountArray][0] = ....
        $aResult[$iCountArray][1] = ....
        $iCountArray += 1
    Next
    Alles anzeigen
  • Aufteilen eines Array-Index in 2 Werte

    • BugFix
    • 8. November 2022 um 16:07
    Zitat von hipfzwirgel

    oder der Variante von Bugfix fallen die Zeilen ab Nr. 77 weg...

    Wenn du die Startgröße erweiterst, wird alles angezeigt.

    AutoIt
    Local $aBiosArray[200][2]  ; hier z.B. 400 statt 200
  • Aufteilen eines Array-Index in 2 Werte

    • BugFix
    • 8. November 2022 um 15:20

    Probier mal so:

    AutoIt
    Func LEN_BiosSettings()
    
        Local $wbemFlagReturnImmediately = 0x10
        Local $wbemFlagForwardOnly = 0x20
        Local $colItems = ""
        Local $strComputer = "localhost"
        Local $aBiosArray[200][2]
        Local $nCount = 0, $sSetting, $aSplit
        Local $a_String
    
    
        $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\WMI")
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Lenovo_BiosSetting", "WQL", _
                $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
        If IsObj($colItems) Then
            For $objItem In $colItems
                $sSetting = $objItem.CurrentSetting
                If $sSetting <> "" Then
                    $aSplit = StringSplit($sSetting, ",")
                    $aBiosArray[$nCount][0] = $aSplit[1]
                    $aBiosArray[$nCount][1] = $aSplit[2]
                    $nCount += 1
                EndIf
            Next
            ReDim $aBiosArray[$nCount+1][2]
        Else
            MsgBox(0, "WMI-Ausgabe", "Keine WMI-Objekte gefunden für Klasse: " & "Lenovo_BiosSetting")
        EndIf
    
        _ArrayDisplay($aBiosArray)
    
    
    EndFunc   ;==>LEN_BiosSettings
    Alles anzeigen
  • Speichern von zwei verschiedenen Mousepositionen

    • BugFix
    • 31. Oktober 2022 um 17:44
    Zitat von BugFix

    Ich weiß nicht, ob geänderte Anzeigeeinstellungen (Zoom, Schriftdarstellung etc.) darauf Einfluss haben können

    Zitat von HoT

    Nachdem ich einen 32Zoll Monitor habe, habe ich die Windows Anzeigeeinstellungen bei Skalierung und Anordnung auf 150% stehen.

    Als ich sie auf 100% eingestellt habe hat alles so funktioniert, wie es sollte.

    Mein Reden. :P

  • Speichern von zwei verschiedenen Mousepositionen

    • BugFix
    • 31. Oktober 2022 um 13:04
    Code
    Programm:   349,215,1175,1021  B: 826, H: 806
    Bild:       253,168,871,823    B: 618, H: 655
    Differenz:  -96,-47              -208,   -151

    Das ist nicht nur verschoben, sondern auch die Größe ist verändert. :/

    Ich weiß nicht, ob geänderte Anzeigeeinstellungen (Zoom, Schriftdarstellung etc.) darauf Einfluss haben können. Aber irgendwas scheint bei dir nicht "normal" eingestellt.

  • Speichern von zwei verschiedenen Mousepositionen

    • BugFix
    • 31. Oktober 2022 um 12:09
    Zitat von HoT

    Das heißt, er hat links und oben zuviel aufgenommen, dafür unten und rechts zu wenig.

    Kann ich nicht nachvollziehen.

    Also um nicht aneinander vorbeizureden:

    Ausgeführt wird der Code aus Post #3. Ein Screenshot von eben diesem Code im Browserfenster wird erstellt.

    Mein "Bild.jpg" zeigt dann exakt den markierten Bereich.

    Vor allem können wir uns dem Problem nicht nähern, wenn du nicht alle Informationen zusammen angibst. Du schreibst "Orginalkoordinaten wären:..." - erwähnst aber nicht die Koordinaten, die vom Skript ausgegeben werden. Anhand der Differenz kann man evtl. Schlussfolgerungen auf dein Problem ziehen.

  • Speichern von zwei verschiedenen Mousepositionen

    • BugFix
    • 31. Oktober 2022 um 11:32
    Zitat von HoT

    Aber wie im Beispiel zu sehen ist, sind die Koordinaten verschoben.

    Da ich nicht weiß, wie dein gesamter Screen aussieht, ist für mich nicht ersichtlich, dass dort etwas verschoben ist.

    200 px von links, 200 px von oben, Breite x Höhe: 1000 x 1400 passt zu deinem geposteten Bildausschnitt. Der linke Rand ist definitiv OK, der obere Rand ist natürlich davon abhängig, an welche Position du den dort zu sehenden Post gerade gescrollt hattest.

  • Speichern von zwei verschiedenen Mousepositionen

    • BugFix
    • 31. Oktober 2022 um 10:13
    Zitat von HoT

    Woran könnte dies liegen?

    Schau dir mal die Optionen für die Koordinaten an:

    au3windowinfo.png

  • Warum Funktioniert _GUICtrlListView_GetItemText nicht?

    • BugFix
    • 28. Oktober 2022 um 21:29

    :Face: Leichenschänder

  • Wasser gutes Lösungsmittel!

    • BugFix
    • 20. Oktober 2022 um 08:25

    Und: Wasser löst auch das Problem des TE. Hätte er es sich kalt über den Kopf gegossen, wäre ihm der Gedanke einer Google Suche selbst gekommen. :rofl:

  • Wasser gutes Lösungsmittel!

    • BugFix
    • 19. Oktober 2022 um 21:51

    Ein Beitrag, der sogar für Off-Topic zu sehr Off-Topic ist. :Face:

  • PDF Drucken

    • BugFix
    • 17. Oktober 2022 um 09:15

    Nun möchte ich auch mal noch meinen Senf dazu geben. ^^

    Für beide Varianten (Acrobat od. portabler Reader) kann es nachvollziehbare Gründe geben, die auch von meinen Vorpostern ausreichend aufgezählt wurden. Ich persönlich bin ein absoluter Gegner des Acrobat Reader (wohlgemerkt: des Readers). Im Laufe der Jahre wurde ein schlanker (schnell startender) Reader durch Hinzufügen sinnfreier Komponenten zu einem Monstrum aufgeblasen. Ich weiß nicht, wie platzhungrig das Teil im Moment ist, als ich vor Jahren das letzte mal so ein Teil auf dem Rechner hatte, waren es rund 200 MB! - für einen READER!!! Und Ladezeiten, als wollte man ein 2-Std. Video preloaden. :Face:

    Deshalb ist erste Amtshandlung bei neuen PC: Falls installiert - Deinstallation des Acrobat-Readers bzw. Entfernen seines Installationslinks.

    Ich selbst nutze den XChange PDF-Viewer, mit 16 MB für diesen Zweck völlig ausreichend.

    Ich bin durchaus bereit, für funktionale Software Geld auszugeben. So kaufe ich grundsätzlich Apps für mein Smartphone, wenn diese nach einer mehrmonatigen Testphase für mich zufriedenstellend laufen. Nur aus Enthusiasmus heraus wird auf Dauer ein Produkt nur schwer zu pflegen sein. Deshalb unterstütze ich dann gern.

    Zum Thema "Gute Sitten / Umgangston":

    Peter S. Taler, ich kann durchaus verstehen, dass du nach dem Post von Andy etwas angefasst warst. Ich hatte nach dem Lesen deines ersten Posts schon den Gedanken "Das triggert den Andy". Denn in dem Punkt seid ihr euch gar nicht so unähnlich - und ich ticke auch so 8o. Meinungen sind absolut und müssen erst mal kräftig postuliert werden. Am Besten mit einem Schuss Provokation versehen. Aber glaub mir, wenn dir Andy im Biergarten gegenüber säße, würde er sagen: "Das ging nicht gegen dich als Person, aber ich schieße mit breitem Streufeuer und du standest nun mal gerade im Weg."

    Wir hatten im Laufe der Jahre erst ganz wenige Fälle, in denen wir gezielt rau gegen einzelne User vorgingen. Da war ich dann auch mit im Boot und das hatte entsprechende Gründe. Ansonsten kommen wir hier recht gut miteinander aus.

    Vielleicht hilft dir die Vorstellung, Andy könnte Mr. Waldorf aus der Muppet Show sein (Mr. Statler beanspruche ich für mich, denn ich habe einen Bart - bei Andy weiß ich es nicht :P ). Was ich irgendwie auch passend finde: Nach eigener Aussage heißen die beiden letzten Bücher, die die zwei Zyniker gelesen haben "Die Kunst des Beleidigens" und "Wie man die Kunst beleidigt". :rofl:

    In diesem Sinne: Ein virtuelles Prost und eine schöne Woche.

  • To Wert einer For-Schleife bearbeiten

    • BugFix
    • 10. Oktober 2022 um 16:23
    Zitat von Musashi

    Du könntest auch deine For..Next Schleife beibehalten, dann musst Du nur, wie Micha_he bereits schrieb, mit dem letzten Element beginnen.

    Code
    #include <Array.au3>
    Local $aArray[16] = [0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1]
    For $i = Ubound($aArray) - 1 To 0 Step -1
        If $aArray[$i] = 1 Then _ArrayDelete($aArray, $i)
    Next
    _ArrayDisplay($aArray)

    Jein.

    Wenn du _ArrayDelete verwendest, wird jedes mal ein ReDim ausgeführt, sollte man tunlichst vermeiden.

  • Background Bild und GUI Elemente

    • BugFix
    • 10. Oktober 2022 um 10:04

    Noch zum Punkt Aktualisierungsintervall:

    100 ms ist der letzte Wert, bei dem noch ohne Flackern aktualisiert werden kann. Aber trotzdem ist das wenig sinnvoll. Du musst ja noch die Zeit hinzurechnen um den Wert wahrnehmen zu können. Wenn Du sehr gut drauf ist, passiert das in weiteren 100 ms, d.h. wirklich lesbar ist die Anzeige erst bei einer Aktualisierung alle 200 ms.

    Kannst du in diesem Bsp. mal selbst probieren, ob du bei 100 ms wirklich jeden neuen Wert erfassen kannst. 8o

    AutoIt
    #include <GUIConstantsEx.au3>
    
    GUICreate('Test Label-Update')
    Global $aLabel[6], $aRadio[6]
    $aRadio[4] = GUICtrlCreateRadio(' ', 5, 7, 10, 15)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlCreateLabel('Update: 1 s (1 Hz)', 20, 10, 150)
    $aLabel[4] = GUICtrlCreateLabel('', 160, 10, 120, 17)
    $aRadio[3] = GUICtrlCreateRadio(' ', 5, 37, 10, 15)
    GUICtrlCreateLabel('Update: 0,5 s (2 Hz)', 20, 40, 150)
    $aLabel[3] = GUICtrlCreateLabel('', 160, 40, 120, 17)
    $aRadio[2] = GUICtrlCreateRadio(' ', 5, 67, 10, 15)
    GUICtrlCreateLabel('Update: 0,2 s (5 Hz)', 20, 70, 150)
    $aLabel[2] = GUICtrlCreateLabel('', 160, 70, 120, 17)
    $aRadio[1] = GUICtrlCreateRadio(' ', 5, 97, 10, 15)
    GUICtrlCreateLabel('Update: 0,1 s (10 Hz)', 20, 100, 150)
    $aLabel[1] = GUICtrlCreateLabel('', 160, 100, 120, 17)
    $aRadio[5] = GUICtrlCreateRadio(' ', 5, 127, 10, 15)
    GUICtrlCreateLabel('Update: 0,08 s (12,5 Hz)', 20, 130, 150)
    $aLabel[5] = GUICtrlCreateLabel('', 160, 130, 120, 17)
    $aRadio[0] = GUICtrlCreateRadio(' ', 5, 157, 10, 15)
    GUICtrlCreateLabel('Update: 0,05 s (20 Hz)', 20, 160, 150)
    $aLabel[0] = GUICtrlCreateLabel('', 160, 160, 120, 17)
    
    AdlibRegister(_Intervall005, 50)
    AdlibRegister(_Intervall008, 80)
    
    GUISetState()
    Do
    Until GUIGetMsg() = -3
    
    Func _Intervall005()
        Local Static $aSum[][] = [[0,1],[0,2],[0,4],[0,10],[0,20]]
        For $i = 0 To UBound($aSum) -1
            $aSum[$i][0] += 1
            If $aSum[$i][0] = $aSum[$i][1] Then
                $aSum[$i][0] = 0
                If BitAND(GUICtrlRead($aRadio[$i]), $GUI_CHECKED) Then _
                    GUICtrlSetData($aLabel[$i], StringFormat('%02d:%02d:%02d,%03d', @HOUR, @MIN, @SEC, @MSEC))
            EndIf
        Next
    EndFunc
    
    Func _Intervall008()
        If Not BitAND(GUICtrlRead($aRadio[5]), $GUI_CHECKED) Then Return
        GUICtrlSetData($aLabel[5], StringFormat('%02d:%02d:%02d,%03d', @HOUR, @MIN, @SEC, @MSEC))
    EndFunc
    Alles anzeigen

    Für Anzeigen von Statusmeldungen, die sich an Schwellwerten orientieren in der Art: "OK", "Geht Noch", "Gefahr", ist m.M.n. die Hintergrundfärbung der Label in Grün/Gelb/Rot viel intuitiver als ein Zahlenwert.

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™