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

  • _DownloadWithProgress

    • Oscar
    • 22. September 2014 um 19:40

    Mit dieser Funktion kann man eine Datei aus dem Internet downloaden.
    Während des Downloads werden zusätzliche Informationen (Dateigröße, Downloadgeschwindigkeit, Downloadzeit und geschätzte Restzeit) angezeigt.
    Eine Progressbar mit Prozentanzeige gibt es natürlich auch noch und man kann den Download per Button abbrechen.

    Die Übergabeparameter könnt ihr den Kommentaren entnehmen.

    Edit 25.09.2014:
    - MultiLanguage-Unterstützung (deutsch und englisch). Wenn da jemand noch andere Sprachen beisteuern möchte...
    - Flackern beseitigt (die Werte werden jetzt in extra Label angezeigt. Die Beschriftung der Werte wird nicht mehr aktualisiert).
    - Die GDI+ Variante von UEZ integriert. Vielen Dank UEZ, die Progressbar sieht klasse aus! :thumbup:
    - Den manchmal auftretenden Fehler bei 100% beseitigt. $iPercent erreicht nicht unbedingt 100% wegen dem Timer.
    - Der Abbrechen-Button ist jetzt größer.

    Edit 19.09.2021:

    - Die Links im Example aktualisiert.

    - Die UDF auf die aktuelle Version von AutoIt angepasst (inzwischen gibt es _GDIPlus_LineBrushCreate).

    - Einige kleinere Anpassungen (Schriftgröße usw.)

    Hinweis: Es wird AutoIt v3.3.12.0 oder höher benötigt!


    DownloadsWithProgress.png

    Dateien

    _DownloadWithProgress.au3 14,2 kB – 445 Downloads Example.au3 2,55 kB – 381 Downloads
  • ListView sortieren lassen vor dem ausführen von "Suche..."

    • Oscar
    • 22. September 2014 um 18:08

    Ich verstehe zwar den Sinn dahinter nicht (was hat das sortieren mit der Suche zu tun?), aber mit "_GUICtrlListView_SimpleSort" kannst Du Dein ListView sortieren lassen.

  • Dateipfad per StringRegExpReplace verändern

    • Oscar
    • 22. September 2014 um 13:32

    Das DSC kommt aber immer im String vor?
    Dann so:

    [autoit]


    $string = 'D:\Schule\DSC\testordner\testdatei.txt'
    $replace = StringRegExpReplace($string, '.+\\(DSC\\.+)', '$1')
    ConsoleWrite($replace & @CR)

    [/autoit]
  • Alles Gute Gun-Food, Kev & Co.

    • Oscar
    • 19. September 2014 um 19:37

    Von mir auch: Alles Gute zum Geburtstag! Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • String will nicht in ein Array

    • Oscar
    • 18. September 2014 um 12:25

    _ArrayDisplay hat auch Anzeige-Probleme mit Null-Bytes CHR(0).
    Musst Du mal mit StringReplace aus dem String entfernen lassen.

  • Button

    • Oscar
    • 18. September 2014 um 11:53

    Im OnEventMode ist Dein Vorhaben leicht umzusetzen:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("GSD",310,300) ; Erstellt die Gui
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    GUISetState(@SW_SHOW) ; Macht die Gui sichtbar

    [/autoit] [autoit][/autoit] [autoit]

    Global $x = 10, $y = 30
    Global $aidButton[1], $iButtonCount = 0

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateButton("New Button", $x, $y, 100)
    GUICtrlSetOnEvent(-1, '_NewButton')
    GUICtrlCreateButton("Exit", 200, $y, 100)
    GUICtrlSetOnEvent(-1, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _NewButton()
    $y = $y + 30
    $aidButton[$iButtonCount] = GUICtrlCreateButton(Chr($iButtonCount + 65), $x, $y, 100)
    GUICtrlSetOnEvent(-1, '_ButtonClick')
    $iButtonCount += 1
    ReDim $aidButton[$iButtonCount + 1]
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _ButtonClick()
    ConsoleWrite('Button = ' & GUICtrlRead(@GUI_CtrlId) & @CR)
    EndFunc

    [/autoit]
  • String will nicht in ein Array

    • Oscar
    • 17. September 2014 um 18:57

    Natürlich muss da noch mehr sein!
    Wo sind die Includes? Was ist mit dem Array "$stat"? Welche POP3-UDF verwendest Du? Wo wird die POP3-Verbindung hergestellt?

  • String will nicht in ein Array

    • Oscar
    • 17. September 2014 um 18:23

    [verschoben nach H&U]

  • _FileWriteFromArray leert Textdatei und meldet @Error=5

    • Oscar
    • 17. September 2014 um 18:12

    Das Problem ist, dass _FileWriteFromArray die "0" bei $iUBound nicht mehr als Default-Wert für das ganze Array interpretiert.
    Du musst also "default" benutzen:

    [autoit]

    _FileWriteFromArray($LHdl_Backup, $La_Namen, 1, default)

    [/autoit]


    oder den Parameter ganz weglassen:

    [autoit]

    _FileWriteFromArray($LHdl_Backup, $La_Namen, 1)

    [/autoit]
  • Herausfinden ob Datei Text beinhaltet

    • Oscar
    • 17. September 2014 um 17:54

    Soo langsam ist das doch auch nicht. Wenn man beispielsweise die ersten 1024 Zeichen jeder Datei einliest und das dann vergleicht.
    Hier mal ein Script zum testen:

    Spoiler anzeigen
    [autoit]


    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $aFiles = _FileListToArray(@ScriptDir, '*', 1)
    If Not @error Then
    $iTimer = TimerInit()
    For $i = 1 To $aFiles[0]
    ConsoleWrite($aFiles[$i] & ' = ' & _FileIsTxt(@ScriptDir & '\' & $aFiles[$i]) & @CR)
    Next
    ConsoleWrite('>Time = ' & TimerDiff($iTimer) & @CR)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _FileIsTxt($sFilename)
    Local $hFile = FileOpen($sFilename, 16)
    If $hFile = -1 Then Return SetError(1, 0, -1)
    Local $sFileRead = BinaryToString(FileRead($hFile, 1024))
    FileClose($hFile)
    Return _StringIsTxt($sFileRead)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _StringIsTxt($sString)
    Return StringRegExp($sString, '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') = 0
    EndFunc

    [/autoit]
  • Herausfinden ob Datei Text beinhaltet

    • Oscar
    • 16. September 2014 um 17:15

    Wenn man davon ausgeht, dass in einer "normalen" Textdatei (ASCII / ANSI) keine Steuerzeichen (ASCII-Codes < 32 mit ein paar Ausnahmen wie TAB, CR, LF) auftauchen, dann könnte man folgende Funktion zum testen verwenden:

    [autoit]


    $sString = 'jð^èMýÿÿÿuàPÿˆ€@ …À…7..'
    ConsoleWrite('Beispiel 1 = ' & _StringIsTxt($sString) & @CR)

    [/autoit][autoit][/autoit][autoit]

    $sString = 'Hallo Welt' & @CRLF & 'Zeile 2'
    ConsoleWrite('Beispiel 2 = ' & _StringIsTxt($sString) & @CR)

    [/autoit][autoit][/autoit][autoit]

    Func _StringIsTxt($sString)
    Return StringRegExp($sString, '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') = 0
    EndFunc

    [/autoit]

    In Binärdateien werden diese hexadezimalen Codes wohl immer vorhanden sein.

  • _SepThd() ersetzt _StringAddThousandsSep()

    • Oscar
    • 15. September 2014 um 12:40

    "kaesereibe" hat den richtigen Tip gegeben. :)
    In der neuen AutoIt-Version gibt es die Funktion "_WinAPI_GetNumberFormat" und zusammen mit "_WinAPI_CreateNumberFormatInfo" kann man jedes beliebige Format erstellen.
    Wenn v3.3.12.0 installiert ist, reicht:

    [autoit]


    #include <WinAPILocale.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $sNumber = -123456789.1234
    ConsoleWrite(_WinAPI_GetNumberFormat(0, $sNumber, _WinAPI_CreateNumberFormatInfo(3, 1, 3, ',', '.', 1)) & @CRLF)

    [/autoit]

    und für alle mit älteren AutoIt-Versionen:

    Spoiler anzeigen
    [autoit]


    Global Const $tagNUMBERFMT = 'uint NumDigits;uint LeadingZero;uint Grouping;ptr DecimalSep;ptr ThousandSep;uint NegativeOrder' ; & ';wchar DecimalSepChars[n];wchar ThousandSepChars[n]'

    [/autoit] [autoit][/autoit] [autoit]

    Global $sNumber = -123456789.1234
    ConsoleWrite(_WinAPI_GetNumberFormat(0, $sNumber, _WinAPI_CreateNumberFormatInfo(3, 1, 3, ',', '.', 1)) & @CRLF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Author.........: Yashied
    ; Modified.......: Jpm
    ; ===============================================================================================================================
    Func _WinAPI_GetNumberFormat($iLCID, $sNumber, $tNUMBERFMT = 0)
    If Not $iLCID Then $iLCID = 0x0400 ; LOCALE_USER_DEFAULT

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRet = DllCall('kernel32.dll', 'int', 'GetNumberFormatW', 'dword', $iLCID, 'dword', 0, 'wstr', $sNumber, _
    'struct*', $tNUMBERFMT, 'wstr', '', 'int', 2048)
    If @error Or Not $aRet[0] Then Return SetError(@error, @extended, '')
    ; If Not $aRet[0] Then Return SetError(1000, 0,'')

    [/autoit] [autoit][/autoit] [autoit]

    Return $aRet[5]
    EndFunc ;==>_WinAPI_GetNumberFormat

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Author.........: Yashied
    ; Modified.......:
    ; ===============================================================================================================================
    Func _WinAPI_CreateNumberFormatInfo($iNumDigits, $iLeadingZero, $iGrouping, $sDecimalSep, $sThousandSep, $iNegativeOrder)
    Local $tFMT = DllStructCreate($tagNUMBERFMT & ';wchar[' & (StringLen($sDecimalSep) + 1) & '];wchar[' & (StringLen($sThousandSep) + 1) & ']')
    DllStructSetData($tFMT, 1, $iNumDigits)
    DllStructSetData($tFMT, 2, $iLeadingZero)
    DllStructSetData($tFMT, 3, $iGrouping)
    DllStructSetData($tFMT, 4, DllStructGetPtr($tFMT, 7))
    DllStructSetData($tFMT, 5, DllStructGetPtr($tFMT, 8))
    DllStructSetData($tFMT, 6, $iNegativeOrder)
    DllStructSetData($tFMT, 7, $sDecimalSep)
    DllStructSetData($tFMT, 8, $sThousandSep)
    Return $tFMT
    EndFunc ;==>_WinAPI_CreateNumberFormatInfo

    [/autoit]
  • _SepThd() ersetzt _StringAddThousandsSep()

    • Oscar
    • 15. September 2014 um 05:30

    Eure Versuche Bytes einzusparen in allen Ehren, aber was ist mit Kommazahlen?
    Der Dezimalpunkt bzw. im deutschen das Komma wird bei euren Versuchen nicht berücksichtigt.
    Ich habe damals die Funktion "_StringAddThousandsSep" archiviert. Ich denke, es ist nach wie vor die beste Variante:

    Spoiler anzeigen
    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _StringAddThousandsSep
    ; Description ...: Returns the original numbered string with the Thousands delimiter inserted.
    ; Syntax.........: _StringAddThousandsSep($sString[, $sThousands = -1[, $sDecimal = -1]])
    ; Parameters ....: $sString - The string to be converted.
    ; $sThousands - Optional: The Thousands delimiter
    ; $sDecimal - Optional: The decimal delimiter
    ; Return values .: Success - The string with Thousands delimiter added.
    ; Author ........: SmOke_N (orignal _StringAddComma
    ; Modified.......: Valik (complete re-write, new function name)
    ; Remarks .......:
    ; Related .......:
    ; Link ..........;
    ; Example .......; Yes
    ; ===============================================================================================================================
    Func _StringAddThousandsSep($sString, $sThousands = -1, $sDecimal = -1)
    Local $sResult = "" ; Force string
    Local $rKey = "HKCU\Control Panel\International"
    If $sDecimal = -1 Then $sDecimal = RegRead($rKey, "sDecimal")
    If $sThousands = -1 Then $sThousands = RegRead($rKey, "sThousand")
    Local $aNumber = StringRegExp($sString, "(\D?\d+)\D?(\d*)", 1) ; This one works for negatives.
    If UBound($aNumber) = 2 Then
    Local $sLeft = $aNumber[0]
    While StringLen($sLeft)
    $sResult = $sThousands & StringRight($sLeft, 3) & $sResult
    $sLeft = StringTrimRight($sLeft, 3)
    WEnd
    $sResult = StringTrimLeft($sResult, StringLen($sThousands)) ; Strip leading thousands separator
    If $aNumber[1] <> "" Then $sResult &= $sDecimal & $aNumber[1]
    EndIf
    Return $sResult
    EndFunc ;==>_StringAddThousandsSep

    [/autoit]
  • Bildschirmumschalter automatisieren

    • Oscar
    • 11. September 2014 um 17:23

    [verschoben nach Programmieranfragen]
    Das Scripte-Forum ist für fertige Scripte der User gedacht.

  • Testautomatisierung / Testautomation mit AutoIt (bspw. C++ GUI-Anwendungen)

    • Oscar
    • 11. September 2014 um 17:21

    Zum Thema kann ich nichts sagen, aber: Warum packst Du den Text immer in Spoiler? Ich finde es ziemlich nervig immer erst die Spoiler öffnen zu müssen, um weiterlesen zu können.
    Quelltext in Spoiler ist ok, aber der eigentliche Text sollte schon komplett lesbar sein. IMHO.

  • Hilfe bei GUI Funktion aufrufen bzw Tastendruck senden

    • Oscar
    • 11. September 2014 um 17:15

    Etwas sollte man generell beachten, und zwar egal ob MsgLoop-Schleife oder OnEventMode: Die Funktion, die bei einem Event (z.B. Button-Klick) aufgerufen wird oder der Case-Zweig bei der MsgLoop-Schleife darf keine Endlos-Schleife enthalten.
    Man sollte die Funktion oder den Case-Zweig so schnell wie möglich wieder verlassen. Wenn man diesen Punkt beachtet, dann wird auch die GUI immer bedienbar bleiben.
    Will man per Button eine länger dauernde Funktion aufrufen, dann am besten nur eine Variable setzen und in der Endlosschleife (OnEventMode) auf diese Variable prüfen.
    Kleines Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    Opt('GUIOnEventMode', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $fStart = False, $iCount = 0

    [/autoit] [autoit][/autoit] [autoit]

    Global $hGui = GUICreate('', 320, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')

    [/autoit] [autoit][/autoit] [autoit]

    Global $idCounter = GUICtrlCreateLabel($iCount, 10, 10, 100, 25)
    GUICtrlSetFont(-1, 14, 400, 0, 'Arial', 5)
    Global $idStart = GUICtrlCreateButton('Start', 10, 50, 100, 25)
    GUICtrlSetOnEvent(-1, '_Start')
    Global $idStop = GUICtrlCreateButton('Stop', 10, 90, 100, 25)
    GUICtrlSetOnEvent(-1, '_Stop')

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(50)
    If $fStart Then
    $iCount += 1
    GUICtrlSetData($idCounter, $iCount)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _End()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Start()
    $fStart = True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Stop()
    $fStart = False
    EndFunc

    [/autoit]
  • Hilfe beim $variable [2] Syntax

    • Oscar
    • 11. September 2014 um 05:23

    Ich sage dazu nur: Zeile 237 und Zeile 238.
    Dass ist genau das, was ich schon vermutet hatte.
    Du solltest wirklich erstmal die Grundlagen in AutoIt erlernen.

  • Hilfe beim $variable [2] Syntax

    • Oscar
    • 10. September 2014 um 20:02

    Wie rufst Du die Funktion aus der UDF auf?
    $PBMarquee ist eine lokale Variable. Die kannst Du nicht vom Hauptprogramm aus benutzen.
    Du musst das Array verwenden, dass Du von der Funktion zurück bekommst.

  • Serverzeit

    • Oscar
    • 10. September 2014 um 19:58

    Wenn es Dir darum geht, mit AutoIt die Zeit von einem NTP-Server zu holen, dann habe ich hier ein Script (nicht von mir, nur archiviert):

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    $time = _TimeSync()
    MsgBox(0, '', 'Rechnerzeit:' & @TAB & _NowCalc() & @CRLF & 'Atomzeit: ' & @TAB & $time)

    [/autoit] [autoit][/autoit] [autoit]

    ;**************************************************************************************************
    ; Ab hier beginnen die Funktionen, zum holen der Zeit aus dem Internet (Quelle: http://www.autoitscript.com/forum/)
    ;**************************************************************************************************
    Func _TimeSync()
    Local $ntpServer = '1.de.pool.ntp.org'
    UDPStartup()
    Dim $socket = UDPOpen(TCPNameToIP($ntpServer), 123)
    If @error <> 0 Then Return SetError(1)
    Local $status = UDPSend($socket, MakePacket('1b0e010000000000000000004c4f434ccb1eea7b866665cb00000000000000000000000000000000cb1eea7b866665cb'))
    ;~ Local $status = UDPSend($socket, MakePacket('1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000'))
    If $status = 0 Then Return SetError(1)
    Local $data = '', $a = TimerInit() ; Timer setzen, damit im Fehlerfall die Schleife abgebrochen wird
    While $data = ''
    $data = UDPRecv($socket, 100)
    Sleep(100)
    If TimerDiff($a) > 1000 Then ExitLoop ; Wenn Timer > 1sek. (Fehler), dann Schleife verlassen
    WEnd
    If $data <> '' Then
    UDPShutdown()
    Local $unsignedHexValue = StringMid($data, 83, 8); Extract time from packet. Disregards the fractional second.
    Local $value = UnsignedHexToDec($unsignedHexValue)
    Local $TZinfo = _Date_Time_GetTimeZoneInformation()
    Local $TZoffset = -(UnsignedToLong($TZinfo[1]) + (UnsignedToLong($TZinfo[4]) * ($TZinfo[0] < 2)) + (UnsignedToLong($TZinfo[7]) * ($TZinfo[0] = 2)))
    Local $UTC = _DateAdd('s', $value, '1900/01/01 00:00:00')
    Return _DateAdd('n', $TZoffset, $UTC)
    EndIf
    SetError(1)
    EndFunc ;==>_TimeSync
    ;**************************************************************************************************
    Func MakePacket($d)
    Local $p = ''
    While $d
    $p &= Chr(Dec(StringLeft($d, 2)))
    $d = StringTrimLeft($d, 2)
    WEnd
    Return $p
    EndFunc ;==>MakePacket
    ;**************************************************************************************************
    Func UnsignedHexToDec($n)
    Local $ones = StringRight($n, 1)
    $n = StringTrimRight($n, 1)
    Return Dec($n) * 16 + Dec($ones)
    EndFunc ;==>UnsignedHexToDec
    ;**************************************************************************************************
    ; http://support.microsoft.com/kb/189323
    ; Gibt Die Zahl mit Vorzeichen zurück.
    ; Bei Fehler (kleiner 0 oder größer MAXINT_4) wird der übergebene Wert zurückgegeben und @error auf 1 gesetzt.
    Func UnsignedToLong($value)
    Local Const $OFFSET_4 = 4294967296
    Local Const $MAXINT_4 = 2147483647
    If $value < 0 Or $value >= $OFFSET_4 Then Return SetError(1, 0, $value) ;' Overflow
    If $value <= $MAXINT_4 Then
    Return $value
    Else
    Return $value - $OFFSET_4
    EndIf
    EndFunc ;==>UnsignedToLong
    ;**************************************************************************************************

    [/autoit]
  • TreevIew mit csv füllen!

    • Oscar
    • 10. September 2014 um 19:43

    Hier mal meine Variante:

    Spoiler anzeigen
    [autoit]


    #include <GuiTreeView.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFile = FileRead(@ScriptDir & '\treeview2.txt') ; <- CSV-Datei Dateiname/-Pfad evtl. anpassen!
    $aItems = StringSplit($sFile, @CRLF, 1)
    If Not IsArray($aItems) Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    $hGui = GUICreate('test', 300, 400)
    $idTreeView = GUICtrlCreateTreeView(10, 10, 280, 380)
    GUISetState()
    For $i = 1 To $aItems[0]
    $sSearch = StringLeft($aItems[$i], StringInStr($aItems[$i], ';') - 1)
    $aItems[$i] = StringRegExpReplace($aItems[$i], ';{2,}', '')
    $aItems[$i] = StringReplace($aItems[$i], ';', ' ')
    $hFoundItem = _GUICtrlTreeView_FindItem($idTreeView, $sSearch, True)
    If $hFoundItem Then
    _GUICtrlTreeView_SetText($idTreeView, $hFoundItem, $aItems[$i])
    Else
    Do
    $hParent = _GUICtrlTreeView_FindItem($idTreeView, $sSearch, True)
    If Not $hParent Then $sSearch = StringRegExpReplace($sSearch, '(.+)\..*', '$1')
    Until $hParent Or StringLen($sSearch) = 1
    _GUICtrlTreeView_AddChild($idTreeView, $hParent, $aItems[$i])
    EndIf
    Next
    Do
    Until GUIGetMsg() = -3

    [/autoit]

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™