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

Beiträge von Oscar

  • TextZeilen einlesen und ein Stück abschneiden

    • Oscar
    • 12. Januar 2023 um 15:38
    Zitat von MojoeB

    es entsteht ein 2d array mit stringsplit

    Nein!

    StringSplit gibt immer ein eindimensionales Array (1d) zurück und die "Arrayzahl" ist der Index auf das Element.

    Bei dieser Art der Notation muss man aber vorsichtig sein, weil man einen Error produzieren kann, wenn der Index größer ist, als die Anzahl der Elemente im Array.

  • Leidiges Flickerproblem

    • Oscar
    • 12. Januar 2023 um 15:22

    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.):

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    
    _GDIPlus_Startup()
    Global $g_hBackgrImg = _GDIPlus_BitmapCreateFromMemory(_Background())
    Global $g_hMainGui = GUICreate('Show MEM', 512, 512)
    Global $g_idBgPic = GUICtrlCreatePic('', 0, 0, 512, 512)
    _GuiCtrlDrawImageAndText(-1, $g_hBackgrImg)
    GUISetState()
    AdlibRegister('_ShowMEM', 100)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    _GDIPlus_ImageDispose($g_hBackgrImg)
    _GDIPlus_Shutdown()
    
    Func _ShowMEM()
        Local $aMemStats = MemGetStats()
        Local $fRamFree = Round($aMemStats[2] / 1024 / 1024, 2)
        Local $sText = StringFormat('%.02f GB free\r\n\r\n\r\n%s', $fRamFree, ($fRamFree < 5 ? '  RAM knapp' : ''))
        _GuiCtrlDrawImageAndText($g_idBgPic, $g_hBackgrImg, $sText)
    EndFunc   ;==>_ShowMEM
    
    Func _GuiCtrlDrawImageAndText($hWnd, $hImage, $sText = '')
        Local $tRect, $hBitmap, $hGraphic, $hBMP, $hPrevImg
        If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
        If Not IsHWnd($hWnd) Then Return SetError(1)
        $tRect = _WinAPI_GetClientRect($hWnd)
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($tRect.Right, $tRect.Bottom)
        $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, $tRect.Right, $tRect.Bottom)
        _GDIPlus_GraphicsDrawString($hGraphic, $sText, 100, 114, 'Courier New', 24)
        $hBMP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        $hPrevImg = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImg Then _WinAPI_DeleteObject($hPrevImg)
        _WinAPI_DeleteObject($hBMP)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_BitmapDispose($hBitmap)
    EndFunc   ;==>_GuiCtrlDrawImageAndText
    
    
    ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2020-06-05
    
    Func _Background($bSaveBinary = False, $sSavePath = @ScriptDir)
        Local $Background
        $Background &= 'iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAALIlJREFUeNrs3X2sXGd9J/Bjx7HJm3NJoGlJbDm8tKrUpMlWW4K0UAeFrgjdbQii6grUGK368gdLAn8sSPtHQCoS+aNJQatq1apKWJWqWonG2a5AvJR4qVYsi3aTBpbdhaQEm9BASHJJ8LWv7Xvvzu96xhxP5t47M+d35s455/NBo2sH+3jmmXPO7/s853nOKQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPp2aILNHTt2bKH344be60D/BcD8erL/enTfvn2LmkMAmLTo39b78Zu910FFH6DRYeBI7/VQLwwc1hwCwEZFPwr9nb3Xod5rQYsAtEqMBjzQe328Fwae1BwCwGCI/+7e6y67A0An/HHv9ZGuXyLodADoD/Xfr8cP0MkRgfd0+dLAzg4X//t6Px5U/AE6Kc79D/ZrgRGAjhT+hX7hP2j/B6A4O1Hw7V27JNCpANAv/g8XZ5f1AcDAo73XzV0KAV27BKD4AzDKDf0a0RmdCQC93v/9ij8Am4WAfq3ohE5cAujP9n9wlv/mc889Vzz//PMOJ4BEr3nNa2bxz7y9C6sDWh8A+tf9v1PUONv/G9/4RvH973+/ePzxx9d/njhxwlEKUHMQuPrqq4tXvepVxS/90i8VF110UebmYx7AtW2fD9CFABDDOYeyt/vEE08UX/va19aLv4IPsL0iCLzpTW/KDAMP9ALAewSA5hb/A/3ef5oo+p///OfXh/gBmC9R/CMIvPGNb8wIAte2+bbBbQ8Aab3/6PEfPnx4fYgfgPkPAr/+67++HgaMAnQsAPSv/afM'
        $Background &= 'wnvooYeKL3/5y44ogIaJuQK//du/XVxxxRXT/PVWzwVo8zLA26puIK7t/9Ef/ZHiD9BQMXp77733rv+cwkJGLREAZu83q/zlGOr/6Ec/asgfoOGiM/cnf/In63O4Zl1LBIDtcbBK8Y+dxex+gPb4q7/6q2lCwMG2tkcrA8CxY8fijn9TrfuPon///fcr/gAtDQGxfHsCC/2aIgA0xIFp/2L0/C3xA2h3CJjwPH+gje3Q1gAwVVqL9f2u+QO022Ckt+6aIgA0RKTBz33ucxoCoAOis9f1FV4CQF8MCQHQHTHq2+X5XgJAPwlOuUYUgIaK4v93f/d3AkCXudEPgPO/ANDBBDjhkhAA1AABoOli6N+af4DuEgA6HAAAUAcEgI556qmn7P0AHRbLwLs4EmwEwAgAQOd18SZwVgEAQAcJAAB0XhcvBwsAAHTeyZMnBQAAQAAAAAQAAEAAAAAEAABAAAAABAAAQAAAAAQAAEAAAABqtEsTbL+LX3tjsftn9hcXvnJfsXPPxRoEaKXV5aXi9DPHilM/PFosPf6IBhEAuikK/d5feUtx2T+5RdEHuqPX4RmEgRf/1xeLF/7nF9Z/jQDQCbt/Zl9x5T//1+s/AbraCbr8Df+yuOg1NxbPfu7Pi1M/PKZRZv0daILZF/+rfuvfKv4AzokCQJcS7yt/872G/AGcGwWALtn7K7cUu/a+QkMADIlzY8yLQgBoZcKNCX9FseY1kxfQNCZFzzh0aYLZiKV+duxZEgLaa4cmaHFHKc6VP/nf/01jCADtcaEJLiDcsWW423X5lZphVoFLE8zG7lcKAABbhbs91/yCZhAAAAABAAAQAAAAAQAAmIBVADO0HXOXLZgCQAAQOmgR4Q4QAJpSitcaUI53KCvCHcIdAgAdrCrKSnurirIi3IEAAMIdwh0CAADC3Zx8GN/njFgGCAACAAAgAAAAAgDTc1ULgHliEqAQ0FrmRQMIAAhcCHeAAKAagcMJ360AgD0b'
        $Background &= 'XU5AAACEN+EOBAAA4Q7fR+tYBggAAgAAIAAAAK1kDsCMrBXzd2nL3Cegy1ZWVoqlpaXi+PHjxeLiogBAt0IJ7STcwUudPn16vdhH0T958uT6q/z/CQCAcIdw17KCHz+7WOQFgHk5I6+1+LS8w2kJhLvt/XzRox8U+/i1gi8AMJOjVp9TuIPZKhf8+BnX9BEAAOGOloW7crGP4q/gCwAAtCXcrY0u+PETAQCAllntFf4TK2vF8y8uFd/97ncVfAEAgDYX/BNn1oqTvZ/LK2e7/idOnlH8BYB2mccbAXWB6WswH86s/rTgn1r9acFHAIDaghfCHdtb8OPnmVVHowAAINy1zqmVtVIPvyhOK/gCAADtE0P4J0s9fPVeAGDD7sra6CU3brICNEAU+ZP9Yr+s4AsAJAUD2km4oyUFP3r5CACAcEfLwt36krx+sR9cy0cAAKBl4W6jNfjaVgAAoEUsyUMAAFDwQQAAaANL8hAAADpS8MvX8NtU8GUXAQCAvvJwviV5CACwiZUXni0u2HulhkDBBwGALnn+Cw8Ue675heKy1/+GxmCulZfknVjxlDwEgBbyQODx5dxk5YX//jfFqWeOFS9/yx3Fzj0Xa1YUfBAAmP+wlOPkE48WP3rh2fUQcOErr9G0LQl3TTK8JM9T8hAAYEZOP3Os+NGn7y2u+I0/KPZc8/MapCXhbq4Lfun6fWcKvmdfCAAwj1aXl9ZDwOVv+q3i0hvfrEFIszw0Ya+zHXy38BUA6HLfZ/79+Mv/qTj9o2PrQWDnnos0CAo+AgB0xdI3v1KcfuZ765cELBVsp8zB6HKxtyQPAQAaLuYFPPOXHy2ufMcHTA5soSplWsFv7nfHZHZqAroq5gU885d/uD4iQEf3gV61OX56rfjRydXi2E9Wisd/fKZ46vhK8Vzv94o/RgCg5Ra/8Mni1FPfKhbecofGaLmYoV++j741+AgAzMBa3ixZy23SDeYFxCUBkwPbVfA7uSQPBIC2'
        $Background &= 'Zgknsa0sf+9bE/+ds/MC/rC44m1/sH3zAoS7at97r9CfWikUfBAAYDLxEKFn//reYu+b3llc/ItvEO4aUPAbsyRPuEMAgPm2unyiWPzCf1y/JHB5LwgwPwbX7Ru5Bl+4004CQEf36aJ5y1u63l85/uiXijM/+l7x8rf9gXkB21jwLckDAYBtCC1dF3MJ4pLA5be062FC8xjuojdf7t0r+CAAwLaKSwHPRQh4yx3Fy179y8JdYsEv9/AtyWtvuEMAgMaKeQHP/5f/UCy85XeKi7ZjcmALWIPfnXDX5fcvAEBLnXzi7wWACQq+NfggAEDjxMS/Xa/cV1z4imvWHxoUcwB2X/3zGmYD1uCDAMAozoWNET38uA+Amf9bF3yPxQUBACFg+yXNfrr4F29S/Edo9Bp8QABAwNrKqae+bai/KF+/n4Mn47mLHggAOv/U7fijf1tc/Mtv7tQowPlr8OfwUbjuDtdew+HOdy0ACAHUISbzxVr+E//nK+tL+0YWw95/P/73Xyou+9W3tbrgrxd6S/IQ7gQAaLv1yX1vfGexo9ez39MLAc/99X0b/tmlR/+2uOSX37z+Z9vgzGq/0K8q+C4mgABAh0Thv/iGN5/7fVzjj9epp7616SjApQ0dBRgUfEvyRnQ4NQGs26kJaPUO3uvBX3H7+88r/gOXvn7z4h6jAGsbXCaYN9GjX1xeLX54YqX47otniid7rx/0fv3CqVXFHzACQHfEzXt27Lm4uPyW31m/7j9Kk0cBzl+Dv2pJHiAAQLjyX/27sf5cjAI899ff2nQUYB7mAgyK/bKCDwgADRMn7DVrqefNvI4CzNUafEAAoOkhRCEZOQrQK+7PPbj5KMCl//TW2v799SV553r3Z4u+cAcIAG0aAGjYe+5KSdl99es2HQWopeBnr8EX7tpLuEMAYDtCS1dc8qtvK05tMApw6RvfWakt5nENvpLSpANxzedFAIBZjgLE7yMYxP83TcGf5zX4TrEtHjDQ'
        $Background &= '8UAAgMks3Pr7xYn/+5X1tf8Xrk8OHK/wD67dn1p10x0UUAQAaF7Pac9F6w8BGrfgW4MPCADQYtbgAwIAdKjgW4MPCADQUoMlecurhYIPCADUQWGZp4KfugYfQABg0/pvfevMxU31Tqysniv2Lyn4brICCADQfKcnXYO/SSgTDRpOuAMBgPYqL8mLX2euwTde03DCHQgAtLPgL1mSh3Dnu0EAoJ3KxT6Kv4IPIADQ8oJvSR6AAEALRW9+qb8kbzC0D4AAQIsLvjX4wDxZ6+Ay7V2+SOpSXpI3cg0+gNohANCugu+xuAACAGez5fr/2uTUSnFusl707l3CBxAAaKFza/DPWIPfdjvcRQ8EALqrXOytwe8W82iEu23c+XxJAgDbWfAtyQPhblven69IAKBe55bknbEGH0AAoBMF3xp8AASAljq3JO+MJXkACAAKPgAIAM1lSR4AAkADVK3Py6Un5MVLwQdAAGhIBJhk+Y0lefPNjXIAAYAUCn7D4pyblQh3IAAwKUvyQLhjwy9AGwgA7bGyslL8ZPlMcebEioIPgADQVqdPny6OHz9eLC0trf+M37/iny0Vu1++qnEAEADaXPABQABomZMnT54r9vEzhvgBQABQ8AFAAGiacrGPnwAgACj4U1kruvWcayupAQSAufbNb35zNv9QrG3t0PrWDT+pm6wId4AAQAe5yYdwh3A3zf6FAAAIdwh3CAAAtCncCZIzs1MTAIAAAAAIAACAAAAAtIJJgDMyfCMgc2oBEAA6GghoJ+EOEAAYqvoVyr51uMIdwh0IAMIDbaoqyopwhzYWAEC4Q7gDAQBAuIM6WAYIAAIAACAAAACtZA7AjAzfCKjtTH0CEADoaOBBuAMEAMwGRrhDuEMAEAKY5KzktARdCXfOkgIACE7CHSAAAMIdnQh39gkBAADhjvq4DwAACAAAQBe4BDBD5QExU58AEAA6HgZoF+EOEABAuEO4AwEAQLgDAaBjZ4617VkW40Yr'
        $Background &= 'AAgAHQ0etJNwBwgAINwh3IEAACDc+exsyo2AAEAAoLZQqwkAmCMuAQgB28IVTgABAGEI4Q4QAADhjq6GO/uPAACAcIcA0IYjZ83ylpl3VwxGAwgAdDN0IdwBAgAg3AFnuQ8AAMKdAAAAdIFLALMKtcVkM2hd4QRAAOhoYKCdhDtAAADhDuEOBAAA4U4bMhsmAQKAEQDqjbYNybZusgIgACCo0CLCHSAAgHCHcIcAAIBwR4eYBAgARgCoLZwXlreMy0AmgABAR8MSwh0gAADCHcIdAgAAbQ13QuLsmAQIAAIA9cVjuRaA+eESgBDAONxkBRAAQHhDuAMBgPFryCTnJM0Fwp3vAwFAWKBFHU5NAAgAINwh3IEAACDcwUxYBggAAgAAIAAAAK1kDsCsxNKWNi9vsZYaQACgowEH4Q4QABiqj5oA4Q7hDgFACGCTc5ImgO6GO4FTAEBQQrgDBIDGW/3xDzUCwp0mEO62sOJcOTOWAc7Imae/oxGAVoe7jJdzpQDQOqe/9VWNAOBcKQB0zeriD4sz3/2GhgDYQJwj41yJANA6S5//c40A4BwpAHTNyg++Uxz/z5/46V0B2353QIAxHf+bT6yfI5kdqwBm7NRjX1r/ecm/+Dc//Y9CQHu50QqMVfxP/f2XNIQA0I0QEMsCL+6FgJ2X/8zkNUUTNodwJ9yxoTgPxqio+VECQKfEDv/Cv//9Yvf1by4u/IVfLS646tqxw4CS0uKaogmEuw4U/RjqP/X//se5EdF58OpXv1oAYPajAfN0EAB00aWXXtq5z9z5SYBXXXWVPR+g4y655BIBoGu6OOwDgFrQ+QBw3XXX2fMBOuz666/v5Ofe6Yu/3t4P0GE33XSTANBFMexjHgBAd73hDW8QALrqXe96l0YA6KAYBe5qJ7CtAeDJSdNfF2eAAugAjtUBfLKNn10AKM4u/zAKANC93v+YE8FbGQBae+Oxo0ePTnybrve+973FP/zDPzgqADrg/vvv'
        $Background &= 'H2v4f//+/a2slW2eA3Bk0r/wgQ98wBEB0AG/93u/N+61/yNtbYM2B4CHJv0LsSJACABot5j3ddttt9VWSwSA7Xd4mr90yy23rL8AaJ8pOnqH29oWrQ0A+/fvf3LaLy52DiEAoH3F/5577plk1dfhfi0RABro49P+xQgBVgYAdLb4V6ohTdD6x48fPXr04d6Pg9P+/a985SvFvffeWxw/ftwRBNBAcb0/Jv1N6Eiv93+zANDsAHBD78cjVbbxgx/8oLjvvvuKxx57zJEE0BAxyz9Gc6d86Nu1bR7+70QA6IeAD/d+3F11OzEa8Kd/+qfrgQCA+RTD/NHrj9eUd3n9SK/4f7jt7bSjKztE1UsBZV/84heLw4cPu2kQwJz1+GMCd4XCH1o/9N/FALBQnL0UcCBrmxEAYlQgXsIAwPYU/Rjij7X9CU/1e7L3urEXABYFgPaFgJgPECMBC9nbjkmCEQKeeOKJc782cRAg1+B6fszqT36cexT9m3vF/9GutOWOru08dYYAABopev5v71Lx72QA6IeAhX4IuMF+D9Bpj/Z7/otd++A7uvyt94LAfb0fd9n/ATrpj3uF//1d/fA7uv7t9y8JRBA46FgA6IQjvdf7uzbkLwBsHAQO9X7cIQgAtLrwf7xX+A9rCgFgoxGBCALxrMgDWgSg0Z4szj4Y7pNd7/ELAJOFgQgAN/Rfl/deMUqwvnpgxw5NBzAP1tbWBr+MiXwP9F4/Ls5O7nu07bfzFQBqcOzYsSj+B3uvXyuFAADm36P913/tvY7s27dPCBAAxir6MfR/h4IP0KpA8Mne67AwIAAMF/5DhQmAAF1wJMJALwg8IAB0t+jHtfy4B8CdhbsCAnRNzBf4eO/1x70wsNjFBuhcAFD4ARAEOhYA+kP99yn8AIwIAu/v0qWBTgSAXuGPCX33Fyb2AbC5I/0g0Pp7BuzsQPH/cO/HI4o/AGM4GDWjXzuMADS08B/o/XhQ4QdgSjEK8Pa2Lh1s'
        $Background &= '5QhAr/jfptcPQEU39EcDbhMAmlH8P9zv+ZvoB0BVUUsebOMlgVZdAuh9QTHR75D9FYAaPLBv3773CADzVfgjoT1cVBzy37lzZ7Fnz57iwgsvLHbt2lVccMEFdneABlpZWSnOnDlTLC8vr78SxbyAm9twz4DGB4CM4h9F/9JLLy0uuugiRw1Ay6yurhYnT54sjh8/nhUGWhECGh0Aqhb/6OkvLCysBwAA2i8CwOLiYnH69OnKIaAXAG5scls0fRLgfdMW/7179xZXXXWV4g/QIXHOj3N/1ICKbujPOzMCsA29/yj+d02ceHbuXO/1X3zxxY4EgA6LUYBnnnlm/RJBBfEMgfcLALMr/rEm88Fp/m4kvxj6B4CkEBA3CzosANRf/A8UZ2/yM/E6/yuuuGKinv+3v/3tSu/1mmuuOW9i4YkTJ4rvfe97lbb5ute97rzfP/fcc8Wzzz479fbi/cX7zNzmlVdeud7WZfG54/NnbrMJ30/Vbdbx/YzaZhO+n4xtZn8/szom6/h+unpM1hQCYjLgjU27Y+CuBga2+6cp/jHLf9ziHzvcJz7xiUoHR7j++uuL3/3d313/9Ve/+tXi05/+dOVtvv71ry/e/e53n9vmX/zFX1Ru0He84x3FwYMH138d24vtVhWfOz5/iLasemKIk8KHPvSh9RNOtGFss+qJIbb5kY98ZP1nnLQ/9rGPVf5+4gT2wQ9+8NzJ8M/+7M/m8juP7zu+9xD75ZEjR+byO49tDk7g99xzT8p3PtiPMr/z973vfevbjvcX77Oq8rnjscceW9+PqirvR5/97GeLz3zmM5W3GduL7YZ4j/Feq34/sc3yflT1O4/vOtpyOFSVxahwBJoIAVNa6Nemm5tUTBs1CbDX+49r/gcn/pA7d0404SPjpD1IrwMZxb+8zfiZUQjK24wDLaP4D3pBgyJYtRAM3uOgVxXvsepJYbh3EdvM+H7K7ytrm+XvJOv7eeqpp0b+uopyiMj6zh9/'
        $Background &= '/PGRbVtlm4M2jP0p6zsfFL6M7Q2K/qANs76f+NyD43JpaSllm3EOyvrMo85rGe8zPvOnPvWpLf/cYDl4lVzdr1ECQA3FPxLW3VNFs4WF9RAw7sE8OEgyUvzgZJh1kJS3meXqq69OPdGE1772tes/yyfwqiKhZ55kw6B3mXVCHBWCqhoeZu2SzP18VM89+7se7KOZIW1wLGW25zjD4pNuc3BuygzmN9+c06Ee97weHcVxa8UG7u7XKgEg2X3FFEP/8WW+7GUvm6q3VdVgaKzqsNhADI9lB4C6tjk4uVa5FjpcBAeFMKMnOFxYs8JP5ol1OPg0SR3tkFWwB/tP7KdZ4Wqwn8f2sm4oNthmtGXWNgefPatY1xEAyufhwTk0a1RlnHpRcRRgoV+rBIDE3v+BYsp7/MeBM0miyyrWseMODtqsbcYBVsc26yyCWdssn/yzRgAye4DUL6sIlvefrHBV7l1m7VflYycrUJVH5LIK9mCb5c5E5jazQsDDDz881p+75JJLqv5Th/o1SwBIcve0f3GS3n/m8P9gp63jkkJsL2ubgxNLxmzbUSeWrG2WT4BZ26wjVNTR8x1coulisa67HbK+r/JIV9Y2yyNyWdssHztZxbq8miBzm4NzXNY2Y3vjnDviGTAJ++/dTThO5z4A9K+nTNX7j57/JF9k1vB/DAMODtisa+B1DNWXD66solo+WWVus3zyzyrW5W1mvdc6Cl8dN62qI6jUPbqS1Q7l4yfrEkA5kGdesx9st455AHVcBiiPfFY1GOWM95n1PY17jk/Y1w41YS5AE0YApp5VOemOmBUAyhNXsrZZPlizAkD5kkJWUClfq88apSgXrMzwU0eRKoeKrPkPdas7DGTJLIJ1jCoM9vfM/WqwD8U2s4rg4NLCqPsNZISqrGBRvsx50003pW9zq9oRT4TdrtolAPy093/ntH9/kuH/2DGyepaD4f/MYfXBOv3MIljHsHod1//rKlB1BJVy6Mzabh2F'
        $Background &= 'r25ZxSpzFKnuEDgo1pmFtRzM67i0kHV9vVxYswJAefVU1vsc9zJA0ijAnfM+CjDvIwCRoKZqwEmH/+d58l+cTAcnlMzr/3WNKmSfvMu9tKyRivLJNLOnbmJhbgAoh/I6lq5lfmflwJs1slDH3II65gGUz0vlkcWsYBH7U9Z7HfemVxVXAxT92jXXowBzGwCq9v4n3QEzA0B2D7A8/JVVrOJkUj5JZ4x+RJuXT1LzPLGujrX1da3XL89UzzqxlrfTlG3W1cZZxbqOsFI+h9SxzfJ8pcywkrV+v/xey6OgWdvcqhOZsCJgrkcB5nkEYOref5hk+H+4cE978i/ftnRwYqlyIoy/Gzv9W9/61vOKQdWTYLzHwS1Bsw6ueE+xzfLnrTohaPD5y8n/uuuuS/n8g9vgDn5f9SQ4+P7Lhttjms8f77P8eWNfyPj85f09fp3x+cv7afSqb7311pTPP9ymVT9/7E/lzxv/RsbnH27T2Herfv7yNgf7WNXPP3ys33777SmfvzySEvtCxucvh7PBeStj/x9XwmWAuR4FmNuHAfVS03d6Pw5MlWp6ye1Vr3pVAQBVPP3008WZM2eqbOLJffv2XWsEYPzif2ja4j9IjgBQ1STPkdnAgX5NEwDGVOkmCgmTNwBg/XJyxecDVK5pdZm7xwFX7f3H2s14tONmYhZszAQdNRkkrjnVceOVSecDlJ+Lvdn7HVdcN4trneX3EDOhY7tVJuvF9bTytd8mbjcmgFZ9ct9G2636mN26thvXwYevBWdsN65ZD8+nydju8FyQENusOnl31HbjUblVVsUMrt03abvRDsPXxuvabhxrmcuupzkXx/l13NUKgxVlx48frzwKsG/fvgcEgBqT0laT/6KIxjOmN9r56nz62KQn6Jjws9X7nfTkPDgYB9utKtor1qk3ebsZz1qf1XYjDGZudzBxK3O7gxNs9nY/+MEPnrfdeMR2Hdv9zGc+U3m7UeDq2u773ve+826M1bTt'
        $Background &= 'Zj3GvMp3Pggo0SkaZwJ4jCpXDACD2jZXAWCuLgFU7f2HrZZtxAMhtit5TnsAZb3f8nKyrGWPgwOpju3OIpjVdbe+urab/ez1Jm0389HSZV//+tfP/Tpz9K+u7ZbbIfO+E3Vtt3xOGF5+vJ1i3xw35MSo8lYjy+OOAggAG7uzyl8eZ/i/rgJVxwhA5vst36I3s6AO3/Uss/CVhw7ruK1wdlFp4mN765ZZSMphoq4bLmUWp6WlpQ2PvyrKN/Kp63a+w/f0yAxuWbf1zTDJnQEvu+yyba9xrQ0AvWR0sPfjhirb2Gr4P3bwzEIyiwBQxx36hk8imdut6/a/WcGizt5H9o2V6i52swgvda7IqWvbWYVv+FjI+h6Hz2FZt4oePtfU8bTAkHVDnyyTPCAoYTLgDf1aJwAMqTxLcqvh/6wH88yi+MfJLXPYu3ydKw7G7McJZweL4buzZb3fugrdcLDICkJ1F9FZBKN5H10YPs7quI1xZrAYPsYy75RZx22CQ3kkc/gGR9ttklHWpEs5c7MiYC4CQD8RVUpFbRr+HxwcmY8SLp8sM4PF8K1/67r9b+YtkDc7+c9bsGhir7+uHvWsQktWsBgu1JlPHqyrUJeD6/Dd/TJD1jwFgG24DHBwXkYB5mUEoHIi2mr4fzuXnUxarOse/s/qnQ5f18x8ctvwiSdrBCDzJDyL7db5qN4m9vpnEWAyv8u6HmY0fDzU8aTAUNflhXi/8/TgrHFHhy+44IJiz549rRkF2PYAkNH7HyeZNW3yX5w46goATQsWmfM26ip6ddw7oi2yLmEMjwJlfZfDx0NmYapruH74WKtru5mP4R0+judpLsAk9SHpRnNzMQowDyMAd1TdQAz9RzJrUwDIHKavawJgXcP0wyfgOh/Xm9XOWT2luorndqpr8ltdYS7avK55AFmjC3X11IfPDfHd1RW0qj4sLNMklwHiPccl53mofY0OAL0EdKD341DV7Ww1+a8pw//lZ15n9aZH'
        $Background &= 'Ff+6rtPXtQIgawRgnoYc5/E913m5oWltk3V5oa6e+nAoju1mFdNRw/V1bDdkPTY4wySTxJNG/A71a2BnRwBSroNsteM3ZelfPD41uydT1zDbqEd9ZpyAynMgsnvBoyZLZfRuohANnySz3vNwj7F8i+jsYp/V0xsunlm90+G2yFoDP6o9s46b4TbNKtSjClDWcP3w+6v6WN+NRkMG256XSwGTdIy26nTOugZOa9seB9xPPt+pup0Y/r/qqqu2/GKr3uu9bnHwDq8jr/qeh7dZHhGp0lsffvZ5+T1n3Et+1HuOtqgS5Mq30x0Oh1WWhw6WNI06QTbxPVd91sJG7zl6f1VWtWwUZus8Tqq+582Ok6a956r73FZBYjDnKXP57KThctLVFDEKk1RTrt23b9+TXQsA9xcJw/8LCwue/gfATC0vLxfPPPNMxqYe6AWA93QmAGT1/sPP/dzPbTkBEACyPf3008WZM2caOwqwXXMAUu6HPM7sfwCoQ+Lo87Y8I2DmIwC93v9Cv/e/UHVbmw3/x3XueOxk1Ws08Uje4WtD8RjSqte641rYhz70oZdc949Hp1ZdmhYTo+JRpGWDx7JWnRAZ1/HiEZplcW0w2mRe2zra+M4773xJW8fjhTNvXkRzxfH47ne/+7z977Of/WzlR+LGPhf79fBkxXvuuafyvhdzLWLb5evqcXx/7GMfq3wsjjrO45xa9dHOGz2CN+s4r6ut4/3G+x6ew7C6ulp8//vfz9gFF/ujAIttHwG4K6P4D3amUQbPYs+YoDE8KSUOgqo76qAADS/liZNNxrr0UTt7nMwyVkOMmqSTUfxHbTs+R0Zbx+cebusILYo/5eNxeF/LOBZj34tjb5xjdFLx/oYn5mVNTIu2GH6PGRP04r2NOl9kbDva+lOf+lQtbT3o5LykgO7cmbUiYKFfG2dqpgGg3/tPGeqI2zFuNPyfedOf6667rpZtj3rcZta9/0ctjcp8rPDwwZW1uqLOB+qM'
        $Background &= 'OhHBLIwqQHWt2c+8PfLXv/71836fdROjUXc5zXxQ0nBHJ+tZCRudQzMvA/RrZGtHANJ6/5ulrqyn/kUhHS6mWYV0eKeMgyKrRzo8vFbnXQUzi3RdTwAcdYLR+2fYqJvrZBi1H9e17eHbaGeGi8yHDtX5cKDhc3TWtuMcPer8H3PRtnoQ3byOAswsAGT2/sNGD/+Z5JaOWxled5zZ263r/vxh+MYrmUW6rrv0jbqpS123FjYCwLjFtK5t1/XEwcxCXee2h0c763zyYLznrO9yow5g0lMCZz4KMMsRgNuKxGv/ce1lki9omn9jeGfPGlkYte2sADDqQMoKRKPuQpf1vkcd/FnhoulPvWN7QkDmUwGHw2zmsyPqeuBQhOS6htNHdaayeuqjbv1+00031RoAokO6UU2aYhTgtjYGgLRbHm52/SyrSMeOPvzvZIWLUTt6XZcWMov0qJNWVi991EmrzhEAlwDYqlBnPmugrsf3hrqeN7BRbzrL8DmvCZcYNroMEMU/8cFGM7s98EwCwLFjxw71fhzI2t5Gw/9xUq9r+H/U4yyzAkDmtkfNLahr25m99FHhImvbo3pyLgGw0Ql+q/CYEQDq3HbWMxJGBeVRk5ezinT5YWjZ4SJz2xt1Mvfu3Zu1Gx7o18x2BIC1tbW7e68i47XZUEsTJv+NGqLP6qGPOjgz5xbUue26Lltk9+Rot+HedNblo1GjWVmXAUYdh1nFbtT8oaxt1/m+R52v67zEEGJV2u7du4ukWjeTUYDaA8DRo0dTe/+bDbNkFelRDx1pwhD9qG3X9YjezB56nGSHv9fMHvqopYswytLSUuNGAJoaLkaNfGZte9RSw1GXdTMDRkh8SuCBfu1s/AhAapLZ6Asctf5z2u3XWaRHPf+6ziH6OsNF1vseFS6yAkCd26Z9hvfpzMl64+ybWeEi67HDo84hmTP2h8PLRuffaYy6r8qo8292AEiaDJheO2ceAHoJ5rbs3v9GjRvPx666'
        $Background &= 'ww9uBzpqO1V3+MG2Rw0pZsw2jlGLUQdOxsEUJ5NRw2cZJ8do11tvvXXkf8/4Pm+//faRn8dlAUbtL29961vH2vcnNeoYj3PBqH0/K0iMunXtpDYq9u9617sqXx6J9zbqxkVxnswIR6PafKPz5DTtspHEJYEH+jW0NrU+C6D35h+ONs/a3ite8YrMmZYAkCqeDviP//iPWZs7sn///pvreq+1jQD0iv/BzOKfvMwCANLt2rUrs1Yd7NfSZgWAYkbX/gFgniROBkyvpbUHgOzevwAAQFNEvYqRgHkfBahrBCA1sRj+B8AowJwHgF5SOZDd+49H/wJAU8TKtEQH+7V17kcA0pNK3F0JAJoiLgEkPSa4ttqaGgD6CeVQ9ptMbkQAqF1y5/VQ9ihA9ghALdcpVldX7UkANG4UYJ5rbFoAqKv3H1ZWVuxJADRKDZ3X1FGAzBGA2tYqDj+gAwDm3cmTJ+vYbFqtTbkVcC+RLPR+PF9nQ/7sz/6suQAANELyLYGHvXz//v2L8zICcFfdjRlPjTIXAIAmyHpaap01t/IIQL/3/53ea6HuBo37AcQDgRIftwgA6cX/+PHjdf4T0fu/tuooQEYlvWsWxT8sLy+vD6m8+OKLRgMAmCtR9KNG1Vz8i37NrTwKUGkEYJa9/1FiToDRAAC2W3RQZ6zyKEDVRYoz6/2Pcvr0aXsdAF00GAX48LQbqNp9vsN3AADbolINnjoAHD169FDvxwHtDwDb4kC/Fs98BOBubQ8A22rqWjxVAND7B4BmjwJMOwKg9w8ADR4FmDgA6P0DQPNHAaYZAbhTWwPAXJm4Nk90I6BewjjY+/GwdobJrK2tuXvlqBPQjh1u5gV5bt6/f/+Rcf/wpDcCcu0fJhBFf2VlRfHf6kS0a1dxwQUXaAioJmr02AFg7BEAvX+YTBT+eCQo448GxO294ydQ/yjAJGNvev8wpij8iv9k4jLJqVOn1n8ClUYBxjJWAOj3/g9qVxiv5x8v'
        $Background &= 'phMhAJjawX7NThsBcM9/mKD3jzaEbTRWzd7yYlsvSRwozj7yFxij96945dizZ49GgOnFo4KfrDoC4No/TBAA0JYwB7as3Tv0/iFHLPU7ffq0hkgSqwF2796tIaCmUYCtRgD0/mGCAEAeN0+CekcBduj9Q47l5WWNkCxuDhQ3CQLyRwE2GwFwz38Yk+vV2hXm1J0TjQD0ev8L/d7/graDrbmBTX3cJhgqWeyPAiyOOwJwl+IP44nr1Iq/UQCYUwv9mr71CIDeP0wmZv6brFaveEaApwZC7ijATr1/mJ6Z6rOhjSF/FGBUADD5DxSmuRKXAVxmgUru3DQAHD169JDeP0xWmBC2oAmjAP0av+EIgN4/6JUKW9CBUYAdpd7/gcKNf2BsJv/NnsmAUNm5GwOVj6TbtAuMx+Q/owDQUOdqfTkA/Jp2AYVonrnnAlT2ay8JAMvLyzdoFxAAmhACgOmUa/25AHDy5MkDmgYUIOEL2qtc688FgDNnzqy/gM0Zgtb+0ETDdX7nUDLQQrCFHTt2aASgib3/835/XgCI55nH0iZgY5ahba94OiAwmajtUeM3DABhaWnJEBtsYffu3UYCtkE8FtijgWEyUdOjtr8kTA9+0TuZLfb+0EJcH3jxxReLvXv3ajXYQBT/CAFxYAnMs2HkBaYTNX1w7T9q/UsCQO8kdqTo3yAghgpeeOGF4rLLLtPLgS2CgGMEmNeefxT/8qX9fq0/G6pLf/ah8l+Mv7C4uGhOAAA0zCY1/KFRAeBw77VY/lOx3jlGAn7yk59Y+wwAcy5qddTsqN0j6vZiv9afHwBuvPHGxZ07dz4waoMxc/D5559f32D8WhgAgPkp+lGbo0ZHrR6e7X+u4PdqfNT6we93DW3kIzt27DgUkwE3GlIYDCfEhJxYjjNYkhO/N0kHAOot9oNO+ODGPuN0ymPyX9T48/7b8B965JFHDvZ+PKyZAaA1bu71/o+cNyIw/Cf6f+A92goAWuE9w8V/'
        $Background &= 'ZADoh4AH+iFgUbsBQCMt9ov/A6P+z00XMD/yyCPx2MD7eq+D2hEAGiN6/O/vFf9HN/oDY93BpBcEDvV+3Nl73aBNAWBuRcH/+Ea9/okDwNCIwB39EQFhAADmo+hHj/+Tm/X4KwWAEYEggsCCMAAAMy/6i6Mm9wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMLH/L8AAZRJb1VkLpwEAAAAASUVORK5CYII='
        Local $bString = _WinAPI_Base64Decode($Background)
        If @error Then Return SetError(1, 0, 0)
        $bString = Binary($bString)
        If $bSaveBinary Then
            Local Const $hFile = FileOpen($sSavePath & "\background.png", 18)
            If @error Then Return SetError(2, 0, $bString)
            FileWrite($hFile, $bString)
            FileClose($hFile)
        EndIf
        Return $bString
    EndFunc   ;==>_Background
    
    Func _WinAPI_Base64Decode($sB64String)
        Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
        Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
        $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
        Return DllStructGetData($bBuffer, 1)
    EndFunc   ;==>_WinAPI_Base64Decode
    Alles anzeigen
  • Währungskurse abfragen mit "_GetCurrencyRates()"

    • Oscar
    • 9. Januar 2023 um 07:30

    Ich habe mal eine Funktion mit dem neuen Map-Datentyp geschrieben. Damit ist die Umrechnung schön kurz und einfach (Edit in Post#1).

  • Währungskurse abfragen mit "_GetCurrencyRates()"

    • Oscar
    • 8. Januar 2023 um 10:08
    Zitat von Velted

    Nur eine Anmerkung, auch wenn es in diesem Fall keine Rolle spielen sollte:

    <?xml version="1.0" encoding="UTF-8"?>

    ja, stimmt! Ich habe oben mal BinarayToString angepasst. Mit "4" wird's nach UTF-8 gewandelt. Obwohl hier ja keine Sonderzeichen vorkommen.

  • Währungskurse abfragen mit "_GetCurrencyRates()"

    • Oscar
    • 7. Januar 2023 um 12:12

    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:

    AutoIt
    #include <Array.au3>
    
    Global $aCurr = _GetCurrencyRates()
    _ArrayDisplay($aCurr)
    
    Func _GetCurrencyRates()
        Local $dData = InetRead('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml', 1)
        If @error Then Return
        Local $aTmp = StringRegExp(BinaryToString($dData, 4), "<Cube currency='(.+?)' rate='(.+?)'", 3)
        Local $aOut[Ceiling(UBound($aTmp) / 2)]
        For $i = 0 To UBound($aOut) - 1
            $aOut[$i] = $aTmp[$i * 2] & ' ' & $aTmp[$i * 2 + 1]
        Next
        _ArraySort($aOut)
        Return $aOut
    EndFunc
    Alles anzeigen

    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:

    AutoIt
    ; die Waehrungskurse werden "nur" taeglich aktualisiert, es reicht also die Map einmalig bei Programmstart zu erstellen.
    Global $g_mCurr = _GetCurrencyRates()
    
    ; Beispiele fuer Umrechnungen in verschiedene Waehrungen:
    ConsoleWrite(_ExchangeCurrency($g_mCurr, 10, 'EUR', 'DKK', 2, True) & @CRLF)
    ConsoleWrite(_ExchangeCurrency($g_mCurr, 23, 'GBP', 'AUD', 2, True) & @CRLF)
    ConsoleWrite(_ExchangeCurrency($g_mCurr, 978, 'NOK', 'CHF', 2, True) & @CRLF)
    
    ; ============================================================================================================
    ; Name...........: _ExchangeCurrency
    ; Description....: Rechnet einen Geldbetrag von einer Waehrung in eine Andere um
    ; Syntax.........: _ExchangeCurrency($mCurr, $fMoney, $sFrom, $sTo, $iDecimalPlaces[, $bExt])
    ; Parameters.....: $mCurr = Eine Map mit den Waehrungskursen (Rueckgabe von "_GetCurrencyRates")
    ;                  $fMoney = der Geldbetrag, der umgerechnet werden soll
    ;                  $sFrom = 3stelliger Waehrungscode der Ausgangswaehrung
    ;                  $sTo = 3stelliger Waehrungscode der zu berechnenden Waehrung
    ;                  $iDecimalPlaces = die Anzahl der Stellen hinter dem Komma (wird gerundet)
    ;                  $bExt = soll der 3stellige Waehrungscode hinter den Waehrungsbetrag gesetzt werden
    ; Notes..........: $sFrom und $sTo duerfen folgende Waehrungscodes enthalten:
    ;                     AUD,BGN,BRL,CAD,CHF,CNY,CZK,DKK,EUR,GBP,HKD,HUF,IDR,ILS,INR,ISK,
    ;                     JPY,KRW,MXN,MYR,NOK,NZD,PHP,PLN,RON,SEK,SGD,THB,TRY,USD,ZAR
    ; Return values..: bei Erfolg = der berechnete Waehrungsbetrag
    ;                  im Fehlerfall = 0 und @error =
    ;                     1: $mCurr ist kein Map-Datentyp
    ;                     2: $sFrom oder $sTo sind nicht in der Map vorhanden (fehlerhafter Waehrungscode)
    ; Author.........: Oscar (www.autoit.de)
    ; ============================================================================================================
    Func _ExchangeCurrency(ByRef $mCurr, $fMoney, $sFrom, $sTo, $iDecimalPlaces, $bExt = False)
        If Not IsMap($mCurr) Then Return SetError(1, 0, 0)
        If Not MapExists($mCurr, $sFrom) Or Not MapExists($mCurr, $sTo) Then Return SetError(2, 0, 0)
        Return Round($fMoney / $mCurr[$sFrom] * $mCurr[$sTo], $iDecimalPlaces) & ($bExt ? ' ' & $sTo : '')
    EndFunc
    
    ; ============================================================================================================
    ; Name...........: _GetCurrencyRates
    ; Description....: liest die tagesaktuellen Waehrungskurse von der EZB und erstellt daraus eine Map
    ; Syntax.........: _GetCurrencyRates()
    ; Parameters.....: keine
    ; Return values..: bei Erfolg = ein Map-Datentyp mit den Waehrungskursen
    ;                  im Fehlerfall = ein Leerstring und @error =
    ;                     1: die Seite von der EZB konnte nicht geladen werden
    ; Author.........: Oscar (www.autoit.de)
    ; ============================================================================================================
    Func _GetCurrencyRates()
        Local $dData = InetRead('https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml', 1)
        If @error Then Return SetError(1, 0, '')
        Local $aTmp = StringRegExp(BinaryToString($dData, 4), "<Cube currency='(.+?)' rate='(.+?)'", 3), $mOut[]
        $mOut['EUR'] = 1
        For $i = 0 To UBound($aTmp) - 1 Step 2
            $mOut[$aTmp[$i]] = Number($aTmp[$i + 1])
        Next
        Return $mOut
    EndFunc
    Alles anzeigen
  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 16. Dezember 2022 um 18:22
    Zitat von gert_nrw_71

    für jeden Scannvorgang soll eine Datei angelegt werden ID123_Start und ID123_Fertig.

    Diesen Part verstehe ich nicht. Warum werden hier 2 Dateien angelegt?

    Welchen Sinn erfüllen diese "tausende" Dateien?

    Warum nicht alles in einer Datenbank erfassen?

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 16. Dezember 2022 um 14:42
    Zitat von gert_nrw_71

    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.

  • Barcode in Variable scannen ohne den Inhalt irgendwo anzuzeigen

    • Oscar
    • 16. Dezember 2022 um 11:50
    Zitat von gert_nrw_71

    Kann das sein und wie könnte ich das überprüfen ?

    Entferne mal die ConsoleWrite-Befehle aus der Hook-Funktion.

    Wenn das nicht reicht, dann evtl. nicht bei jedem Scan die FileWrite-Funktion aufrufen, sondern erst wenn ein Zählerstand erreicht ist.

  • Bug bei Struct (Dot-Notation)

    • Oscar
    • 1. Dezember 2022 um 18:59
    Zitat von AspirinJunkie

    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.

  • Bug bei Struct (Dot-Notation)

    • Oscar
    • 1. Dezember 2022 um 17:03

    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:

    AutoIt
    Global $tStruct = DllStructCreate('uint64 data[3];')
    
    ; Zuweisung und Abfrage ueber eine Zahl funktioniert
    $tStruct.data(1) = 1234
    ConsoleWrite('@error: ' & @error & ' ')
    ConsoleWrite('$tStruct.data(1) = ' & $tStruct.data(1) & @CRLF & @CRLF) ;
    
    ; Zuweisung und Abfrage ueber eine Variable funktioniert nicht
    For $i = 1 To 3
        $tStruct.data($i) = 1234
        ConsoleWrite('@error: ' & @error & ' ') ; Error = 3 ???
        ConsoleWrite('$tStruct.data($i) = ' & $tStruct.data($i) & @CRLF)
    Next
    
    ; bzw. nur mit Int oder Number
    For $i = 1 To 3
        $tStruct.data(Int($i)) = 1234
        ConsoleWrite('@error: ' & @error & ' ')
        ConsoleWrite('$tStruct.data(Int($i)) = ' & $tStruct.data(Int($i)) & @CRLF)
    Next
    Alles anzeigen

    Könnt ihr das bestätigen?

  • kein Bug bei MAPs

    • Oscar
    • 30. November 2022 um 16:24
    Zitat von Kanashius

    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:

  • kein Bug bei MAPs

    • Oscar
    • 30. November 2022 um 15:03

    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.

  • PLZ Koordinaten

    • Oscar
    • 30. November 2022 um 14:32
    Zitat von Moombas

    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:

    AutoIt
    ConsoleWrite(_GetCoordinates('Platz der Republik 1, 11011 Berlin') & @CRLF)
    
    Func _GetCoordinates($sAddress)
        Local $oHTTP, $sResponse, $sData
        $sAddress = StringReplace($sAddress, ' ', '+')
        $oHTTP = ObjCreate('winhttp.winhttprequest.5.1')
        $oHTTP.Open('GET', 'https://nominatim.openstreetmap.org/search?q=' & $sAddress & '&format=xml', False)
        $oHTTP.Option(4) = 13056 ; THIS IS MANDATORY! Ignores any SSL Errors
        $oHTTP.Send()
        Return StringRegExpReplace($oHTTP.ResponseText, "(?s).+?lat='(.+?)'.+?lon='(.+?)'.+", '$1,$2')
    EndFunc   ;==>GetCoordinates
    Alles anzeigen
  • PLZ Koordinaten

    • Oscar
    • 29. November 2022 um 16:49

    In der Shoutbox kam gerade die Frage nach einer API zum abfragen der Geo-Koordinaten anhand einer PLZ.

    Ich habe für die deutschen Postleitzahlen mal ein Script erstellt (benutzt MAPs der neuen AutoIt-Version): im Anhang.

    Dateien

    PLZ-Koordinaten.au3 392,5 kB – 253 Downloads
  • mp3-Datei einlesen

    • Oscar
    • 27. November 2022 um 16:14

    Hatten wir das nicht schonmal (Binary-Mode)?!

    Egal, ich vermute jetzt mal, dass es Dir um die ID3-Tags innerhalb der MP3-Datei geht?

    Diese liegen keineswegs immer am Anfang und schon gar nicht immer in der Reihenfolge.

    Ich hatte mal eine UDF dafür geschrieben (s.Anhang).

    Dateien

    ID3Tag.au3 7,19 kB – 286 Downloads
  • Inputfeld: Hintergrund bedingt einfärben

    • Oscar
    • 18. November 2022 um 13:11
    Zitat von Alina

    Ich muss nur einmal klären, wieso ich dafür einmal im Input1 klicken muss und dort etwas ändere. Erst danach wird es wie gewünscht rot.

    Ja und so ist es auch korrekt! $EN_CHANGE wird ja erst bei einer Eingabe aufgerufen.

    Wenn Du das Feld (auch) anderweitig füllst, musst Du das als Funktion an dieser Stelle aufrufen.

    AutoIt
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 380, 75, 300, 600)
    $Input1 = GUICtrlCreateInput("-", 5, 5, 370, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 2)
    $Input2 = GUICtrlCreateInput("Input2", 5, 40, 370, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 4)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    
    _CheckInput() ; hier einmalig aufrufen (und an jeder Stelle, an der der Inhalt von $Input1 geaendert wird)
    
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
    
            Case $Input2
        EndSwitch
    WEnd
    
    Func _CheckInput()
        GUICtrlSetBkColor($Input2, StringInStr(GUICtrlRead($Input1), '-') ? 0xFFAAAA : 0xFFFFFF)
    EndFunc
    
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $iCode = BitShift($wParam, 16)
        Local $hWndFrom = $lParam
        Switch $hWndFrom
    ;~         Case GUICtrlGetHandle($Separa)
    ;~             Switch $iCode
    ;~                 Case $EN_CHANGE
    ;~                     Local $Char = GUICtrlRead($Separa)
    ;~                     If ($Char <> '') And Not StringRegExp($Char, '^[^\d-]$') Then
    ;~                         GUICtrlSetState($Separa, $GUI_FOCUS)
    ;~                         _GUICtrlEdit_ShowBalloonTip($lParam, "Unzulässiges!", "Unzulässiges Trennzeichen!", 6)
    ;~                     EndIf
    ;~             EndSwitch
            Case GUICtrlGetHandle($Input1)
                Switch $iCode
                    Case $EN_CHANGE
                        _CheckInput()
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc
    Alles anzeigen
  • Inputfeld: Hintergrund bedingt einfärben

    • Oscar
    • 17. November 2022 um 07:52
    Zitat von Alina

    Wie mache ich zwei dieser FWM_COMMAND Functionen?

    Einfach zusammenfassen:

    AutoIt
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $iCode = BitShift($wParam, 16)
        Local $hWndFrom = $lParam
        Switch $hWndFrom
            Case GUICtrlGetHandle($Separa)
                Switch $iCode
                    Case $EN_CHANGE
                        Local $Char = GUICtrlRead($Separa)
                        If ($Char <> '') And Not StringRegExp($Char, '^[^\d-]$') Then
                            GUICtrlSetState($Separa, $GUI_FOCUS)
                            _GUICtrlEdit_ShowBalloonTip($lParam, "Unzulässiges!", "Unzulässiges Trennzeichen!", 6)
                        EndIf
                EndSwitch
            Case GUICtrlGetHandle($Input1)
                Switch $iCode
                    Case $EN_CHANGE
                        GUICtrlSetBkColor($Input2, StringInStr(GUICtrlRead($Input1), '-') ? 0xFFAAAA : 0xFFFFFF)
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc
    Alles anzeigen
  • Inputfeld: Hintergrund bedingt einfärben

    • Oscar
    • 15. November 2022 um 18:02
    Zitat von Alina

    Ich würde gerne, wenn in Input1 ein Minuszeichen vorhanden ist, das dann in Input 2 die Hintergrundfarbe "rot" ist.

    So:

    AutoIt
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Form1", 380, 75, 300, 600)
    $Input1 = GUICtrlCreateInput("Input1", 5, 5, 370, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 2)
    $Input2 = GUICtrlCreateInput("Input2", 5, 40, 370, 30)
    GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif")
    GUICtrlSetCursor (-1, 4)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    
    While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                Exit
    
            Case $Input2
        EndSwitch
    WEnd
    
    Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $iCode = BitShift($wParam, 16)
        Switch $lParam
            Case GUICtrlGetHandle($Input1)
                Switch $iCode
                    Case $EN_CHANGE
                        GUICtrlSetBkColor($Input2, StringInStr(GUICtrlRead($Input1), '-') ? 0xFFAAAA : 0xFFFFFF)
                EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
    EndFunc
    Alles anzeigen
  • Datensätze als Array of struct speichern

    • Oscar
    • 10. November 2022 um 14:17

    Weil das normale "_ArraySort" kein "Array of struct" sortieren kann (ich aber eine Sortierung brauche), habe ich mal eine QuickSort-Funktion hinzugefügt:

    AutoIt
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    
    ; Datenstruktur definieren
    Global Const $tagWORKER = 'struct;uint ID;char Nachname[60];char Vorname[60];char Geburtstag[8];' & _
            'char Strasse[60];char HausNr[6];char PLZ[5];char Wohnort[60];char TelNr[20];endstruct'
    
    ; "Array of struct" erstellen
    Global $g_aWorker[2]
    For $i = 0 To UBound($g_aWorker) - 1
        $g_aWorker[$i] = DllStructCreate($tagWORKER)
    Next
    
    #Region "Array of struct" mit Testdaten fuellen
    $g_aWorker[0].ID = 10000
    $g_aWorker[0].Nachname = 'Meiselbach'
    $g_aWorker[0].Vorname = 'Karl-Heinz'
    $g_aWorker[0].Geburtstag = '19640428'
    $g_aWorker[0].Strasse = 'Josef-Zinnbauer-Straße'
    $g_aWorker[0].HausNr = '308D'
    $g_aWorker[0].PLZ = '75633'
    $g_aWorker[0].Wohnort = 'Hintertupfingen'
    $g_aWorker[0].TelNr = '+49 7366 783411'
    
    $g_aWorker[1].ID = 10001
    $g_aWorker[1].Nachname = 'Rotfuss'
    $g_aWorker[1].Vorname = 'Theodor'
    $g_aWorker[1].Geburtstag = '19591030'
    $g_aWorker[1].Strasse = 'Am alten Forsthaus'
    $g_aWorker[1].HausNr = '33'
    $g_aWorker[1].PLZ = '58721'
    $g_aWorker[1].Wohnort = 'Kronsbach'
    $g_aWorker[1].TelNr = '+49 4862 11598'
    #EndRegion "Array of struct" mit Testdaten fuellen
    
    _QSSort($g_aWorker) ; "Array of struct" sortieren (Sortierung siehe unten "_QSStringCmp")
    
    ConsoleWrite('Vor dem speichern auf Festplatte:' & @CRLF)
    ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF)
    ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF)
    ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF)
    ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF)
    ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF)
    ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF & @CRLF)
    
    Global Const $sDatafile = @ScriptDir & '\Data.bin'
    _WriteData($sDatafile) ; alle Daten auf Festplatte speichern
    $g_aWorker = 0 ; Array of struct loeschen
    _ReadData($sDatafile) ; die Daten wieder von der Festplatte laden
    
    ConsoleWrite('Nach dem laden von Festplatte:' & @CRLF)
    ConsoleWrite('$g_aWorker[0].Nachname = ' & $g_aWorker[0].Nachname & @CRLF)
    ConsoleWrite('$g_aWorker[0].Wohnort = ' & $g_aWorker[0].Wohnort & @CRLF)
    ConsoleWrite('$g_aWorker[0].TelNr = ' & $g_aWorker[0].TelNr & @CRLF)
    ConsoleWrite('$g_aWorker[1].Nachname = ' & $g_aWorker[1].Nachname & @CRLF)
    ConsoleWrite('$g_aWorker[1].Wohnort = ' & $g_aWorker[1].Wohnort & @CRLF)
    ConsoleWrite('$g_aWorker[1].TelNr = ' & $g_aWorker[1].TelNr & @CRLF)
    
    Func _WriteData($sPath)
        Local $hFile, $nBytes, $tData
        $hFile = _WinAPI_CreateFile($sPath, 1, 4) ; 1 = create file if not exist, 4 = write access
        If Not $hFile Then Return
        $tData = DllStructCreate('uint Count;')
        $tData.Count = UBound($g_aWorker)
        _WinAPI_WriteFile($hFile, $tData, DllStructGetSize($tData), $nBytes)
        For $i = 0 To UBound($g_aWorker) - 1
            _WinAPI_WriteFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes)
        Next
        _WinAPI_CloseHandle($hFile)
    EndFunc   ;==>_WriteData
    
    Func _ReadData($sPath)
        Local $hFile, $nBytes, $tData
        $hFile = _WinAPI_CreateFile($sPath, 2, 2) ; 2 = open file, 2 = read access
        If Not $hFile Then Return
        $tData = DllStructCreate('uint Count;')
        _WinAPI_ReadFile($hFile, $tData, DllStructGetSize($tData), $nBytes)
        Global $g_aWorker[$tData.Count]
        For $i = 0 To $tData.Count - 1
            $g_aWorker[$i] = DllStructCreate($tagWORKER)
            _WinAPI_ReadFile($hFile, $g_aWorker[$i], DllStructGetSize($g_aWorker[$i]), $nBytes)
        Next
        _WinAPI_CloseHandle($hFile)
    EndFunc   ;==>_ReadData
    
    #Region Quicksort fuer "Array of struct"
    ; Funktion fuer den Stringvergleich (Erst Nachnamen vergleichen. Wenn gleich, dann Vornamen)
    ; Wenn eine andere Sortierung gewuenscht wird, muss hier der Vergleich angepasst werden!
    Func _QSStringCmp(Const $vD1, Const $vD2)
        Local $iCmp = StringCompare($vD1.Nachname, $vD2.Nachname, 1)
        If Not $iCmp Then $iCmp = StringCompare($vD1.Vorname, $vD2.Vorname, 1)
        Return $iCmp < 0
    EndFunc   ;==>_QSStringCmp
    
    ; Rekursive Quicksort-Funktion
    Func _QSSort(ByRef $aData, $left = 0, $right = UBound($aData) - 1)
        If $right - $left >= 20 Then ; bei 20 und mehr Elementen, Quicksort benutzen
            If $left < $right Then
                Local $pivot = _QSSplitSwap($aData, $left, $right)
                _QSSort($aData, $left, $pivot - 1)
                _QSSort($aData, $pivot + 1, $right)
            EndIf
        Else ; bei weniger als 20 (noch verbleibenden) Elementen, ist InsertionSort schneller
            _QSInsertionSort($aData, $left, $right)
        EndIf
    EndFunc   ;==>_QSSort
    
    Func _QSSplitSwap(ByRef $aData, $left, $right)
        Local $i = $left, $j = $right - 1, $pivot = $aData[$right], $h
        Do
            While _QSStringCmp($aData[$i], $pivot) And $i < $right
                $i += 1
            WEnd
            While _QSStringCmp($pivot, $aData[$j]) And $j > $left
                $j -= 1
            WEnd
            If $i < $j Then
                $h = $aData[$i]
                $aData[$i] = $aData[$j]
                $aData[$j] = $h
            EndIf
        Until $i >= $j
        $aData[$right] = $aData[$i]
        $aData[$i] = $pivot
        Return $i
    EndFunc   ;==>_QSSplitSwap
    
    ; InsertionSort-Funktion
    Func _QSInsertionSort(ByRef $aData, $iStart = 0, $iEnd = UBound($aData) - 1)
        Local $sVal, $j
        For $i = $iStart + 1 To $iEnd
            $sVal = $aData[$i]
            $j = $i
            While ($j > $iStart) And _QSStringCmp($sVal, $aData[$j - 1])
                $aData[$j] = $aData[$j - 1]
                $j -= 1
            WEnd
            $aData[$j] = $sVal
        Next
    EndFunc   ;==>_QSInsertionSort
    #EndRegion Quicksort fuer "Array of struct"
    Alles anzeigen
  • Datensätze als Array of struct speichern

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

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

    Das ist doch oben im Beispiel mit aufgeführt. Die Funktion ist doch recht "einfach". IMHO.

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™