Beiträge von Kanashius
-
-
-
Edit:doppelpost
-
Müsste normal mit Fehlermeldung abschmieren (Also beenden), da du keine Parameter bei __GUI_EVENT_CLOSE2__() hast.
Hilfe zu GUIRegisterMsg:Spoiler anzeigen
Remarks
!!! To make the user function workable you have to define it
with maximum 4 function parameters otherwise the function won't
be called !!!
i.e:
Func MyUserFunction($hWndGUI, $MsgID, $WParam,
$LParam)
...
EndFunc
Immer die Remarks lesen, ist ziemlich wichtig. Am besten auch die Beispiele kurz ansehen.So funktioniert es:
AutoIt
Alles anzeigen;An den Anfang des Scriptes, sowas macht man immer am Anfang, da sie Global wirken, sobald sie ;definiert wurden GUIRegisterMsg ($WM_NCLBUTTONDOWN, "WM_NCLBUTTONDOWN_FUNC") ;......... ;Function Func WM_NCLBUTTONDOWN_FUNC($hWnd, $iMsg, $wParam, $lParam) ;Gucken, obs die richtige Gui ist, die das Event auslöst if $hWnd=$Gui then ;Messagecode auslesen $nID = BitAnd($wParam, 0x0000FFFF) ;Wenns 20 ist (heißt, dass schließen gedrückt wurde) If $nID = 20 Then ;Tu was du tun willst (Funktion aufrufen) ConsoleWrite("CLOSE") ;0 zurückgeben, damit das Schließen-Event intern nicht weiter verabreitet ;wird Return 0 EndIf endif ;Sonst das Event durchlassen Return $GUI_RUNDEFMSG EndFunc
(Weg für mich zur Lösung:
Google -> "register msg close gui", 3ter link
Dort stand dann das Event ;)) -
War auch keine komplettlösung, sondern nen Denkanstoß
_fileReplace("xxx.txt","12|13","*12|13*")
würde z.B. funktionieren
Wenn du den String nur 1x schreiben willst geht auch:
_fileReplace("xxx.txt","12|13","*$1*")
und in der Func dann noch nen $replace=StringRegExpReplace($replace,"("&$search&")",$replace)
Da geht alles Mögliche, jenachdem, wie genau du das haben willst. Kannst ja mal nen bisschen rumprobieren -
Der Fenstertitel heißt dann Whats App Web - Google Chrome oder so
Wenn du die URL haben willst musst du mal mit AutoItInfo gucken (ist im installationsordner). Evtl. kann man die Controls auslesen. -
Vermute mal du bist in der Endlosschleife: While Sleep(30)
Dadurch werden die OnEvents nicht ausgeführt.
Das einzige, was meines Wissens nach, trotz Dauer-While ausgeführt wird ist mit GuiRegisterMsg(), sowie hooks,... alles, was ans System zurückgegeben wird. Deshalb muss sowas ja auch immer schnell durchlaufen. Wenn das warten würde wäre es sehr schlecht -
Sieh dir dies mal an:
AutoIt_fileReplace("xxx.txt") Func _fileReplace($file,$search="[0-9][0-9]|[0-9][0-9]",$replace="\*[0-9][0-9]|\*[0-9][0-9]") $data=FileRead($file) $data=StringRegExpReplace($data,$search,$replace) FileWrite($file,$data) EndFunc
Um die Dateien im Ordner zu finden such mal nach FileFindFirstFile und FileFindNextFile. In der Hilfe ist dort ein Beispiel. Sonst hilfe auch _FileListToArray
(Die PM ist wohl in den weiten des Internets verschollen... oder ich hab vergessen auf senden zu klicken :D)
-
Bei diesem Script sollte passieren, was du willst. Es ist recht flexibel, wenn du die Gui ändern willst und kann auch sehr schnell um Dateien erweitert werden.
Erklärungen stehen als Kommentare dabei.AutoIt
Alles anzeigen#include <File.au3> #include <GUIConstantsEx.au3> ;OnEventMode einschalten. GuiGetMsg funktioniert dann nicht mehr! Opt("GuiOnEventMode",1) ;FensterBreite, Höhe der Labels und des Buttons, Platz zwischen den Labels/Buttons global $GuiWidth=400, $LineHeight=25, $LineSpace=5 ;2 Dimensionales Array. In der 1ten Spalte wird der Dateiname gespeichert, in der 2ten Spalte die Label Control-ID, um später den Text dort zu setzen. ; (das " _" am Ende der Zeile ist nur, damit man es schöner einrücken kann, da normal alles in eine Zeile muss. ; Aufbau (visuell als Tabelle vorstellen): ; |0 |1 ; +--------------+----------- ; 0|Aktivität1.txt|0 ; 1|Aktivität2.txt|0 ; 2|Art1.txt |0 ; 3|Art2.txt |0 ; 4|Ort.txt |0 ; 5|Zusatz.txt |0 ;Die 0en in der 2 Spalte (Eitrag 1, da bei Arrays bei 0 angefangen wird) werden später durch die Label-Control-IDs ersetzt. global $arFiles= _ [ _ ["Aktivität1.txt",0], _ ["Aktivität2.txt",0], _ ["Art1.txt",0], _ ["Art2.txt",0], _ ["Ort.txt",0], _ ["Zusatz.txt",0] _ ] ;Fenster mit der GuiWidth erzeugen. Die Höhe wird berechnet aus der Arraygröße (+1 wegen dem Button). Jedes Element braucht LineHeight+LineSpace als Platz $Form1 = GUICreate("Was, Wie, Wo?", $GuiWidth,(UBound($arFiles)+1)*($LineHeight+$LineSpace)) GUISetFont(12, 400, 0, "MS Sans Serif") ;Schleife, um für jeden Array-Eintrag ein Label zu erstellen for $i=0 to UBound($arFiles)-1 step 1 ;Label erstellen. left wird mit 5 gesetzt, top wird aus der Nummer des aktuellen Elementes berechnet. $arFiles[$i][1]=GUICtrlCreateLabel(" - ",5,$LineSpace+$i*($LineHeight+$LineSpace),$GuiWidth-10,$LineHeight) next ;Button wird mit dem Space vom unteren Rand der Gui erzeugt $ButtonGo = GUICtrlCreateButton("Los",5,((UBound($arFiles)+1)*($LineHeight+$LineSpace))-$LineHeight-$LineSpace,$GuiWidth-10, $LineHeight) ;Event auf den Button setzen, damit die genannte Funktion beim Klick ausgeführt wird GUICtrlSetOnEvent($ButtonGo, "Los") ;Event fürs Schließen auf die Gui setzen GUISetOnEvent($GUI_EVENT_CLOSE, "_close") ;Fenster anzeigen GUISetState(@SW_SHOW) ;Schleife, damit das Programm läuft. Sleep(10) verringert dabei die Programmaktivität, sodass nicht unnötig viele Ressourcen verbraucht werden While Sleep(10) WEnd Func Los() ;Wieder das Array mit den Dateinamen durchlaufen for $i=0 to UBound($arFiles)-1 step 1 ;Zufallszahl zwischen 1 und der maximalen Anzahl an Zeilen in der Datei $randomLine=Random(1,_FileCountLines($arFiles[$i][0]),1) ;Wenn die Datei z.B. nicht existiert kommt hier ein Fehler, deshalb wird das dann angezeigt, sonst wird die zufällige Zeile angezeigt. if @error then GUICtrlSetData($arFiles[$i][1],"Error! File: "&'"'&$arFiles[$i][0]&'"'&" not found!") else ;Zeile auslesen $sLine=FileReadLine($arFiles[$i][0],$randomLine) ;Zeile in das Control packen GUICtrlSetData($arFiles[$i][1],$sLine) endif next EndFunc Func _close() ;Schließen exit EndFunc
MfG Kanashius
-
-
Da das eine .jsp und kein html ist:
Lass dir mal das hier als Datei speichern oder anzeigen: $html=BinaryToString(InetRead("XXX.com/itim/console/jsp/logon/Login.jsp",4),4)
Wenn dort nirgendwo ein ...<html>...<body>...</body>...</html>... steht, probier mal nen _IEDocReadHTML.
Ohne Body wirst du dich nämlich schwertun, den Body auszulesen, und das könnte auch der Grund sein, warum er bei dem Objekt $oObject.document.body.innerHTML nicht auf das document zugreifen kann.
Wenn du also nur den Text der Seite brauchst guck dir mal das $html oben an. Ansonsten eventuell alles Firmenrelevante unkenntlich machen und dann hier hochladen.MfG Kanashius.
-
Müsste gehen, probiers aus. Falls nicht, das GuiCtrlCreateListviewItem durch den Befehl aus der UDF ersetzen. Rest sind ja UDF-Befehle.
-
$Button1 ist <>0, also ist die If-Bedingung immer erfüllt, weshalb er sofort ExitLoop macht. Wenn du in Zukunft vor so einem Problem bist:
Schreib Consolewrite rein, damit du herausfindest, wo das Problem ist.AutoIt
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Compression=4 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Tool", 452, 104, 192, 124) $Button1 = GUICtrlCreateButton("Start", 20, 8, 127, 41) $Button2 = GUICtrlCreateButton("Stop", 160, 8, 127, 41) $Button3 = GUICtrlCreateButton("Beenden", 300, 8, 127, 41) $Label1 = GUICtrlCreateLabel("by Siverbot", 80, 64, 304, 28) GUICtrlSetFont(-1, 14, 400, 0, "MS Sans Serif") GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 adlibregister("_do",2000) Case $Button2 adlibunregister("_do") While 2 $nMsg2=GUIGetMsg() If $nMsg2=$Button1 Then ExitLoop If $nMsg2=$Button3 Then ExitLoop WEnd Case $Button3 Exit 0 EndSwitch WEnd Func _do() Send("{LWIN}") EndFunc
Hab mal 2 Varianten hingeschrieben.
-
Magst du die SysTray.au3 nochmal anhängen? Die gehört nicht zum Standart, und damit wir die gleiche Version nutzen,...
Achja, au3 includes, die nicht zum Standart von Autoit gehören, sondern in einem ordner mit dem Script sind werden mit #include "...au3" includet. Funktioniert beides, ist aber konvention -
So, jetzt hatte ich etwas Zeit.
Die Funktion(-en) stammen aus meinem Projekt Buchsammlung, dass ich mal geschrieben hab. Hab mal nen Beispielscript daraus gebastelt.
Nicht wundern: Man übergibt ein 1D-Array und die Spaltenzahl (hab bei _Sqlite keine Table, sondern ein 1D Array bekommen). Die ersten Einträge sind die Listview Spalten.
Sortiert wird nach der 1. Spalte, wenn man es nutzt. Löschen dauert länger als einfügenScript:
AutoIt
Alles anzeigen#include <GuiListView.au3> #include <GUIConstantsEx.au3> global $width=800,$height=600 $MainGui=GuiCreate("",$width,$height) $MainGui_MainListView=GUICtrlCreateListView("",5,5,$width-10,$height-10) $WaitLabel_Progress=GUICtrlCreateProgress($width/2-105,$height/2+25,200,20) $WaitLabel=GUICtrlCreateLabel("",$width/2-105,$height/2-25,200,20) GUISetState(@SW_SHOW) _FillTimed() while 1 $msg=GUIGetMsg() if $msg=-3 then exit WEnd Func _FillTimed() ConsoleWrite("Creating Array"&@crlf) local $cols=4,$DataItems[1000000*$cols] for $i=0 to UBound($DataItems)/4-1 step 1 for $j=0 to $cols-1 step 1 $DataItems[$i*$cols+$j]=$i&":"&$j next next ConsoleWrite("Start Filling"&@crlf) $count=15 for $i=0 to $count-1 step 1 $timer=TimerInit() fillListView($DataItems,$cols,false) ConsoleWrite("ItemCount: "&StringFormat("%09i",UBound($DataItems)/$cols)&" with "&StringFormat("%04i",$cols)&" Cols Fill Time: "&Round(TimerDiff($timer)/1000,4)&@crlf) ReDim $DataItems[UBound($DataItems)/$cols/2*$cols] next EndFunc Func fillListView(ByRef $array,$iClumn,$sort = true) GUICtrlSetState($MainGui_MainListView,$GUI_HIDE) _GUICtrlListView_BeginUpdate($MainGui_MainListView) GUICtrlSetState($WaitLabel_Progress, $GUI_SHOW) GUICtrlSetData($WaitLabel,"Please Wait while Listview is cleared") $timer=TimerInit() ;TIMER $countItem=_GUICtrlListView_GetItemCount($MainGui_MainListView) ;TIMER $countCols=_GUICtrlListView_GetColumnCount($MainGui_MainListView) ;TIMER _GUICtrlListView_DeleteAllItems_self($MainGui_MainListView) ConsoleWrite("ItemCount: "&StringFormat("%09i",$countItem)&" with "&StringFormat("%04i",$countCols)&" Cols Clear Time: "&Round(TimerDiff($timer)/1000,4)&@crlf&@crlf) ;TIMER GUICtrlSetData($WaitLabel,"Please Wait while Listview is filled") for $i = 0 to _GUICtrlListView_GetColumnCount($MainGui_MainListView) + 1 step 1 _GUICtrlListView_DeleteColumn($MainGui_MainListView, 0) next for $i = 0 to $iClumn-1 step 1 _GUICtrlListView_AddColumn($MainGui_MainListView, $array[$i]) _GUICtrlListView_SetColumnWidth($MainGui_MainListView, $i, 150) next $1perc = (UBound($array) - $iClumn) / 100 $aktPerc = 0 for $i = $iClumn to UBound($array) - $iClumn step $iClumn $string = "" for $x = 0 to $iClumn - 2 step 1 $string &= $array[$i + $x] & "|" next $string &= $array[$i + $iClumn - 1] GUICtrlCreateListViewItem($string, $MainGui_MainListView) if int($i / $1perc) <> $aktPerc then $aktPerc = int($i / $1perc) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif next if $sort then _GUICtrlListView_SimpleSort_self($MainGui_MainListView, false, 1) endif _GUICtrlListView_EndUpdate($MainGui_MainListView) GUICtrlSetState($WaitLabel, $GUI_HIDE) GUICtrlSetState($WaitLabel_Progress, $GUI_HIDE) GUICtrlSetState($MainGui_MainListView, $GUI_SHOW) GUICtrlSetState($MainGui_MainListView, $GUI_ENABLE) EndFunc ;==>fillListView Func _GUICtrlListView_DeleteAllItems_self($hWnd) GUICtrlSetData($WaitLabel_Progress, 0) GUICtrlSetData($WaitLabel,"Bitte warten!"&@crlf&"Liste wird geleert!") ; Check if deletion necessary If _GUICtrlListView_GetItemCount($hWnd) = 0 Then Return True Local Const $LV_WM_SETREDRAW = 0x000B ; Determine ListView type Local $cCID = 0 If IsHWnd($hWnd) Then ; Check if the ListView has a ControlID $cCID = _WinAPI_GetDlgCtrlID($hWnd) Else $cCID = $hWnd ; Get ListView handle $hWnd = GUICtrlGetHandle($hWnd) EndIf ; If native ListView - could be either type of item If $cCID Then ; Disable the redrawing message GUICtrlSendMsg($cCID, $LV_WM_SETREDRAW, False, 0) ; Try deleting as native items Local $iParam = 0 Local $var = _GUICtrlListView_GetItemCount($hWnd) / 100 ;PROGRESSBAR Local $aktPerc = 0 ;PROGRESSBAR For $iIndex = _GUICtrlListView_GetItemCount($hWnd) - 1 To 0 Step -1 $iParam = _GUICtrlListView_GetItemParam($hWnd, $iIndex) ; Check if LV item If GUICtrlGetState($iParam) > 0 And GUICtrlGetHandle($iParam) = 0 Then GUICtrlDelete($iParam) EndIf if 100 - int($iIndex / $var) <> $aktPerc then ;PROGRESSBAR $aktPerc = 100 - int($iIndex / $var) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next ; Enable the redrawing message GUICtrlSendMsg($cCID, $LV_WM_SETREDRAW, True, 0) ; Return if no items left GUICtrlSetData($WaitLabel_Progress, 0) If _GUICtrlListView_GetItemCount($hWnd) = 0 Then Return True EndIf GUICtrlSetData($WaitLabel_Progress, 0) ; Has to be UDF Listview and/or UDF items Return _SendMessage($hWnd, $LVM_DELETEALLITEMS) <> 0 EndFunc ;==>_GUICtrlListView_DeleteAllItems_self Func _GUICtrlListView_SimpleSort_self($hWnd, $vSortSense, $iCol, $fToggle = True) GUICtrlSetData($WaitLabel_Progress, 0) GUICtrlSetData($WaitLabel,"Bitte warten!"&@crlf&"Liste wird sortiert!") sleep(100) Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd) If $iItemCount Then Local $iDescending = 0 If UBound($vSortSense) Then $iDescending = $vSortSense[$iCol] Else $iDescending = $vSortSense EndIf Local $vSeparatorChar = Opt('GUIDataSeparatorChar') Local $iColumnCount = _GUICtrlListView_GetColumnCount($hWnd) ;Local Enum $iIndexValue = $iColumnCount, $iItemParam ; Additional columns for the index value and ItemParam Local $aListViewItems[$iItemCount][$iColumnCount + 2] ;Local $aSelectedItems = StringSplit(_GUICtrlListView_GetSelectedIndices($hWnd), $vSeparatorChar) ;Local $aCheckedItems = __GUICtrlListView_GetCheckedIndices($hWnd) Local $sItemText, $iFocused = -1 Local $var = $iItemCount / 100 ;PROGRESSBAR Local $aktPerc = 0 ;PROGRESSBAR For $i = 0 To $iItemCount - 1 ; Rows ;If $iFocused = -1 Then ; If _GUICtrlListView_GetItemFocused($hWnd, $i) Then $iFocused = $i ;EndIf ;_GUICtrlListView_SetItemSelected($hWnd, $i, False) ;_GUICtrlListView_SetItemChecked($hWnd, $i, False) For $j = 0 To $iColumnCount - 1 ; Columns $sItemText = StringStripWS(_GUICtrlListView_GetItemText($hWnd, $i, $j), 2) If(StringIsFloat($sItemText) Or StringIsInt($sItemText)) Then $aListViewItems[$i][$j] = Number($sItemText) Else $aListViewItems[$i][$j] = $sItemText EndIf Next ;$aListViewItems[$i][$iIndexValue] = $i ; Index value ;$aListViewItems[$i][$iItemParam] = _GUICtrlListView_GetItemParam($hWnd, $i) ; ItemParam if int(($i / $var) / 2) <> $aktPerc then ;PROGRESSBAR $aktPerc = int(($i / $var) / 2) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next ; Sort the ListView array _ArraySort($aListViewItems, $iDescending, 0, 0, $iCol) For $i = 0 To $iItemCount - 1 ; Rows For $j = 0 To $iColumnCount - 1 ; Columns _GUICtrlListView_SetItemText($hWnd, $i, $aListViewItems[$i][$j], $j) Next ;_GUICtrlListView_SetItemParam($hWnd, $i, $aListViewItems[$i][$iItemParam]) ; ItemParam #cs For $j = 1 To $aSelectedItems[0] If $aListViewItems[$i][$iIndexValue] = $aSelectedItems[$j] Then If $aListViewItems[$i][$iIndexValue] = $iFocused Then _GUICtrlListView_SetItemSelected($hWnd, $i, True, True) Else _GUICtrlListView_SetItemSelected($hWnd, $i, True) EndIf ExitLoop EndIf Next For $j = 1 To $aCheckedItems[0] If $aListViewItems[$i][$iIndexValue] = $aCheckedItems[$j] Then _GUICtrlListView_SetItemChecked($hWnd, $i, True) ExitLoop EndIf Next #ce if int(50 + (($i / $var) / 2)) <> $aktPerc then ;PROGRESSBAR $aktPerc = int(50 + ($i / $var) / 2) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next If $fToggle Then ; Automatic sort sense toggle If UBound($vSortSense) Then $vSortSense[$iCol] = Not $iDescending Else $vSortSense = Not $iDescending EndIf EndIf EndIf EndFunc ;==>_GUICtrlListView_SimpleSort_self
Messungsergebnisse:
Code
Alles anzeigenItemCount: 000000000 with 0000 Cols Clear Time: 0.0005 ItemCount: 001000000 with 0004 Cols Fill Time: 6.2742 ItemCount: 000065530 with 0004 Cols Clear Time: 12.6675 ItemCount: 000500000 with 0004 Cols Fill Time: 16.2384 ItemCount: 000065530 with 0004 Cols Clear Time: 12.7077 ItemCount: 000250000 with 0004 Cols Fill Time: 14.95 ItemCount: 000065530 with 0004 Cols Clear Time: 12.6825 ItemCount: 000125000 with 0004 Cols Fill Time: 14.3645 ItemCount: 000065530 with 0004 Cols Clear Time: 13.5617 ItemCount: 000062500 with 0004 Cols Fill Time: 14.8052 ItemCount: 000062499 with 0004 Cols Clear Time: 12.6485 ItemCount: 000031250 with 0004 Cols Fill Time: 13.2853 ItemCount: 000031249 with 0004 Cols Clear Time: 4.5944 ItemCount: 000015625 with 0004 Cols Fill Time: 4.9158 ItemCount: 000015624 with 0004 Cols Clear Time: 1.8994 ItemCount: 000007812 with 0004 Cols Fill Time: 2.0671 ItemCount: 000007811 with 0004 Cols Clear Time: 0.8013 ItemCount: 000003906 with 0004 Cols Fill Time: 0.8891 ItemCount: 000003905 with 0004 Cols Clear Time: 0.3773 ItemCount: 000001953 with 0004 Cols Fill Time: 0.4274 ItemCount: 000001952 with 0004 Cols Clear Time: 0.1821 ItemCount: 000000976 with 0004 Cols Fill Time: 0.2148 ItemCount: 000000975 with 0004 Cols Clear Time: 0.0917 ItemCount: 000000488 with 0004 Cols Fill Time: 0.1151 ItemCount: 000000487 with 0004 Cols Clear Time: 0.0465 ItemCount: 000000244 with 0004 Cols Fill Time: 0.0646 ItemCount: 000000243 with 0004 Cols Clear Time: 0.0258 ItemCount: 000000122 with 0004 Cols Fill Time: 0.0419 ItemCount: 000000121 with 0004 Cols Clear Time: 0.0115 ItemCount: 000000061 with 0004 Cols Fill Time: 0.026
Ich weiß nur nicht, warum der beim löschen maximal bis 65540 geht...
MfG Kanashius
-
Hiermit:
AutoIt
Alles anzeigenFunc fillListView($array, $sort = true, $lastIsPath = false) _GUICtrlListView_BeginUpdate($MainGui_MainListView) GUICtrlSetState($WaitLabel_Progress, $GUI_SHOW) _GUICtrlListView_DeleteAllItems_self($MainGui_MainListView) GUICtrlSetData($WaitLabel, _getLanguageText("pleaseWait") & @crlf & _getLanguageText("listFilling")) for $i = 0 to _GUICtrlListView_GetColumnCount($MainGui_MainListView) + 1 step 1 _GUICtrlListView_DeleteColumn($MainGui_MainListView, 0) next if $lastIsPath then for $i = 1 to $iClumn step 1 _GUICtrlListView_AddColumn($MainGui_MainListView, $array[$i]) _GUICtrlListView_SetColumnWidth($MainGui_MainListView, $i - 1, 200) next _GUICtrlListView_SetColumnWidth($MainGui_MainListView, 4, 100) _GUICtrlListView_SetColumnWidth($MainGui_MainListView, 1, 300) _GUICtrlListView_SetColumnWidth($MainGui_MainListView, $iClumn - 1, 615) _GUICtrlListView_HideColumn($MainGui_MainListView, 0) $1perc = (UBound($array) - $iClumn) / 100 $aktPerc = 0 for $i = $iClumn + 1 to UBound($array) - 1 step $iClumn $string = "" for $x = 0 to $iClumn - 2 step 1 $string &= $array[$i + $x] & "|" next ;$rr=StringSplit($array[$i+$iClumn-1],"\") $string &= $array[$i + $iClumn - 1];$rr[$rr[0]] GUICtrlCreateListViewItem($string, $MainGui_MainListView) if mod(int($i / $iClumn), 2) = 0 then GUICtrlSetBkColor(-1, 0xDDDDDD) endif if int($i / $1perc) <> $aktPerc then $aktPerc = int($i / $1perc) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif next else for $i = 1 to $iClumn step 1 _GUICtrlListView_AddColumn($MainGui_MainListView, $array[$i]) _GUICtrlListView_SetColumnWidth($MainGui_MainListView, $i - 1, 200) next _GUICtrlListView_HideColumn($MainGui_MainListView, 0) $1perc = (UBound($array) - $iClumn) / 100 $aktPerc = 0 for $i = $iClumn + 1 to UBound($array) - 1 step $iClumn $string = "" for $x = 0 to $iClumn - 2 step 1 $string &= $array[$i + $x] & "|" next $string &= $array[$i + $iClumn - 1] GUICtrlCreateListViewItem($string, $MainGui_MainListView) if int($i / $1perc) <> $aktPerc then $aktPerc = int($i / $1perc) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif next endif if $sort then _GUICtrlListView_SimpleSort_self($MainGui_MainListView, false, 1) endif _GUICtrlListView_EndUpdate($MainGui_MainListView) GUICtrlSetState($WaitLabel, $GUI_HIDE) GUICtrlSetState($WaitLabel_Progress, $GUI_HIDE) GUICtrlSetState($MainGui_ListBox1, $GUI_ENABLE) GUICtrlSetState($MainGui_MainListView, $GUI_SHOW) GUICtrlSetState($MainGui_MainListView, $GUI_ENABLE) GUICtrlSetState($MainGui_Button1, $GUI_ENABLE) GUICtrlSetData($MainGui_MainListView_CountLabel, _getLanguageText("entrysInList") & _GUICtrlListView_GetItemCount($MainGui_MainListView)) EndFunc ;==>fillListView Func _GUICtrlListView_DeleteAllItems_self($hWnd) GUICtrlSetData($WaitLabel_Progress, 0) GUICtrlSetData($WaitLabel, _getLanguageText("pleaseWait") & @crlf & _getLanguageText("listClear")) ; Check if deletion necessary If _GUICtrlListView_GetItemCount($hWnd) = 0 Then Return True Local Const $LV_WM_SETREDRAW = 0x000B ; Determine ListView type Local $cCID = 0 If IsHWnd($hWnd) Then ; Check if the ListView has a ControlID $cCID = _WinAPI_GetDlgCtrlID($hWnd) Else $cCID = $hWnd ; Get ListView handle $hWnd = GUICtrlGetHandle($hWnd) EndIf ; If native ListView - could be either type of item If $cCID Then ; Disable the redrawing message GUICtrlSendMsg($cCID, $LV_WM_SETREDRAW, False, 0) ; Try deleting as native items Local $iParam = 0 Local $var = _GUICtrlListView_GetItemCount($hWnd) / 100 ;PROGRESSBAR Local $aktPerc = 0 ;PROGRESSBAR For $iIndex = _GUICtrlListView_GetItemCount($hWnd) - 1 To 0 Step -1 $iParam = _GUICtrlListView_GetItemParam($hWnd, $iIndex) ; Check if LV item If GUICtrlGetState($iParam) > 0 And GUICtrlGetHandle($iParam) = 0 Then GUICtrlDelete($iParam) EndIf if 100 - int($iIndex / $var) <> $aktPerc then ;PROGRESSBAR $aktPerc = 100 - int($iIndex / $var) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next ; Enable the redrawing message GUICtrlSendMsg($cCID, $LV_WM_SETREDRAW, True, 0) ; Return if no items left GUICtrlSetData($WaitLabel_Progress, 0) If _GUICtrlListView_GetItemCount($hWnd) = 0 Then Return True EndIf GUICtrlSetData($WaitLabel_Progress, 0) ; Has to be UDF Listview and/or UDF items Return _SendMessage($hWnd, $LVM_DELETEALLITEMS) <> 0 EndFunc ;==>_GUICtrlListView_DeleteAllItems_self Func _GUICtrlListView_SimpleSort_self($hWnd, $vSortSense, $iCol, $fToggle = True) GUICtrlSetData($WaitLabel_Progress, 0) GUICtrlSetData($WaitLabel, _getLanguageText("pleaseWait") & @crlf & _getLanguageText("listSorting")) sleep(100) Local $iItemCount = _GUICtrlListView_GetItemCount($hWnd) If $iItemCount Then Local $iDescending = 0 If UBound($vSortSense) Then $iDescending = $vSortSense[$iCol] Else $iDescending = $vSortSense EndIf Local $vSeparatorChar = Opt('GUIDataSeparatorChar') Local $iColumnCount = _GUICtrlListView_GetColumnCount($hWnd) ;Local Enum $iIndexValue = $iColumnCount, $iItemParam ; Additional columns for the index value and ItemParam Local $aListViewItems[$iItemCount][$iColumnCount + 2] ;Local $aSelectedItems = StringSplit(_GUICtrlListView_GetSelectedIndices($hWnd), $vSeparatorChar) ;Local $aCheckedItems = __GUICtrlListView_GetCheckedIndices($hWnd) Local $sItemText, $iFocused = -1 Local $var = $iItemCount / 100 ;PROGRESSBAR Local $aktPerc = 0 ;PROGRESSBAR For $i = 0 To $iItemCount - 1 ; Rows ;If $iFocused = -1 Then ; If _GUICtrlListView_GetItemFocused($hWnd, $i) Then $iFocused = $i ;EndIf ;_GUICtrlListView_SetItemSelected($hWnd, $i, False) ;_GUICtrlListView_SetItemChecked($hWnd, $i, False) For $j = 0 To $iColumnCount - 1 ; Columns $sItemText = StringStripWS(_GUICtrlListView_GetItemText($hWnd, $i, $j), 2) If(StringIsFloat($sItemText) Or StringIsInt($sItemText)) Then $aListViewItems[$i][$j] = Number($sItemText) Else $aListViewItems[$i][$j] = $sItemText EndIf Next ;$aListViewItems[$i][$iIndexValue] = $i ; Index value ;$aListViewItems[$i][$iItemParam] = _GUICtrlListView_GetItemParam($hWnd, $i) ; ItemParam if int(($i / $var) / 2) <> $aktPerc then ;PROGRESSBAR $aktPerc = int(($i / $var) / 2) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next ; Sort the ListView array _ArraySort($aListViewItems, $iDescending, 0, 0, $iCol) For $i = 0 To $iItemCount - 1 ; Rows For $j = 0 To $iColumnCount - 1 ; Columns _GUICtrlListView_SetItemText($hWnd, $i, $aListViewItems[$i][$j], $j) Next ;_GUICtrlListView_SetItemParam($hWnd, $i, $aListViewItems[$i][$iItemParam]) ; ItemParam #cs For $j = 1 To $aSelectedItems[0] If $aListViewItems[$i][$iIndexValue] = $aSelectedItems[$j] Then If $aListViewItems[$i][$iIndexValue] = $iFocused Then _GUICtrlListView_SetItemSelected($hWnd, $i, True, True) Else _GUICtrlListView_SetItemSelected($hWnd, $i, True) EndIf ExitLoop EndIf Next For $j = 1 To $aCheckedItems[0] If $aListViewItems[$i][$iIndexValue] = $aCheckedItems[$j] Then _GUICtrlListView_SetItemChecked($hWnd, $i, True) ExitLoop EndIf Next #ce if int(50 + (($i / $var) / 2)) <> $aktPerc then ;PROGRESSBAR $aktPerc = int(50 + ($i / $var) / 2) GUICtrlSetData($WaitLabel_Progress, $aktPerc) endif Next If $fToggle Then ; Automatic sort sense toggle If UBound($vSortSense) Then $vSortSense[$iCol] = Not $iDescending Else $vSortSense = Not $iDescending EndIf EndIf EndIf EndFunc ;==>_GUICtrlListView_SimpleSort_self
komm ich auf ~2100 Einträge die Sekunde... schneller wüsst ichs nicht.
Ist noch nen bisschen was drumrum mit Progressbar,... deshalb auch die _deleteitem und _sortsimple selber (bearbeitet) -
Mach nen _guictrllistview_beginupdate vor dem löschen, einfügen,... und nen _guictrllistviewendupdate danach. Das verhindert, dass die anzeige nach jedem einfügen geändert wird und beschleunigt es daher deutlich!
-
Wenn ich das Script bei mir (mit meinem Server) laufen lasse funktioniert es Einwandfrei. Also liegt es an der FTP-Server einstellungen, oder an den Dateinamen. Lass dir doch mal $sPath, $sDir & '/' & $sFilename ausgeben.
Eventuell fehlen auch Berechtigungen auf deinem eigenen Rechner. -
Hab mal dein Script angepasst:
AutoIt
Alles anzeigen#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=C:\Program Files (x86)\AutoIt3\Icons\MyAutoIt3_Green.ico #AutoIt3Wrapper_Res_Language=1031 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** ;---------------------------------------------------------------------------------------------------- #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <GuiListView.au3> #include <GuiIPAddress.au3> #include <GuiStatusBar.au3> #include <ProgressConstants.au3> #include <ComboConstants.au3> #include <Memory.au3> ;---------------------------------------------------------------------------------------------------- $Fenstertitel = "made by www.Ib-RuP.de" $default_bis = 255 ;---------------------------------------------------------------------------------------------------- Local $setIParray[4] = [0, 0, 0, 0] Local $aParts[2] = [100, -1] Local $sComboRead = "" ;GUI zusammenbasteln $GUI = GUICreate($Fenstertitel, 260, 800) $Combo1 = GUICtrlCreateCombo("", 60, 5, 200, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL)) ; Fenster 1. Zeile GUICtrlCreateLabel("Ping-von:", 5, 35, 50, 20) $IPAddress1 = _GUICtrlIpAddress_Create($GUI, 60, 35, 150, 20) _GUICtrlIpAddress_SetArray($IPAddress1, $setIParray) ; Fenster 2. Zeile GUICtrlCreateLabel("Ping-bis", 5, 60, 50, 20) $IP_input_bis = GUICtrlCreateInput($default_bis, 180, 60, 25, 20, BitOR($ES_CENTER, $ES_NUMBER)) ; Fenster 3. Zeile GUICtrlCreateLabel("Timeout:", 5, 85, 50, 20) $input_Timeout = GUICtrlCreateInput("1000", 60, 85, 30, 20, BitOR($ES_CENTER, $ES_NUMBER)) ; Fenster Button $Hidden_Text = GUICtrlCreateLabel("Scan läuft. Bitte Warten", 5, 110, 250, 40, $ES_CENTER) GUICtrlSetState($Hidden_Text, $GUI_HIDE) $Button_start = GUICtrlCreateButton("Start Ping", 5, 110, 250, 40) ; Fenster ListView $ListView = GUICtrlCreateListView("Adresse|Antwortzeit [MSec.]", 5, 155, 250, 620) $ListView_Handle = GUICtrlGetHandle($ListView) _GUICtrlListView_SetColumnWidth($ListView_Handle, 0, 100) _GUICtrlListView_SetColumnWidth($ListView_Handle, 1, 100) $ListView_Handle = GUICtrlGetHandle($ListView) ;Statusbar $StatusBar = _GUICtrlStatusBar_Create($GUI, $aParts) $progressbar = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH) _GUICtrlStatusBar_EmbedControl($StatusBar, 1, GUICtrlGetHandle($progressbar)) GUISetState(@SW_SHOW, $GUI) ;########## ;Netzwerkadapter auslesen und Combo Box zusammenbasteln $tagIP_ADDRESS_STRING = "char String[16];" $tagIP_MASK_STRING = $tagIP_ADDRESS_STRING $tagIP_ADDR_STRING = "ptr Next;" & $tagIP_ADDRESS_STRING & $tagIP_MASK_STRING & "DWORD Context;" $tagIP_ADAPTER_INFO = "long_ptr Next; DWORD ComboIndex; char AdapterName[260];char Description[132]; UINT AddressLength; BYTE Address[8]; dword Index; UINT Type;" & _ " UINT DhcpEnabled; ptr CurrentIpAddress; ptr NextIpAddressList; char IpAddressListADDRESS[16]; char IpAddressListMASK[16]; DWORD IpAddressListContext; " & _ "ptr GatewayListList; char GatewayListADDRESS[16]; char GatewayListMASK[16]; DWORD GatewayListContext; " & _ "ptr DhcpServerList; char DhcpServerADDRESS[16]; char DhcpServerMASK[16]; DWORD DhcpServerContext; " & _ "int HaveWins; " & _ "ptr PrimaryWinsServerList; char PrimaryWinsServerADDRESS[16]; char PrimaryWinsServerMASK[16]; DWORD PrimaryWinsServerContext; " & _ "ptr SecondaryWinsServerList; char SecondaryWinsServerADDRESS[16]; char SecondaryWinsServerMASK[16]; DWORD SecondaryWinsServerContext; " & _ "DWORD LeaseObtained; DWORD LeaseExpires;" $dll = DllOpen("Iphlpapi.dll") $ret = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", 0, "dword*", 0) $adapterBuffer = DllStructCreate("byte[" & $ret[2] & "]") $adapterBuffer_pointer = DllStructGetPtr($adapterBuffer) $return = DllCall($dll, "dword", "GetAdaptersInfo", "ptr", $adapterBuffer_pointer, "dword*", $ret[2]) $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $adapterBuffer_pointer) $combo_string = "" Do If _Get($adapter, "IpAddressListADDRESS") = "0.0.0.0" Then ;do nothing Else $combo_string = $combo_string & "|" & _Get($adapter, "IpAddressListADDRESS") ConsoleWrite("Description: " & _Get($adapter, "Description") & @CRLF) ConsoleWrite("IpAddressListADDRESS: " & _Get($adapter, "IpAddressListADDRESS") & @CRLF) ConsoleWrite("-------------------------------------" & @CRLF) EndIf $ptr = DllStructGetData($adapter, "Next") $adapter = DllStructCreate($tagIP_ADAPTER_INFO, $ptr) Until @error GUICtrlSetData($Combo1, $combo_string) $adapterBuffer = "" $adapterBuffer_pointer = "" DllClose($dll) Func _Get(ByRef $adapter, $ID) Return DllStructGetData($adapter, $ID) EndFunc ;==>_Get ;ENDE Netzwerkadapter auslesen und Combo Box zusammenbasteln ;####### ;---------------------------------------------------------------------------------------------------- Global $IPSearching = False, $IPStart, $IPEnd, $IPInsgesamt, $IPFertig, $IPOnline, $IPPercent, $IPPercentPart While True Switch GUIGetMsg() Case $Combo1 $sComboRead = GUICtrlRead($Combo1) $IP_value = StringSplit($sComboRead, ".") Local $setIParray_1[4] = [$IP_value[1], $IP_value[2], $IP_value[3], 1] _GUICtrlIpAddress_SetArray($IPAddress1, $setIParray_1) Case $Button_start _searchIps() If @error Then Switch @error Case 1 MsgBox(0 + 16 + 0 + 0 + 262144, "Fehler", "Es wurde bei mindestens einem Feld keinen Wert eingetragen!") Case 2 MsgBox(0 + 16 + 0 + 0 + 262144, "Fehler", " Ip Werte nur von 1-255") Case 3 MsgBox(0 + 16 + 0 + 0 + 262144, "Fehler", "bis muß größer als von sein") EndSwitch EndIf Case $GUI_EVENT_CLOSE Exit EndSwitch If $IPSearching Then _pingIPs() EndIf WEnd ;error: 1 -> Ein Feld ist leer ; 2 -> Wert darf nur zwischen 1 und 255 liegen ; 3 -> Start größer als Ende Func _searchIps() $IPStart = _GUICtrlIpAddress_GetArray($IPAddress1) $IPEnd = GUICtrlRead($IP_input_bis) ;#####Fehlerbehandlung #################### ;alle Felder voll? If ($IPStart[0] = "" Or $IPStart[1] = "" Or $IPStart[2] = "" Or $IPStart[3] = "" Or $IPEnd = "" Or GUICtrlRead($input_Timeout) = "") Then SetError(1) ;IP zwischen 1-255? ElseIf ($IPStart[0] < 1 Or $IPStart[0] > 255 Or $IPStart[1] < 1 Or $IPStart[1] > 255 Or $IPStart[2] < 1 Or $IPStart[2] > 255 Or $IPStart[3] < 1 Or $IPStart[3] > 255 Or $IPEnd < 1 Or $IPEnd > 255) Then SetError(2) ;Ende ist größer Anfang? ElseIf ($IPStart[3] > $IPEnd) Then SetError(3) EndIf ;#####Ende Fehlerbehandlung ################ ;Button ausblenden GUICtrlSetState($Button_start, $GUI_HIDE) ;Text einblenden GUICtrlSetState($Hidden_Text, $GUI_SHOW) ;ListView leeren _GUICtrlListView_DeleteAllItems($ListView_Handle) ;INITS $IPInsgesamt = $IPEnd - $IPStart[3] $IPFertig = 0 $IPOnline = 0 $IPPercentPart = 100 / $IPInsgesamt $IPSearching = True EndFunc ;==>_searchIps Func _pingIPs() If $IPStart[3] > $IPEnd Then $IPSearching = False ;#### alles fertig Beep(1000, 500) ;Text ausblenden GUICtrlSetState($Hidden_Text, $GUI_HIDE) ;Button wieder einblenden GUICtrlSetState($Button_start, $GUI_SHOW) ;Progressbar zurücksetzen GUICtrlSetData($progressbar, 0) ;Anzahl der gefundenen Teilnehmer ausgeben _GUICtrlStatusBar_SetText($StatusBar, $IPOnline & " Online") Else $Ping_IP = Ping($IPStart[0] & "." & $IPStart[1] & "." & $IPStart[2] & "." & $IPStart[3], $input_Timeout) ;in Listview eintragen If @error = 0 Then GUICtrlCreateListViewItem($IPStart[0] & "." & $IPStart[1] & "." & $IPStart[2] & "." & $IPStart[3] & "|" & $Ping_IP, $ListView) $IPOnline += 1 Beep(1000, 100) EndIf _GUICtrlStatusBar_SetText($StatusBar, $IPFertig & " von " & $IPInsgesamt & " fertig") ;Prozentanzeige aktualisieren If $IPPercent <> Int($IPFertig * $IPPercentPart) Then $IPPercent = Int($IPFertig * $IPPercentPart) GUICtrlSetData($progressbar, $IPPercent) EndIf $IPStart[3] += 1 $IPFertig += 1 EndIf EndFunc ;==>_pingIPs
-
Tipps:
1. Nur eine Schleife, oder den OnEventMode verwenden. NIEMALS eine langdauernde Schleife in die Hauptschleife. Die verhindert dann, das Events ausgeführt werden, wie z.B. das Schließen.
2. Sowas "While $start <= GUICtrlRead ($IP_input_bis)" sollte nicht genutzt werden. Es wird bei einer While-Schleife oft durchgelaufen (meistens). Bei jedem durchlauf würde das Control ausgelesen werden. Deshalb ist es unklug, dort nochmal Zeit zu verwenden. Außerdem wäre es doof, wenn jemand, während das Programm arbeitet die IP ändert. Also dort auch vorher auslesen und in eine Variable speichern.
3. Hier jetzt nicht wichtig, da die Pings recht viel Zeit verbrauchen, aber allgemein: Beim anzeigen der Prozent, eine $prozentOld anlegen, den alten Wert speichern und nur ändern, wenn Int($fertig * $test)<>$prozentOld. Wenn eine Schleife zu oft durchläuft kostet das sonst auch nochmal Zeit, manche Controls flackern dann aber auch.4. Allgemein gilt: alles was nicht unbedingt in die Schleife muss, kommt raus, damit diese Schnellstmöglich arbeitet: $test = 100 / $insgesamt wird jedesmal berechnet, ändert sich in der Schleife aber nie->aus der Schleife raus und nur einmal berechnen.
Denke, da hast du erstmal nen paar Punkte an denen du ansetzen und verbessern kannst
Ansonsten gut gelungen