Angeregt durch https://autoit.de/index.php?page…8348#post238348 habe ich einmal ein kleines Beispielskript eines einfachen Downloaders erstellt:
Spoiler anzeigen
#cs ----------------------------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]AutoIt Version: 3.3.6.1
Author: AutoBert: http://www.autoit.de/index.php?page…4341#post164341
Skriptbeispiel für den Umgang mit INI-Files und ComboBox
#ce ----------------------------------------------------------------------------
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiComboBox.au3>
#include <StaticConstants.au3>
;#include <Array.au3>
Const $sElect = "bitte einen Download auswählen"
Global $sUrl ;ausgewählte DownloadUrl
Global $sIni = @ScriptDir & "\Download.INI" ;Pfad zur Inidatei
Global $sLocalFolder ;letztes Verzeichnis in das gespeichert wurde
Global $aData[3] ;Download-Infos
Global $iFileSize ;Grösse des DL-Files
Global $tStart ;Download gestartet
Global $nKBPerSec ;KB pro Sekunde
Global $iPercent ;aktuell heruntergeladenen Prozentanteil der Datei
If Not FileExists($sIni) Then
$sData = "AutoIt 3.3.6.1=http://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe" & @LF
$sData &= "AutoIt Beta=http://www.autoitscript.com/autoit3/files/beta/autoit/autoit-v3.3.7.20-beta-setup.exe" & @LF
$sData &= "Scite=http://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe" & @LF
$sData &= "dt. Hilfe=http://translation.autoit.de/autoitinfo/hilfedateien/AutoIt-Hilfe-Deutsch-3.3.6.1-Stand-27_05_11.zip" & @LF
$sData &= "Organize Includes=http://www.autoitscript.com/forum/index.php?app=core&module=attach§ion=attach&attach_app=core&module=attach§ion=attach&attach_id=29947" & @LF
IniWriteSection($sIni, "URLs", $sData)
EndIf
$hGui = GUICreate("mini-Downloader", 300, 105, 302, 218)
$idcboProg = GUICtrlCreateCombo("", 8, 8, 200, 25)
$idbtnAdd = GUICtrlCreateButton("&Hinzufügen", 213, 8, 80)
$idbtnDel = GUICtrlCreateButton("&Löschen", 213, 35, 80)
$idprgInfo = GUICtrlCreateProgress(8, 70, 285, 30)
GUICtrlSetState(-1, $GUI_HIDE)
$idlblInfo = GUICtrlCreateLabel("", 2, 72, 282, 25, $ES_CENTER)
GUICtrlSetFont(-1, 14, 2000)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetState(-1, $GUI_HIDE)
$idbtnDL = GUICtrlCreateButton("&Downloaden", 8, 35, 200)
GUICtrlSetState($idbtnDL, $GUI_DISABLE)
read_INI()
GUISetState(@SW_SHOW)
HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.16") ;sonst streiken manche Freehoster wenn der AutoItUseragent gesetzt ist
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
IniWrite($sIni, "Path", "Local", $sLocalFolder)
Exit
Case $idbtnAdd
$write1 = InputBox("Downloadadresse", "Bitte eine gültige Download-Adresse eingeben")
If $write1 <> "" Then
$write2 = InputBox("Download verwalten unter", "Bitte Kurzbegriff eingeben")
If $write2 <> "" Then IniWrite($sIni, "URLs", $write2, $write1)
GUICtrlSetData($idcboProg, $write2, $write2)
EndIf
get_Selection()
Case $idbtnDel
$sDel = GUICtrlRead($idcboProg)
IniDelete($sIni, "URLs", $sDel)
GUICtrlSetData($idcboProg, "")
read_INI()
Case $idcboProg
get_Selection()
Case $idbtnDL
;get_Selection()
$bCanceld = False
GUICtrlSetData($idbtnDL, "Download &abbrechen")
$aDatei = StringSplit($sUrl, "/")
$sDatei = $aDatei[$aDatei[0]]
$sLocal = FileSaveDialog($sDatei & "Speichern unter", $sLocalFolder, "Alle (*.*)", 18, $sDatei, $hGui)
If Not @error Then
GUICtrlSetState($idprgInfo, $GUI_SHOW)
GUICtrlSetState($idlblInfo, $GUI_SHOW)
GUICtrlSetData($idlblInfo, "Download startet")
$aTmp = StringSplit($sLocal, "\")
$sLocalFolder = $aTmp[$aTmp[1]]
$iFileSize = InetGetSize($sUrl)
$hDL = InetGet($sUrl, $sLocal, 1, 1)
$tStart = TimerInit()
$aData[0] = 0
Do
$bCanceld = _MySleep(250)
If $bCanceld Then ExitLoop
$aData = InetGetInfo($hDL, -1)
If $aData[0] > 0 Then
$tDiff = TimerDiff($tStart)
$nKBPerSec = Round($aData[0] / $tDiff * 1000 / 1024, 2)
$iPercent = Round($aData[0] / $iFileSize * 100, 2)
If GUICtrlRead($idlblInfo) <> $iPercent Then
GUICtrlSetData($idprgInfo, $iPercent)
GUICtrlSetData($idlblInfo, $iPercent & " % " & $nKBPerSec & " KB/sec")
WinSetTitle($hGui, "", "DL: " & $sDatei & " " & $iPercent & "%")
EndIf
EndIf
Until $aData[2]
InetClose($hDL)
;_ArrayDisplay($aData)
If $aData[0] < $aData[1] Then $aData[3] = False ;dummerweise werden nur DL-Fehler auf meiner Seite erkannt es kommt aber vo das der DL aus anderen Gründen nicht erfolgreich war
If $aData[0] < $iFileSize Then $aData[3] = False ;dummerweise werden nur DL-Fehler auf meiner Seite erkannt es kommt aber vo das der DL aus anderen Gründen nicht erfolgreich war
If Not $aData[3] Then
If $bCanceld Then
$sMsg = "Download wurde durch Benutzer abgebrochen"
Else
$sMsg = "Download hat abgebrochen," & @CRLF & "überprüfen sie Ihre Internetverbindung." & @CRLF & @CRLF & "Probieren Sie danach noch einmal!"
EndIf
MsgBox(48, "Fehler:", $sMsg)
FileDelete($sLocal)
Else
GUICtrlSetState($idbtnDL, $GUI_DISABLE)
GUICtrlSetData($idcboProg,$sElect,$sElect)
MsgBox(64, $sLocal, "erfolgreich heruntergeladen")
EndIf
Else
MsgBox(48, "Fehler:", "keinen Namen zum Speichern ausgeählt")
EndIf
GUICtrlSetData($idprgInfo, 0)
GUICtrlSetData($idlblInfo, 0)
GUICtrlSetState($idlblInfo, $GUI_HIDE)
GUICtrlSetState($idprgInfo, $GUI_HIDE)
GUICtrlSetData($idbtnDL, "&Downloaden")
WinSetTitle($hGui, "", "mini-Downloader")
EndSwitch
WEnd
Func _MySleep($iMSec)
Local $nMsg, $dt = TimerInit()
Do
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $idbtnDL
Return 1; DL Abbrechen wurde gedrückt
EndSwitch
Sleep(10)
Until TimerDiff($dt) > $iMSec
EndFunc ;==>_MySleep
Func read_INI()
$list1 = IniReadSection($sIni, "URLs")
;ConsoleWrite($list1 & @CRLF)
If IsArray($list1) Then
For $i = 1 To $list1[0][0]
GUICtrlSetData($idcboProg, $list1[$i][0])
Next
EndIf
_GUICtrlComboBox_InsertString($idcboProg, $sElect, 0)
_GUICtrlComboBox_SetCurSel($idcboProg, 0)
$sLocalFolder = IniRead($sIni, "Path", "Local", @ScriptDir)
EndFunc ;==>read_INI
Func get_Selection()
If GUICtrlRead($idcboProg) = $sElect Then
GUICtrlSetState($idbtnDL, $GUI_DISABLE)
GUICtrlSetData($idlblInfo, "")
Else
GUICtrlSetState($idbtnDL, $GUI_ENABLE)
$Prog = GUICtrlRead($idcboProg)
;ConsoleWrite("ausgewählt: " & $Prog & @CRLF)
$sUrl = IniRead($sIni, "URLs", $Prog, "")
EndIf
EndFunc ;==>get_Selection
Die vorbelegten Dateien in der INI sollten sich alle Anfänger herunterladen. Ich weis dass man dies mit einer Listview viel schöner lösen kann aber wie gesagt aufgrund des o.g. Themas habe ich diese Beispiel auf Basis einer Combobox geschrieben. Wenn man anstatt einer Combo ein List erstellt funktioniert das Skript genauso. Profis wundern sich vielleicht über die Zeilen 105 u. 106, dies ist ein Workaround da InetGetInfo nicht immer den korrekten Status ob der DL erfolgreich war zurückgibt.
Hier noch ein ScreenShot: autoit.de/wcf/attachment/14493/
Falls jemanden der Skriptaufbau bekannt vorkommt, richtig es ist aus meinem Mini-Urlmanager abgeleitet.
Edits: Link dieses Themas in Skript eingefügt. AutoIt-Tag korrigiert, Dem Kind einen anderen Namen gegeben, kleine Schönheitskorrekturen im Skript (Variablennamen, eine überflüssige Zeile entfernt, nach erfolgreichem DL wird DL-Button gesperrt und die "bitte wählen"-Aufforderung erscheint in der ComboBox)
mfg autoBert