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

  • Datensätze als Array of struct speichern

    • Oscar
    • 10. November 2022 um 13:18

    Auf welche Methode bezieht sich Deine Frage?

  • Datensätze als Array of struct speichern

    • Oscar
    • 10. November 2022 um 07:55
    Zitat von chesstiger

    Aber solche Methoden können die Lesbarkeit des Codes um einiges erhöhen.

    Ja, an Enum hatte ich zuerst auch gedacht, aber ich finde die Structs doch noch besser, weil man da notfalls auch gleich einen Pointer auf die Daten hat (für evtl. Assembler-Routinen) und weil man beim Laden/Speichern nicht verschachtelte Schleifen und Trennzeichen braucht.

  • Datensätze als Array of struct speichern

    • Oscar
    • 9. November 2022 um 18:11

    Für mein aktuelles Projekt machte ich mir gerade darüber Gedanken, wie ich die Datensätze im Programm verwalten will und kam zu dem Schluß, dass ein "Array of struct" eigentlich ganz gut dafür geeignet ist.

    Vor allem sieht man im Quelltext dann auch gleich welche Daten wo liegen, weil man sie über die Punktnotation ansprechen kann. Das ist gegenüber einem 2D-Array ein großer Vorteil.

    Aber auch das Laden und Speichern der Daten ist so viel unkomplizierter. Vielleicht könnt ihr das ja auch gebrauchen...

    Hier mal ein Beispiel dazu:

    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'
    
    ; Das "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
    
    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
    
    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
    Alles anzeigen
  • Suche Magento Entwickler?

    • Oscar
    • 29. Oktober 2022 um 10:21
    Zitat von Musashi

    Das sieht mir doch sehr nach SPAM aus.

    Das sieht mir auch danach aus. Ich habe den Beitrag gelöscht.

  • ExtMsgBox anzeigen als "Splashscreen"

    • Oscar
    • 22. Oktober 2022 um 08:43
    Zitat von hipfzwirgel

    Das was die beiden aufgerufenen Funktionen machen spielt dabei, wenn überhaupt, nur eine untergeordnete Rolle.

    Und genau das ist völlig falsch!

    Die ExtMsgBox benutzt eine eigene MsgLoop und stellt somit einen blockierenden Code dar.

    Wie soll "nebenbei" noch eine andere Funktion ausgeführt werden, wenn der Prozess bereits "blockiert" wird?

    Die Lösung ist also: entweder eine eigene Gui erstellen oder die UDF umschreiben.

  • Beispiel für ein Syslink-Control

    • Oscar
    • 8. Oktober 2022 um 13:12

    Das Syslink-Control bietet die Möglichkeit, Links ins Internet in einen Text einzubetten, wie das bei HTML-Seiten (mit: <a href="...">link</a>) möglich ist.

    Man muss also nicht mehr einzelne Label-Controls zusammensetzen, um das zu erreichen.

    Zu dem Thema gibt es schon ein paar UDFs, aber da fehlte mir immer die Möglichkeit die Schriftart und -größe anzupassen.

    Bei meinem Beispiel benutze ich auch die WindowProc um die Nachrichten ($WM_NOTIFY und $WM_CTLCOLORSTATIC) auszuwerten.

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseX64=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <FontConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <SendMessage.au3>
    #include <StructureConstants.au3>
    #include <WinAPIGdiDC.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    Opt('GUIOnEventMode', 1)
    
    Global Const $g_iBkColor = 0xD0D0D0
    Global $g_hBkBrush = _WinAPI_CreateSolidBrush($g_iBkColor)
    
    Global $g_hMainGui = GUICreate('Syslink example', 640, 240)
    GUISetBkColor($g_iBkColor, $g_hMainGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
    
    Global $g_sText = 'AutoIt' & @CRLF & _
            '© 1999-2022 Jonathan Bennett' & @CRLF & _
            'Homepage: <a href="https://www.autoitscript.com/site/autoit/">www.autoitscript.com</a>' & @CRLF & _
            'Homepage deutsch: <a href="https://autoit.de/wcf/">autoit.de</a>' & @CRLF & _
            'Onlinehilfe deutsch: <a href="https://autoit.de/onlinehilfe/online/html/index.htm">autoit.de/onlinehilfe</a>'
    
    Global $g_hSyslink = _WinAPI_CreateWindowEx(0, $WC_LINK, $g_sText, BitOR($WS_VISIBLE, $WS_CHILD, $WS_TABSTOP), 10, 10, 620, 200, $g_hMainGui)
    
    Global $g_hFont = _WinAPI_CreateFont(32, 0, 0, 0, 400, True, False, False, $DEFAULT_CHARSET, _
            $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $PROOF_QUALITY, 0, 'Verdana')
    _SendMessage($g_hSyslink, $WM_SETFONT, $g_hFont, True)
    
    Global $g_hSyslinkProc = DllCallbackRegister('_SyslinkProc', 'ptr', 'hwnd;uint;long;ptr')
    Global $g_hProcOld = _WinAPI_SetWindowLong($g_hMainGui, $GWL_WNDPROC, DllCallbackGetPtr($g_hSyslinkProc))
    
    GUISetState(@SW_SHOW, $g_hMainGui)
    
    WinWaitClose($g_hMainGui)
    Exit
    
    Func _Exit()
        _WinAPI_SetWindowLong($g_hMainGui, $GWL_WNDPROC, $g_hProcOld)
        _WinAPI_DeleteObject($g_hFont)
        _WinAPI_DeleteObject($g_hBkBrush)
        _WinAPI_DestroyWindow($g_hSyslink)
        GUIDelete($g_hMainGui)
    EndFunc   ;==>_Exit
    
    Func _SyslinkProc($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd
        Local Const $tagLITEM = 'uint mask;int iLink;uint state;uint stateMask;wchar szID[48];wchar szURL[2083]'
        Local Const $tagNMLINK = $tagNMHDR & ';' & $tagLITEM
        Local $tNMHDR, $tNMLINK
        Switch $iMsg
            Case $WM_CTLCOLORSTATIC ; um die Farben beim Syslink festzulegen
                Switch $lParam ; $lParam = Static-hWnd, $wParam = Static-hDC
                    Case $g_hSyslink
                        _WinAPI_SetTextColor($wParam, 0x0000FF) ; die Textfarbe fuer die Schrift (BGR-Format)
    ;~                     _WinAPI_SetBkColor($wParam, 0x222222) ; die Hintergrundfarbe fuer die Schrift (BGR-Format)
                        _WinAPI_SetBkMode($wParam, $TRANSPARENT) ; der Hintergrundmodus
                        Return $g_hBkBrush ; der Return-Brush bestimmt die Hintergrundfarbe (ausserhalb der Schrift)
                EndSwitch
            Case $WM_NOTIFY ; um auf einen Mausklick oder <RETURN> auf einen Link zu reagieren
                $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
                Switch $tNMHDR.Code
                    Case $NM_CLICK, $NM_RETURN
                        $tNMLINK = DllStructCreate($tagNMLINK, $lParam)
                        ShellExecute($tNMLINK.szURL)
                EndSwitch
        EndSwitch
        Return _WinAPI_CallWindowProc($g_hProcOld, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc
    Alles anzeigen
  • Overheadarmes/Codearmes Keyboard capturing

    • Oscar
    • 7. Oktober 2022 um 08:52
    Zitat von Mars

    Da fällt mir direkt eine Frage ein: GUIRegisterMsg hat ja keinen Parameter für hWND. Hat ein Layered-Window dort einen eigenen Zugang

    In der WindowProc kannst Du alle Nachrichten des überwachten Fensters auswerten (wie bei GUIRegisterMsg, also auch WM_CHAR).

  • Overheadarmes/Codearmes Keyboard capturing

    • Oscar
    • 6. Oktober 2022 um 18:24
    Zitat von BugFix

    Was zum Problem führt, dass der User später keinen eigenen (gleichartigen) Hook in seinem Code einbauen kann, da dieser in der UDF bereits registriert ist.

    Bei der Window-Prozedur muss man doch nur zur bisherigen Prozedur springen, dann ist auch eine Verkettung möglich.

    Hier mal ein Beispiel:

    AutoIt
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPISysInternals.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    Opt('GUIOnEventMode', 1)
    
    _GDIPlus_Startup()
    
    Global $hMainGui = GUICreate('Example', 400, 300)
    GUISetBkColor(0xD0D0D0, $hMainGui)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
    
    Global $iTransColor = 0x00FF00, $iW = 200, $iH = 200, $iX = 20, $iY = 20
    Global $hChild = GUICreate('', $iW, $iH, $iX, $iY, $WS_POPUP, BitOR($WS_EX_MDICHILD, $WS_EX_LAYERED), $hMainGui)
    GUISetBkColor($iTransColor, $hChild)
    _WinAPI_SetLayeredWindowAttributes($hChild, $iTransColor)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hChild)
    
    Global $hProcNew = DllCallbackRegister('_MyWindowProc', 'ptr', 'hwnd;uint;long;ptr')
    Global $hProcOld = _WinAPI_SetWindowLong($hChild, $GWL_WNDPROC, DllCallbackGetPtr($hProcNew))
    
    GUISetState(@SW_SHOW, $hChild)
    GUISetState(@SW_SHOW, $hMainGui)
    
    _GDIPlus_GraphicsFillRect($hGraphic, 10, 10, 180, 30)
    WinWaitClose($hMainGui)
    _GDIPlus_Shutdown()
    Exit
    
    Func _Exit()
        _GDIPlus_GraphicsDispose($hGraphic)
        _WinAPI_SetWindowLong($hChild, $GWL_WNDPROC, $hProcOld)
        GUIDelete($hChild)
        GUIDelete($hMainGui)
    EndFunc
    
    Func _MyWindowProc($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $lParam
        Local $iVKey
        Switch $iMsg
            Case $WM_SETFOCUS
                ConsoleWrite('SETFOCUS' & @CRLF)
            Case $WM_KILLFOCUS
                ConsoleWrite('KILLFOCUS' & @CRLF)
            Case $WM_KEYDOWN
                $iVKey = $wParam
                ConsoleWrite('KEYDOWN: ' & Chr($iVKey) & @CRLF)
            Case $WM_KEYUP
                $iVKey = $wParam
                ConsoleWrite('KEYUP: ' & Chr($iVKey) & @CRLF)
        EndSwitch
        Return _WinAPI_CallWindowProc($hProcOld, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc
    Alles anzeigen
  • Overheadarmes/Codearmes Keyboard capturing

    • Oscar
    • 6. Oktober 2022 um 17:43
    Zitat von Mars

    Meine Tendenz ist GUIRegisterMsg zu verwenden, aber vllt hat ja jemand hier mehr Erfahrung und kann mir einen Tipp geben.

    Erstell für die GDI+ Grafik ein Layered-Window (geht auch transparent) und werte die Events in der Window-Prozedur aus.

    Das sollte sich wie ein Input-Control verhalten, von der Rechenzeit her.

  • Background Bild und GUI Elemente

    • Oscar
    • 30. September 2022 um 11:47
    Zitat von casi4712

    jo, danke Dir, gelesen hatte ich das auch schon, aber es funktioniert bloss nicht

    Poste bitte lauffähige Beispiele!

  • Background Bild und GUI Elemente

    • Oscar
    • 29. September 2022 um 13:46

    Zitat aus der Hilfe: "If a picture is set as a background picture the other controls will overlap, so it is important to disable the pic control: GUICtrlSetState(-1, $GUI_DISABLE)."

  • Schriftart und -größe bei einer Statusbar ändern

    • Oscar
    • 18. September 2022 um 15:19

    Ich habe gerade eine tolle Funktion im engl. Forum gefunden (_GUICtrlStatusBar_SetFont).

    Vielleicht kennt ihr die ja schon, aber ich habe trotzdem mal ein Beispiel-Script erstellt, mit dem man die Schriftgröße der Statusbar während der Laufzeit ändern kann.

    Das brauchte ich für ein anderes Projekt und dachte, dass es der Ein oder Andere auch gebrauchen kann.

    AutoIt
    #include <FontConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <SendMessage.au3>
    #include <WinAPIConv.au3>
    #include <WinAPIGdiInternals.au3>
    #include <WinAPIHObj.au3>
    #include <WindowsConstants.au3>
    
    Global $g_iFontSize = 18, $g_iFontWeight = 400, $g_iFontStyle = 2, $g_sFontname = 'Times New Roman'
    
    Global $g_hGui = GUICreate('Statusbar change fontsize', 800, 200)
    GUISetState(@SW_SHOW, $g_hGui)
    GUISetBkColor(0xCCCCCC)
    
    Global $g_hFont, $g_aParts[] = [120, -1], $g_aText[] = [$g_iFontSize & 'px', '<STRG> & Mousewheel to change']
    Global $g_hStatus = _GUICtrlStatusBar_Create($g_hGui, $g_aParts, $g_aText)
    _GUICtrlStatusBar_SetMinHeight($g_hStatus, $g_iFontSize)
    _GUICtrlStatusBar_SetFont($g_hStatus, $g_iFontSize, $g_iFontWeight, $g_iFontStyle, $g_sFontname)
    
    GUISetState(@SW_SHOW, $g_hGui)
    
    GUIRegisterMsg($WM_MOUSEWHEEL, '_WM_MOUSEWHEEL')
    
    While True
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                If $g_hFont Then _WinAPI_DeleteObject($g_hFont)
                Exit
        EndSwitch
    WEnd
    
    Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg, $lParam
        Local Const $iWheelDelta = 120, $MK_CONTROL = 0x0008, $iMinSize = 10, $iMaxSize = 48
        Local $iWheel, $iVKey
        Local Static $iOldSize = $g_iFontSize
        $iWheel = _WinAPI_HiWord($wParam) / $iWheelDelta ; down = -1, up = 1
        $iVKey = _WinAPI_LoWord($wParam)
        If BitAND($iVKey, $MK_CONTROL) Then ; if pressed [STRG/CTRL]
            $g_iFontSize += $iWheel
            If $g_iFontSize < $iMinSize Then $g_iFontSize -= $iWheel
            If $g_iFontSize > $iMaxSize Then $g_iFontSize -= $iWheel
            If $g_iFontSize <> $iOldSize Then
                $iOldSize = $g_iFontSize
                _GUICtrlStatusBar_SetMinHeight($g_hStatus, $g_iFontSize)
                _GUICtrlStatusBar_SetText($g_hStatus, $g_iFontSize & 'px')
                _GUICtrlStatusBar_SetFont($g_hStatus, $g_iFontSize, $g_iFontWeight, $g_iFontStyle, $g_sFontname)
            EndIf
        EndIf
        Return $GUI_RUNDEFMSG
    EndFunc   ;==>_WM_MOUSEWHEEL
    
    ; from rasim (https://www.autoitscript.com/forum/topic/88063-_guictrlstatusbar_settext/?do=findComment&comment=632524)
    Func _GUICtrlStatusBar_SetFont($hWnd, $iSize = 15, $iWeight = 400, $iAttr = 0, $sFontName = "Arial")
        If $g_hFont Then _WinAPI_DeleteObject($g_hFont)
        $g_hFont = _WinAPI_CreateFont($iSize, 0, 0, 0, $iWeight, _
                BitAND($iAttr, 2), BitAND($iAttr, 4), BitAND($iAttr, 8), _
                $DEFAULT_CHARSET, $OUT_DEFAULT_PRECIS, _
                $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, _
                0, $sFontName)
        _SendMessage($hWnd, $WM_SETFONT, $g_hFont, 1)
    EndFunc   ;==>_GUICtrlStatusBar_SetFont
    Alles anzeigen
  • Suche Hilfe - unzulässige Zeichen bei Dateinamen ersetzen - mit "StringRegExp" für ANFÄNGER!

    • Oscar
    • 12. September 2022 um 07:35
    Zitat von AspirinJunkie

    Doku lesen hilft anscheinend - muss ich mir mal beherzigen.

    Dito!

    Bis zu Deinem Post kannte ich die WinApi-Funktion "PathCleanupSpec" gar nicht. :whistling:

    Und SetExtended hatte ich auch nicht so auf dem Schirm (ich benutze zu selten das @extended Makro).

    Also gleich ein doppeltes Dankeschön für diese Funktion! So brauche ich nicht mehr extra eine AutoIt-Prüfung schreiben. :klatschen:

  • Suche Hilfe - unzulässige Zeichen bei Dateinamen ersetzen - mit "StringRegExp" für ANFÄNGER!

    • Oscar
    • 11. September 2022 um 19:18
    Zitat von AspirinJunkie

    Ich kenne mich mit der aber nicht wirklich aus um zu entscheiden ob das gewollt oder ein Bug ist.

    Wenn man MSDN zu Rate zieht, dann ist das wohl gewollt. Das Flag wird jedenfalls entsprechend gesetzt:

    AutoIt
    Global Const $PCS_FATAL = 0x80000000
    Global Const $PCS_REPLACEDCHAR = 0x00000001
    Global Const $PCS_REMOVEDCHAR = 0x00000002
    Global Const $PCS_TRUNCATED = 0x00000004
    Global Const $PCS_PATHTOOLONG = 0x00000008
    
    Global $sName = 'T*este /m:ich'
    ;~ Global $sName = 'Teste /mich'
    
    Global $sNameClean = _WinAPI_PathCleanupSpec($sName)
    Global $iExt = @extended
    If BitAND($iExt, $PCS_FATAL) Then ConsoleWrite('The cleaned path is not a valid file name.' & @CRLF)
    If BitAND($iExt, $PCS_REPLACEDCHAR) Then ConsoleWrite('Replaced one or more invalid characters.' & @CRLF)
    If BitAND($iExt, $PCS_REMOVEDCHAR) Then ConsoleWrite('Removed one or more invalid characters.' & @CRLF)
    If BitAND($iExt, $PCS_TRUNCATED) Then ConsoleWrite('The returned path is truncated.' & @CRLF)
    If BitAND($iExt, $PCS_PATHTOOLONG) Then ConsoleWrite('The function failed because the input path is too long.' & @CRLF)
    ConsoleWrite('Path: "' & $sNameClean & '"' & @CRLF)
    
    ; von AspirinJunkie
    ; https://autoit.de/thread/87822-suche-hilfe-unzul%C3%A4ssige-zeichen-bei-dateinamen-ersetzen-mit-stringregexp-f%C3%BCr-anf/?postID=708339#post708339
    Func _WinAPI_PathCleanupSpec($sFileName)
        Local $aCall = DllCall('Shell32.dll', 'int', 'PathCleanupSpec', 'WSTR', '', 'WSTR', $sFileName)
        If @error Then Return SetError(@error, StringLen($sFileName), Null)
        Return SetError(0, $aCall[0], $aCall[2])
    EndFunc
    Alles anzeigen
  • mit AutoIt HTML Quellcodeseiten (.htm) modifizieren

    • Oscar
    • 10. September 2022 um 11:20

    Ja, ich denke auch, dass die StringFunktion (StringReplace) hierfür ausreichen sollte!

    Einfach die HTML-Seite komplett als String laden, dann mit StringReplace die <td> ersetzen und wieder abspeichern.

  • mit AutoIt HTML Quellcodeseiten (.htm) modifizieren

    • Oscar
    • 10. September 2022 um 09:35
    Zitat von gert_nrw_71

    wie kann man am besten mit AutoIt HTML Quellcodeseiten modifizieren, also die HTML Datei öffnen, etwas suchen, eine Zeile hinzufügen oder ändern und das ganze wieder abspeichern ?

    Kommt darauf an, wo die HTML-Seite gespeichert ist.

    Lokal wie bei jeder anderen Textdatei auch. Auf einem Server: da musst Du mehr Infos liefern.

  • Graph - bei sich verändernden Werten Skalierung anpassen

    • Oscar
    • 2. September 2022 um 18:04
    Zitat von BugFix

    Weniger als 0.1 s ist nicht sinnvoll, da dann zu wenig Werte generiert werden und kein an- u. absteigender Graph, sondern eine kurze wilde Zick- Zacklinie entsteht.

    Ich mach mir mal Gedanken, wie ich das in einen externen Prozess/anderen Kern auslagern kann.

    Stimmt! Ich erinnere mich an mein Programm "FlashTest". Da habe ich das schreiben/lesen auch in einen Slave-Prozess ausgelagert.

    Mit Hilfe der MailSlot-UDF habe ich die Kommunikation zwischen dem Master und dem Slave gelöst. Mit MailSlots können die Prozesse asynchron kommunizieren. Das ist wichtig, damit keiner der beiden Prozesse durch den anderen ausgebremst wird, weil der gerade die Nachricht abholt.

    Aber als FileCopy-UDF wird das wohl sehr heftig werden, wenn es überhaupt irgendwie geht. :/

  • Graph - bei sich verändernden Werten Skalierung anpassen

    • Oscar
    • 2. September 2022 um 17:19
    Zitat von BugFix

    OK, leider ist das Einbinden des Graphen ncht sinnvoll. Dadurch wird die Geschwindigkeit total ausgebremst, von 86 MB/s bis runter auf 12 MB/s.

    Schade.

    Auch, wenn Du die Aktualisierung nur z.B. jede Sekunde vornimmst?

  • Graph - bei sich verändernden Werten Skalierung anpassen

    • Oscar
    • 2. September 2022 um 17:18

    Hier noch eine Version mit Beschriftung:

    AutoIt
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GuiStatusBar.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    
    Global $hGui, $lbPercent, $lbSpeed, $lbFile, $lbRestFiles, $lbRestSize, $lbRestTime, $hStatus, $idProgress
    Global $idGraph, $aData[]
    _GDIPlus_Startup()
    
    _CreateCopyGui()
    GUISetState(@SW_SHOW, $hGui)
    
    Do
        _GraphCtrl_Draw($idGraph, _RandomTransferSpeed(95))
    Until GUIGetMsg() = -3
    _GDIPlus_Shutdown()
    
    Func _GraphCtrl_Draw($idCtrl, $iSpeed)
        Local Static $sData
        Local $aData, $iMax, $iMin, $iHVal, $iHMin
        Local $hCtrl, $tRect, $iW, $iH, $hBitmap, $hGraphic, $hPenLine, $hPenMax, $hPenMin, $hBMP, $hPrevImage
        Local $hFormat, $hBrushMax, $hBrushMin, $hFamily, $hFont, $tLayout
        $hCtrl = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hCtrl) Then Return SetError(1, 0, False)
        $tRect = _WinAPI_GetClientRect($hCtrl)
        $iW = $tRect.Right
        $iH = $tRect.Bottom
        $sData &= $iSpeed & ','
        $aData = StringSplit(StringTrimRight($sData, 1), ',', 2)
        If UBound($aData) > $iW Then
            _ArrayDelete($aData, 0)
            $sData = StringRegExpReplace($sData, '(.+?,)(.+)', '$2')
        EndIf
        $iMax = _ArrayMax($aData, 1)
        $iMin = _ArrayMin($aData, 1)
        $iHVal = ($iH - 20) / $iMax
        $iHMin = Int($iHVal * $iMin)
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetInterpolationMode($hGraphic, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
        _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, 4)
        _GDIPlus_GraphicsClear($hGraphic, 0xFF004000)
        $hPenLine = _GDIPlus_PenCreate(0xFFA0FFA0, 1)
        $hPenMax = _GDIPlus_PenCreate(0xFFA0FFA0, 1)
        $hPenMin = _GDIPlus_PenCreate(0xFF108010, 1)
        For $iX = 0 To UBound($aData) - 1 Step 1
            _GDIPlus_GraphicsDrawLine($hGraphic, $iX, $iH, $iX, $iH - Int($iHVal * $aData[$iX]), $hPenLine)
        Next
        _GDIPlus_GraphicsDrawLine($hGraphic, 0, 20, $iW, 20, $hPenMax)
        _GDIPlus_GraphicsDrawLine($hGraphic, 0, $iH - $iHMin, $iW, $iH - $iHMin, $hPenMin)
        $hFormat = _GDIPlus_StringFormatCreate()
        _GDIPlus_StringFormatSetAlign($hFormat, 2)
        $hBrushMax = _GDIPlus_BrushCreateSolid(0xFFA0FFA0)
        $hBrushMin = _GDIPlus_BrushCreateSolid(0xFF108010)
        $hFamily = _GDIPlus_FontFamilyCreate('Arial')
        $hFont = _GDIPlus_FontCreate($hFamily, 10, 1)
        $tLayout = _GDIPlus_RectFCreate($iW - 100, 4, 98, 16)
        _GDIPlus_GraphicsDrawStringEx($hGraphic, Int($iMax) & ' MB/s', $hFont, $tLayout, $hFormat, $hBrushMax)
        $tLayout = _GDIPlus_RectFCreate($iW - 100, $iH - $iHMin + 4, 98, 16)
        _GDIPlus_GraphicsDrawStringEx($hGraphic, Int($iMin) & ' MB/s', $hFont, $tLayout, $hFormat, $hBrushMin)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage)
        _GDIPlus_FontDispose($hFont)
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
        _GDIPlus_BrushDispose($hBrushMax)
        _GDIPlus_BrushDispose($hBrushMin)
        _GDIPlus_PenDispose($hPenMin)
        _GDIPlus_PenDispose($hPenMax)
        _GDIPlus_PenDispose($hPenLine)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_BitmapDispose($hBitmap)
    EndFunc
    
    Func _RandomTransferSpeed($_iMax=-1)
        Local Static $iMBPerSec = 150
        $iMBPerSec += Random(-1,1,1) * ($iMBPerSec / 100)
        If $iMBPerSec < 1 Then $iMBPerSec = 0
        Return $iMBPerSec
    EndFunc
    
    Func _CreateCopyGui()
        $hGui = GUICreate('Copy with Progress', 400, 260)
        GUISetBkColor(0xF0F8FF)
        GUISetFont(10, 400, Default, 'Courier New')
    
        ; Prozent
        GUICtrlCreateLabel('Fortschritt:', 10, 10, 115, 17)
        $lbPercent = GUICtrlCreateLabel('0', 320, 10, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
        GUICtrlCreateLabel('%', 380, 10, 10, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; Speed
        GUICtrlCreateLabel('Geschwindigkeit:', 10, 32, 125, 17)
        $lbSpeed = GUICtrlCreateLabel('0 MB', 300, 32, 70, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
        GUICtrlCreateLabel('/s', 370, 32, 20, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; akt. Datei
        GUICtrlCreateLabel('Name:', 10, 54, 40, 17)
        $lbFile = GUICtrlCreateLabel('', 55, 54, 335, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Elemente
        GUICtrlCreateLabel('Verbleibende Elemente:', 10, 76, 180, 17)
        $lbRestFiles = GUICtrlCreateLabel('', 330, 76, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Größe
        GUICtrlCreateLabel('Verbleibende Größe:', 10, 98, 180, 17)
        $lbRestSize = GUICtrlCreateLabel('', 280, 98, 110, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Zeit
        GUICtrlCreateLabel('Restdauer ungefähr:', 10, 120, 180, 17)
        $lbRestTime = GUICtrlCreateLabel('', 250, 120, 140, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; Graph hellgrün: 0xF0F0F0, dunkelgrün: 0x05B024
        $idGraph = GUICtrlCreatePic('', 10, 142, 380, 85)
    
        ; Statusbar
        $hStatus = _GUICtrlStatusBar_Create($hGui)
        _GUICtrlStatusBar_SetMinHeight($hStatus, 20)
        $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
        GUICtrlSetColor(-1, 0x008B00) ; grün
        _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress))
    EndFunc
    Alles anzeigen
  • Graph - bei sich verändernden Werten Skalierung anpassen

    • Oscar
    • 2. September 2022 um 15:08

    Ich würde sowas vorschlagen:

    AutoIt
    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <GuiStatusBar.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>
    #include <StaticConstants.au3>
    #include <WinAPIHObj.au3>
    #include <WinAPIInternals.au3>
    #include <WinAPISysInternals.au3>
    
    Global $hGui, $lbPercent, $lbSpeed, $lbFile, $lbRestFiles, $lbRestSize, $lbRestTime, $hStatus, $idProgress
    Global $idGraph, $aData[]
    _GDIPlus_Startup()
    
    _CreateCopyGui()
    GUISetState(@SW_SHOW, $hGui)
    
    Do
        _GraphCtrl_Draw($idGraph, _RandomTransferSpeed(95))
    Until GUIGetMsg() = -3
    _GDIPlus_Shutdown()
    
    Func _GraphCtrl_Draw($idCtrl, $iSpeed)
        Local Static $sData
        Local $aData, $iMax, $iMin, $iHVal, $iHMin
        Local $hCtrl, $tRect, $iW, $iH, $hBitmap, $hGraphic, $hPenLine, $hPenMax, $hPenMin, $hBMP, $hPrevImage
        $hCtrl = GUICtrlGetHandle($idCtrl)
        If Not IsHWnd($hCtrl) Then Return SetError(1, 0, False)
        $tRect = _WinAPI_GetClientRect($hCtrl)
        $iW = $tRect.Right
        $iH = $tRect.Bottom
        $sData &= $iSpeed & ','
        $aData = StringSplit(StringTrimRight($sData, 1), ',', 2)
        If UBound($aData) > $iW Then
            _ArrayDelete($aData, 0)
            $sData = StringRegExpReplace($sData, '(.+?,)(.+)', '$2')
        EndIf
        $iMax = _ArrayMax($aData, 1)
        $iMin = _ArrayMin($aData, 1)
        $iHVal = ($iH - 16) / $iMax
        $iHMin = Int($iHVal * $iMin)
        $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
        $hGraphic = _GDIPlus_ImageGetGraphicsContext($hBitmap)
        _GDIPlus_GraphicsSetInterpolationMode($hGraphic, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
        _GDIPlus_GraphicsClear($hGraphic, 0xFF004000)
        $hPenLine = _GDIPlus_PenCreate(0xFF80F080, 1)
        $hPenMax = _GDIPlus_PenCreate(0xFFA0FFA0, 1)
        $hPenMin = _GDIPlus_PenCreate(0xFF30AA30, 1)
        For $iX = 0 To UBound($aData) - 1 Step 1
            _GDIPlus_GraphicsDrawLine($hGraphic, $iX, $iH, $iX, $iH - Int($iHVal * $aData[$iX]), $hPenLine)
        Next
        _GDIPlus_GraphicsDrawLine($hGraphic, 0, 16, $iW, 16, $hPenMax)
        _GDIPlus_GraphicsDrawLine($hGraphic, 0, $iH - $iHMin, $iW, $iH - $iHMin, $hPenMin)
        $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
        $hPrevImage = _SendMessage($hCtrl, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP)
        If $hPrevImage Then _WinAPI_DeleteObject($hPrevImage)
        _GDIPlus_PenDispose($hPenMin)
        _GDIPlus_PenDispose($hPenMax)
        _GDIPlus_PenDispose($hPenLine)
        _GDIPlus_GraphicsDispose($hGraphic)
        _GDIPlus_BitmapDispose($hBitmap)
    EndFunc
    
    Func _RandomTransferSpeed($_iMax=-1)
        Local Static $iMBPerSec = 50
        $iMBPerSec += Random(-1,1,1) * ($iMBPerSec / 100)
        If $iMBPerSec < 1 Then $iMBPerSec = 0
        Return $iMBPerSec
    EndFunc
    
    
    Func _CreateCopyGui()
        $hGui = GUICreate('Copy with Progress', 400, 260)
        GUISetBkColor(0xF0F8FF)
        GUISetFont(10, 400, Default, 'Courier New')
    
        ; Prozent
        GUICtrlCreateLabel('Fortschritt:', 10, 10, 115, 17)
        $lbPercent = GUICtrlCreateLabel('0', 320, 10, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
        GUICtrlCreateLabel('%', 380, 10, 10, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; Speed
        GUICtrlCreateLabel('Geschwindigkeit:', 10, 32, 125, 17)
        $lbSpeed = GUICtrlCreateLabel('0 MB', 300, 32, 70, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
        GUICtrlCreateLabel('/s', 370, 32, 20, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; akt. Datei
        GUICtrlCreateLabel('Name:', 10, 54, 40, 17)
        $lbFile = GUICtrlCreateLabel('', 55, 54, 335, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Elemente
        GUICtrlCreateLabel('Verbleibende Elemente:', 10, 76, 180, 17)
        $lbRestFiles = GUICtrlCreateLabel('', 330, 76, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Größe
        GUICtrlCreateLabel('Verbleibende Größe:', 10, 98, 180, 17)
        $lbRestSize = GUICtrlCreateLabel('', 280, 98, 110, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; verbleibende Zeit
        GUICtrlCreateLabel('Restdauer ungefähr:', 10, 120, 180, 17)
        $lbRestTime = GUICtrlCreateLabel('', 250, 120, 140, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT))
        GUICtrlSetColor(-1, 0x000080)
    
        ; Graph hellgrün: 0xF0F0F0, dunkelgrün: 0x05B024
        $idGraph = GUICtrlCreatePic('', 10, 142, 380, 85)
    
        ; Statusbar
        $hStatus = _GUICtrlStatusBar_Create($hGui)
        _GUICtrlStatusBar_SetMinHeight($hStatus, 20)
        $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
        GUICtrlSetColor(-1, 0x008B00) ; grün
        _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress))
    EndFunc
    Alles anzeigen

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™