Ich geb dir nen Tipp:
_GUICtrlListView_GetItemCount & GUICtrlSetData
sollte zum Ziel führen ![]()
Ich geb dir nen Tipp:
_GUICtrlListView_GetItemCount & GUICtrlSetData
sollte zum Ziel führen ![]()
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <array.au3>
#include <File.au3>
#include <GuiListView.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
Local $ad, $array1, $x = 0
[/autoit] [autoit][/autoit] [autoit]#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Ping Tool", 700, 510, 257, 323)
$ListView1 = GUICtrlCreateListView("Hostname", 24, 48, 170, 342)
GUICtrlSendMsg($ListView1, $LVM_SETCOLUMNWIDTH, 0, 160) ; setzt die 1. Spalte des Listviews auf 160 Pixel Breite
$ListView2 = GUICtrlCreateListView("Online", 224, 48, 170, 342)
$ListView3 = GUICtrlCreateListView("Offline", 424, 48, 186, 342)
$Button1 = GUICtrlCreateButton("PC`s Laden", 24, 400, 60, 25, 0)
$Button2 = GUICtrlCreateButton("Check", 24, 432, 50, 25, 0)
$Button3 = GUICtrlCreateButton("Check All", 75, 432, 50, 25, 0)
$Button4 = GUICtrlCreateButton("export1", 136, 400, 59, 25, 0)
$Button5 = GUICtrlCreateButton("export2", 336, 400, 59, 25, 0)
$Button6 = GUICtrlCreateButton("export3", 552, 400, 59, 25, 0)
$Button7 = GUICtrlCreateButton("Clear Host", 80, 20, 59, 25, 0)
$Button8 = GUICtrlCreateButton("Clear Online", 270, 20, 65, 25, 0)
$Button9 = GUICtrlCreateButton("Clear Offline", 490, 20, 65, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_Load()
Case $Button2
_pingitem()
Case $Button3
_pingall()
Case $Button4
_export()
EndSwitch
WEnd
Func _export()
[/autoit] [autoit][/autoit] [autoit]$hWnd = $ListView1
$path = FileSaveDialog('ListView-Export speichern', @ScriptDir, "CSV Datei (*.csv)")
If @error Then Exit MsgBox(0, 'Fehler', 'Keine Zieldatei gewählt.')
FileWrite($path & ".csv", _GUICtrlListView_Export($hWnd, 1, ','))
EndFunc ;==>_export
[/autoit] [autoit][/autoit] [autoit]Func _Load() ; Datenbank-Datei laden
_GUICtrlListView_DeleteAllItems($ListView1) ; Das Handle eben noch bestimmen (s. Anfang des Threads)
Local $sItem
$FileOpenDialog = FileOpenDialog("Pc Liste Wählen", @ScriptDir & "\", "Pc Liste (*.txt;*.csv)", 1 + 4)
Local $hFile = FileOpen($FileOpenDialog, 0) ; Datei zum lesen öffnen
If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
_GUICtrlListView_BeginUpdate($ListView1) ; Listview sperren
While True ; Endlosschleife
$sItem = FileReadLine($hFile) ; Zeile aus der Datei lesen
If @error Then ExitLoop ; wenn das Ende der Datei erreicht ist, dann Endlosschleife verlassen
GUICtrlCreateListViewItem($sItem, $ListView1) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
WEnd
_GUICtrlListView_EndUpdate($ListView1) ; Listview wieder freigeben
FileClose($hFile) ; Datei schließen
EndIf
EndFunc ;==>_Load
Func _insert()
$string = FileOpenDialog("Pc Liste Wählen", @ScriptDir & "\", "Pc Liste (*.txt;*.csv)", 1 + 4)
_GUICtrlListView_DeleteAllItems($ListView1)
_GUICtrlListView_DeleteAllItems($ListView2)
_GUICtrlListView_DeleteAllItems($ListView3)
$array = StringSplit(FileRead($string), @CR)
For $i = 0 To UBound($array) - 1
GUICtrlCreateListViewItem($array[$i], $ListView1)
Next
EndFunc ;==>_insert
Func _pingall()
_GUICtrlListView_DeleteAllItems($ListView2)
_GUICtrlListView_DeleteAllItems($ListView3)
Local $icount = _GUICtrlListView_GetItemCount($ListView1)
For $i = 0 To $icount - 1
$ListViewText = _GUICtrlListView_GetItemTextArray($ListView1, $i)
;consolewrite($ListViewText[1]&@CRLF)
$var = Ping($ListViewText[1], 250)
If $var Then; Es geht auch If @error = 0 Then ...
GUICtrlCreateListViewItem($ListViewText[1], $ListView2)
Else
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
EndIf
Next
EndFunc ;==>_pingall
Func _pingitem()
[/autoit] [autoit][/autoit] [autoit]$ListViewText = _GUICtrlListView_GetItemTextArray($ListView1)
;consolewrite($ListViewText[1]&@CRLF)
ConsoleWrite(Ping($ListViewText[1], 250))
$var = Ping($ListViewText[1], 250)
If $var Then; Es geht auch If @error = 0 Then ...
MsgBox(0, "Status", "Online, Antwortzeit war:" & $var)
GUICtrlCreateListViewItem($ListViewText[1], $ListView2)
Else
MsgBox(0, "Status", "Es ist ein Fehler mit der Nummer " & @error & " aufgetreten.")
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_pingitem
[/autoit] [autoit][/autoit] [autoit]Func _GUICtrlListView_Export($hWnd, $exType = 0, $Delim = Default) ; $exType=0 Array / $exType=1 String
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
Local $row = _GUICtrlListView_GetItemCount($hWnd)
If $exType Then
If $Delim <> Default Then Local $oldDelim = Opt('GUIDataSeparatorChar', $Delim)
Local $sOut = ''
For $i = 0 To $row - 1
$sOut &= _GUICtrlListView_GetItemTextString($hWnd, $i) & @CRLF
Next
If $Delim <> Default Then Opt('GUIDataSeparatorChar', $oldDelim)
Return $sOut
EndIf
Local $col = _GUICtrlListView_GetColumnCount($hWnd)
Local $aOut[$row][$col]
If $col = 1 Then
ReDim $aOut[$row]
For $i = 0 To UBound($aOut) - 1
$aOut[$i] = _GUICtrlListView_GetItemText($hWnd, $i)
Next
Return $aOut
EndIf
For $i = 0 To UBound($aOut) - 1
For $j = 0 To UBound($aOut, 2) - 1
$aOut[$i][$j] = _GUICtrlListView_GetItemText($hWnd, $i, $j)
Next
Next
Return $aOut
EndFunc ;==>_GUICtrlListView_Export
So.
und jetzt mach dir eine .txt Datei mit folgendem Inhalt
Bei 127.0.0.1 kommts ins Listview online und bei test ins Listview offline.
Möglich ist vieles. ![]()
Deine _Insert Funktion ist mir eh unklar (kenne aber auch die .txt nicht PC1, PC2, PC3 usw. wird ja wohl nicht drin stehen - sonst wundert mich das Ergebnis nicht!)
hier mal eine Funktion aus Oscars Listview Beispiel zum einlesen
[autoit]Func Load() ; Datenbank-Datei laden
_GUICtrlListView_DeleteAllItems($hLVHandle) ; Das Handle eben noch bestimmen (s. Anfang des Threads)
Local $sItem
Local $hFile = FileOpen($sDBFile, 0) ; Datei zum lesen öffnen
If $hFile <> -1 Then ; wenn das öffnen erfolgreich war, dann...
_GUICtrlListView_BeginUpdate($hLVHandle) ; Listview sperren
While True ; Endlosschleife
$sItem = FileReadLine($hFile) ; Zeile aus der Datei lesen
If @error Then ExitLoop ; wenn das Ende der Datei erreicht ist, dann Endlosschleife verlassen
GUICtrlCreateListViewItem($sItem, $hListView) ; mit den eingelesenen Daten einen neuen Listview-Eintrag erstellen
WEnd
_GUICtrlListView_EndUpdate($hLVHandle) ; Listview wieder freigeben
FileClose($hFile) ; Datei schließen
EndIf
EndFunc ;==>Load
P.S. etwas mehr Mitarbeit bitte.
Wenn Ping("127.0.0.1") erfolgreich ist, dann trage doch mal nur 127.0.0.1 in deine .txt Datei ein und teste dein Skript!
Sollte dann Ping($ListViewText[1]) nicht funktionieren liegt doch der Schluss nahe, dass etwas mit $ListViewText[1] nicht stimmt!
Aus der Hilfe:
[autoit]$var = Ping("127.0.0.1",250)
If $var Then; also possible: If @error = 0 Then ...
Msgbox(0,"Status","Online, roundtrip was:" & $var)
Else
Msgbox(0,"Status","An error occured with number: " & @error)
EndIf
Ergibt bei mir das erwartete Ergebnis ("online")!
In deinem Array ist $ListViewText[1] = "test"
Ein ping auf "test" führt wohl zu offline ... (logisch) ![]()
$var = Ping($ListViewText[1],250) dann gibt doch hier mal die IP des Onlinerechners ein.
bzw. untersusche $ListViewText[1]
Der genaue Error code ist egal?
[autoit]Func _pingitem()
$ListViewText = _GUICtrlListView_GetItemTextArray($listview1)
;consolewrite($ListViewText[1]&@CRLF)
$var = Ping($ListViewText[1],250)
if $var = 0 then
GUICtrlCreateListViewItem($ListViewText[1], $ListView3) ;für offline
Else
GUICtrlCreateListViewItem($ListViewText[1], $ListView2) ;für jeden Rückgabewert ohne @error (online)
endif
EndFunc
Wenn das nicht hilft muss du genau den Rückgabewert der Ping() Funktion untersuchen (z.B. per msgbox).
Im Listview1?
Poste doch mal zumindest einen Teil der .txt Datei, sonst wird schwierig.
versuchs mal so (Achtung ungetestet):
[autoit]
Func _pingall()
local $icount = _GUICtrlListView_GetItemCount($ListView1)
for $i = 0 to $icount -1
$ListViewText = _GUICtrlListView_GetItemTextArray($listview1, $i)
consolewrite($ListViewText[1]&@CRLF)
$var = Ping($ListViewText[1],250)
Switch @error
Case 1
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
Case 2
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
Case 3
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
Case 4
GUICtrlCreateListViewItem($ListViewText[1], $ListView3)
case Else
GUICtrlCreateListViewItem($ListViewText[1], $ListView2)
EndSwitch
next
EndFunc
Mit _GUICtrlListView_GetItemCount die Anzahl bestimmen und danach in einer Schleife deine Funktion von ersten bis zum letzten Item durchgehen ( zweiten Parameter bei _GUICtrlListView_GetItemTextArray beachten).
Die Listview UDF erfordert eigentlich das Handle, in der Hilfe ists aber auch anders erklärt. Sehr seltsam ![]()
Zu deinem Problem - wieso nicht einfach so?
[autoit]
Func _pingitem()
$ListViewText = _GUICtrlListView_GetItemTextArray($listview1)
consolewrite($ListViewText[1]&@CRLF)
$var = Ping($ListViewText[1],250)
If $var Then
GUICtrlCreateListViewItem($ListViewText[1], $listview2)
Msgbox(0,"Status","Online, Antwortzeit war:" & $var)
Else
GUICtrlCreateListViewItem($ListViewText[1], $listview3)
Msgbox(0,"Status","Es ist ein Fehler mit der Nummer " & @error & " aufgetreten.")
EndIf
EndFunc
So ganz sinnvoll ists natürlich noch nicht.
Du hast ein Listview1 mit PC IP's und du möchtest das markierte Item (bzw. die IP) pingen und das Ergebnis je nachdem in Listview2 oder Listview3 speichern?
Hey,
ich verstehe nicht so genau was du vor hast.
Was mir aufgefallen ist:
_GUICtrlListView_GetItemTextArray($listview1) hier sollte das Handle verwendet werden.
[autoit]
Gloabl $ListView1 = GUICtrlCreateListView("Hostname", 24, 48, 170, 342)
Global $hLVHandle = GUICtrlGetHandle($ListView1)
_GUICtrlListView_GetItemTextArray($hlvhandle)
Hey,
auf das zweite Programm (DVBViewer) habe ich wenig Einfluss.
Die Variante von progandy führt zum Ziel - nochmals danke! ![]()
hey,
danke für die zahlreichen Vorschläge.
Auslagern (.txt, .ini oder sonstwas) ist zumindest beim Übergeben eines Timers nicht wirklich optimal.
Über einen zweiten Mutex geht wohl auch nicht.
Bleibt die Variante von progandy - die schau ich mir morgen genau an.
Danke für dein Bemühen, ich glaube wir haben uns doch missverstanden.
Es soll keine 2. Instanz gestartet werden, sondern durch ein eneutes Aufrufen soll der 1. Instanz etwas mitgeteilt werden (Rufe Funktion XY auf oder sowas).
Meine einzige Idee wäre über einen zweiten Mutex ![]()
Genau. Oder eine bestimmte Funktion aufrufen.
Im Prinzip hab ich keine Ahnung wie das bei anderen Prog. gelöst ist und wenig Ansatzmöglichkeiten
Scheint wohl nicht zu gehen?
Ist es möglich, dass 2 (gleiche) Skripte mit einander kommunizieren? Die zuletzt gestartete Instanz könnte sich dann den Countdownstand vom der ersten holen, diesen Anzeigen und sich wieder beenden.
Ok hast recht, die Funktion oben geht echt nicht. Ist für ein Listview, keine Ahnung was da schief läuft (und was lernen wir daraus? nicht in Funktionen rumschmieren die man nicht versteht
)
Neuer Versuch:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("ICQ Away Tool", 451, 346, 238, 121,0x80000000)
GUISetFont(8, 400, 0, "Comic Sans MS")
GUISetBkColor(0xFFFFFF)
$Pic1 = GUICtrlCreatePic("icqneww.jpg",0,0, 451, 346, -1,$GUI_WS_EX_PARENTDRAG)
$Label1 = GUICtrlCreateLabel("Wichtig! ICQ Fenster muss Links oben in der Ecke platziert sein.", 24, 96, 335, 19)
GUICtrlSetBkColor(-1, 0xF2FEEC)
$Input1 = GUICtrlCreateInput("Hier Nachricht eingeben", 32, 120, 281, 23)
GUICtrlSetBkColor(-1, 0xF2FEEC)
GUICtrlSetCursor (-1, 5)
$btnHid1 = GUICtrlCreateLabel('Start', 32, 168, 71, 34)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT )
GUICtrlSetState(-1, $GUI_ONTOP)
$btnHid2 = GUICtrlCreateLabel('Exit', 120, 165, 71, 34)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT )
GUICtrlSetState(-1, $GUI_ONTOP)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btnHid1
Start ()
Case $btnHid2
Ende ()
Endswitch
WEnd
Func Start ()
If TrayTip ("","Bot gestartet",3000) Then
Sleep (1000)
If WinWait("FENSTERNAME") Then
Sleep (500)
IF WinActivate ( "FENSTERNAME") Then
Sleep (1300)
WinMove("FENSTERNAME", "", 0, 0)
Sleep (3000)
EndIf
EndIf
EndIf
While 1
Dim $pixl=PixelSearch ( 25, 260, 133, 301, 0xDD5404, 10,0)
If not @error Then
sleep (1000)
MouseClick("left",30,355)
Sleep (1000)
send(GuiCtrlRead ($input1))
sleep (100)
Send ("{ENTER}")
EndIf
WEnd
EndFunc
Func Ende ()
Exit
EndFunc
Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $hWndListBox
If Not IsHWnd($btnHid2) Then $hWndLabel = GUICtrlGetHandle($btnHid2)
$hWndFrom = $ilParam
Switch $hWndFrom
Case $btnHid2, $hWndLabel
Ende()
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND (Bugfix - http://www.autoit.de)
@all
Die oben vorgeschlagene Funktion stammt hier aus dem Forum (ka von wem)und lautet im Orignal
Func _DoubleClickOnListView($hWnd, $Msg, $wParam, $lParam);Die Eigentliche Funktion
Local $tagNMHDR, $event, $hwndFrom, $code
$tagNMHDR = DllStructCreate("int;int;int", $lParam)
If @error Then Return
$event = DllStructGetData($tagNMHDR, 3); Checkt wie das EVENT aussieht
If $wParam = $hListView Then;Wenn der Klick auf das ListView ging..
If $event = $N_DBLCLK Then;.. Wenn es ein DoppelKlick war
;die jeweilige Funktion
EndIf
EndIf
$tagNMHDR = 0
$event = 0
$lParam = 0
EndFunc ;==>_DoubleClickOnListView
Wie kann man diese Funktion für andere Gui-Elemente umbauen?
Ich verstehe die Dll- Sachen leider noch nicht ![]()
Ich glaube das geht nur über GUIRegisterMsg()
Versuchs mal das hier einzubauen (s. Kommentar im Skript):
[autoit]
#include <WindowsConstants.au3>
;<WindowsConstants.au3> wird für _ClickonButton() gebraucht
GUIRegisterMsg($WM_NOTIFY, "_ClickonButton") ;vor die Schleife der Gui setzen
[/autoit][autoit][/autoit][autoit];
;
Func _ClickonButton($hWnd, $Msg, $wParam, $lParam)
Local $tagNMHDR, $event, $hwndFrom, $code
$tagNMHDR = DllStructCreate("int;int;int", $lParam)
If @error Then Return
$event = DllStructGetData($tagNMHDR, 3)
If $wParam = $btnHid2 and $event = $NM_CLICK Then ;$btnHid2 = dein Exit button?
Ende() ;deine Exit Funktion?f
EndIf
$tagNMHDR = 0
$event = 0
$lParam = 0
EndFunc
Ansonsten mal bitte das ganze Skript posten damit man rumprobieren kann.