Beiträge von Oscar

    Ich habe mich mal noch etwas mehr damit beschäftigt und speziell ging es mir um die Möglichkeit die Farben der Links zu ändern, sodass man auch einen dunklen Hintergrund benutzen kann.

    Ich habe mal ein Beispielscript erstellt, bei dem statt der Callback-Routine nur GuiRegisterMsg verwendet wird (ist für Anfänger vielleicht einfacher zu verstehen):

    Screenshot:

    Ach shit!

    Jetzt, wo ich das hier aufgeschrieben habe, sehe ich den Fehler: lpRect muss ein Pointer sein und nicht $tagRECT.

    Es muss also so aussehen:

    AutoIt
    Global Const $tagNMCUSTOMTEXT = 'struct;' & $tagNMHDR & ';handle hDC;ptr lpString;int nCount;ptr lpRect;uint uFormat;bool fLink;endstruct'

    Manchmal sieht man den Wald vor lauter Bäumen nicht.

    Ich versuche mich gerade an der farbigen Darstellung bei dem Syslink-Control.

    Dazu muss man das WC_LINK-Window mit $LWS_USECUSTOMTEXT aufrufen. Soweit funktioniert das auch. Es wird auch in der Window-Proc unter $WM_NOTIFY das $NM_CUSTOMTEXT aufgerufen.

    Aber irgendwie wird die Struktur falsch zurückgegeben.

    Laut MSDN soll die Struktur so aussehen:

    Code
    typedef struct tagNMCUSTOMTEXT {
      NMHDR   hdr;
      HDC     hDC;
      LPCWSTR lpString;
      int     nCount;
      LPRECT  lpRect;
      UINT    uFormat;
      BOOL    fLink;
    } NMCUSTOMTEXT, *LPNMCUSTOMTEXT;

    Ich habe daraus dieses hier für AutoIt gemacht:

    AutoIt
    Global Const $tagNMCUSTOMTEXT = 'struct;' & $tagNMHDR & ';handle hDC;ptr lpString;int nCount;' & $tagRECT & ';uint uFormat;bool fLink;endstruct'

    Das funktioniert auch, bis auf die letzten beiden Werte. Bei "uFormat" kommt immer "0" oder "1" raus, was eigentlich bei "fLink" stehen sollte und "fLink" bekommt Zufallswerte (bei jedem Start etwas anderes, was wohl darauf hindeutet, dass über die Struktur hinaus gelesen wird). Habe ich bei der Struktur-Definition einen Fehler gemacht? Oder woran kann das liegen?


    Hier mal mein Script (edit: korrigiertes Script)

    Ist es möglich, das so zu bauen, dass $aNumber beliebig groß sein kann ?

    Dafür gibt es Schleifen:

    AutoIt
    Global $Loesung = 0, $aNumber[] = [3, 7, 6, 8, 5]
    For $i = 0 To UBound($aNumber) - 1
        $Loesung += $aNumber[$i]
    Next
    $Loesung *= $aNumber[0]
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Loesung = ' & $Loesung & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    Es gibt ja mindestens 2 Lösungen fürs Problem

    Meine Lösung sieht meistens so aus (für mich endet ein Verzeichnis immer mit einem Backslash):

    AutoIt
    Global $sPath = @ScriptDir
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sPath = ' & $sPath & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    Dafür ist doch _DateDiff perfekt geeignet:

    AutoIt
    #include <Date.au3>
    
    Global $sEndDT = '2023/01/15 00:00:00', $iTimeLeft
    Do
        $iTimeLeft = _DateDiff('s', _NowCalc(), $sEndDT)
        ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iTimeLeft = ' & $iTimeLeft & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
        Sleep(1000)
    Until $iTimeLeft < 1
    MsgBox(0, 'Ende', 'Das Datum ist erreicht!')

    Ein Label, dass sich über einem Pic-Control befindet, flackert, wenn man es zu oft aktualisiert. Das habe ich auch schon so erlebt.

    Man kann entweder die Aktualisierungrate reduzieren, wie schon vorgeschlagen, oder gleich ganz auf das Label verzichten und alles auf das Pic-Control zeichnen.

    Hier mal ein Beispiel ( casi4712: das auch lauffähig ist, im Gegensatz zu Deinen Beispielen.):

    Die europäische Zentralbank gibt täglich die Umrechnungskurse diverser Währungen als XML-Datei heraus.

    Diese Datei kann man mit AutoIt abfragen und die Daten daraus in ein Array packen, sodass man damit im eigenen Script Umrechnungen vornehmen kann.

    Ich habe dazu mal eine Funktion geschrieben:


    Edit 09.01.2023 :

    Mit dem neuen Map-Datentyp ist die Umrechnung zwischen den Währungen noch einfacher. Ich habe mal eine Funktion dazu geschrieben:

    Aber wie fange ich das denn ab, in eine Variable Zwischenspeichern aber wann soll ich diese denn dann speichern ?

    Beschreibe mal den Ablauf.

    Was soll mit den eingescannten Daten passieren?

    Alle Daten in eine Datei oder jeder Scan in eine Extra-Datei?

    Das Problem könnten auch die Beeps sein, weil das Script währenddessen "angehalten" wird und wenn Du schneller scannst als die Beeps dauern, dann läuft irgendwann der Tastaturpuffer über.

    Die Lösung hierzu lautet: konsequent Doppelklammer nutzen

    Ok! Das ist noch besser, als die Int- oder Number-Version. Danke! :)

    Ich könnte ja auch DllStruct(G/S)etData benutzen, um die Indizes anzusprechen, aber ich finde die Klammern ganz gut und leserlich im Code.

    Ich kann auch nicht verstehen, warum sich die Devs dagegen aussprechen.

    Mir ist gerade ein Bug aufgefallen.

    Wenn man eine Struktur mit einem Datentyp-Array erstellt und dann versucht auf ein Element aus dem Array über eine Variable zuzugreifen, so wird immer 0 ausgegeben (@error = 3).

    Es sei denn man wandelt die Variable in eine Zahl um.

    Hier mal ein Beispiel-Script:

    Könnt ihr das bestätigen?

    Ich würde das nicht als Bug bezeichnen... Wie willst du denn einen Eintrag in die Map unterscheiden, wenn du Zahlen (oder Strings) reinwirfst, wo auch 0 (oder nen leerer String) bei sein kann.

    Ok jetzt, wo ich das von Dir lese, fällt es mir wie Schuppen von den Augen. Es gibt ja auch 0 und Leerstring im Value. Somit macht NULL dann doch Sinn.

    Danke für's Augen öffnen! :):thumbup:

    Ich habe gerade einen Bug bei dem Datentyp MAP entdeckt:

    Wenn ein Key in der MAP nicht vorhanden ist, dann würde ich als Rückgabe einen Leerstring oder eine Null erwarten.

    Tatsächlich ist es aber so, dass das Keyword NULL zurückgegeben wird und somit ein Vergleich auf einen Leerstring oder 0 nicht funktioniert. "Not" hingegen funktioniert.

    Hier mal ein Testscript:

    AutoIt
    Global $mMap[]
    $mMap['a'] = 'abcdef'
    
    ConsoleWrite('Ausgabe von "a": ' & $mMap['a'] & @CRLF)
    
    Global $sTest = $mMap['b'] ; den Key 'b' gibt es nicht
    If $sTest = '' Then ConsoleWrite('1. If-Bedingung erfuellt.' &@CRLF)
    If $sTest = 0 Then ConsoleWrite('2. If-Bedingung erfuellt.' &@CRLF)
    If $sTest = Null Then ConsoleWrite('3. If-Bedingung erfuellt.' &@CRLF)
    If Not $sTest Then ConsoleWrite('4. If-Bedingung erfuellt.' &@CRLF)

    Nur die 3. und 4. Bedingung wird erfüllt.

    Alternativ habe ich für meine Zwecke das, dank AspirinJunkie, so umgesetzt:

    Naja, dafür braucht man eine Internetverbindung. Meins wäre offline (aber nur PLZ ohne Straße).


    Dein Script kann man etwas kürzen: