Array in Liste ausgeben ?

  • Hallo
    Kann mir jemand erklären, wie ich ein Array in eine Liste ausgeben kann
    ?

    Code
    Dim $aRecords
    If Not _FileReadToArray("test.txt",$aRecords) Then
       MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
       Exit
    EndIf
    For $x = 1 to $aRecords[0]
    	Msgbox(0,'Remote PC:' & $x, $aRecords[$x])
    
    Next

    Hier kann ich zwar das Array in einer msgbox sehen aber jeden Eintrag muss ich mit OK bestätigen.

    Mit diesem Zeile geht das zwar aber die Arraynr z.B
    [1] = abcde
    [2] = fghij
    stört mich

    Code
    _ArrayDisplay( $aRecords, "_ArrayDisplay() Test" )

    Ja und wie geht das ganze dann in einer GUI ?
    Also ein ganz einfacher Button, der dann in der Gui diese Liste anzeigt.

    Vielleicht kann mir da jemand helfen.
    So richtig werde ich da nicht schlau wie das funktioniert.

    Danke im voraus

    Gruß Viper67

  • hier mal schnell die UDF umgebastelt oben mal ohne Fkt und unten die die Fkt. mit den selben variablen;

    [autoit]


    #include <Array.au3>
    ; modification of the original _arraydisplay
    ; byBrian Keene <brian_keene at yahoo dot com>
    ; by Leviathan

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

    Dim $test[8]
    $test[0] = "i love autoit.de"
    $test[1] = "Brian"
    $test[2] = "Jon"
    $test[3] = "Larry"
    $test[4] = "Christa"
    $test[5] = "Rick"
    $test[6] = "Jack"
    $test[7] = "Gregory"
    Local $iCounter = 0, $sMsg = ""

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

    $sTitle = "Test123"

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

    For $iCounter = 0 To UBound($test) - 1
    $sMsg = $sMsg & StringStripCR($test[$iCounter]) & @CR
    Next
    MsgBox(4096, $sTitle, $sMsg)
    Exit

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

    Func _ArrayDisplay_Advanced(Const ByRef $avArray, $sTitle)
    Local $iCounter = 0, $sMsg = ""

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

    If (Not IsArray($avArray)) Then
    SetError(1)
    Return 0
    EndIf

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

    For $iCounter = 0 To UBound($avArray) - 1
    $sMsg = $sMsg & StringStripCR($avArray[$iCounter]) & @CR
    Next

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

    MsgBox(4096, $sTitle, $sMsg)
    SetError(0)
    Return 1
    EndFunc ;==>_ArrayDisplay_Advanced

    [/autoit]

    edit: mh BugFix war mal wieder schneller -> naja dafür ist meins schöner

    Einmal editiert, zuletzt von leviathan (9. Februar 2007 um 20:14)

  • Hi leviathan, Hi Bufix.
    Erstmal vielen Dank für eure Hilfe.

    BugFix
    Ausgabe über msgbox hat nicht so richtig funktioniert.
    Als Ausgabe erfolgte die Anzeige der Zeilen und das so oft wie es die Zeilen gibt.

    @levithan
    das hat funktioniert.

    Kannst Du mir noch die folgenden Zeilen erklären was da genau abläuft ?

    For $iCounter = 0 To UBound($test) - 1
    Ich denke mal hier wird Zeile für Zeile hochgezählt. Aber was macht genau der Ubound Befehl mit der - 1 hinten dran =?


    $sMsg = $sMsg & StringStripCR($test[$iCounter]) & @CR
    Und in dieser Zeile ? warum $sMsg & ? was passiert da genau.


    Ja dann nochwas. gibt es irgendwo eine gute Anleitung für das Arbeiten mit den Arrays ? Da fehlt es mir doch an dem grundlegendem Fachwissen. und die original Hilfe gibt da nicht soviel her finde ich.

    Danke Gruß viper67

    • Offizieller Beitrag
    Zitat

    Als Ausgabe erfolgte die Anzeige der Zeilen und das so oft wie es die Zeilen gibt.

    Verstehe ich nicht ganz, was du jetzt meinst. Es wird in jedem Schleifendurchlauf der Inhalt des Arrays an der aktuellen Pos. $i zur Variable $txt hinzugefügt und ein Zeilenumbruch angehängt.
    Nach Beenden der Schleife wird der Inhalt von $txt ausgegeben.

    Zitat

    Aber was macht genau der Ubound Befehl mit der - 1 hinten dran =?

    Ubound() gibt die obere Grenze (upper Bound) des Arrays aus. Da Arrays 0-indexiert sind (Element 1 = $ar[0] usw.) erhältst du z.B. für ein Array mit 10 Elementen auch UBound = 10. Um auf das Element zuzugreifen mußt du es aber mit dem Index adressieren und der ist 1 weniger, da bei 0 beginnend. ==> Deshalb: UBound -1

  • Hi Bi
    Bugfix

    19 Zeilen sind in dem textfile vorhanden.
    und 19 mal hat er die 19 angezeigt anstatt den Inhalt jeder Zeile anzuzeigen.
    Frag mich warum.
    Vielleicht hatte ich mich auch verschrieben.

    Danke für die Ubound Beschreibung. Habs verstanden.

  • mhhh welche von den beiden versionen haste denn verwendet???
    und nur nochmal zum verständis er hat folgendes angezeigt:

    Code
    19
    19
    19
    19
    19
    ....
    19

    ???!!!???

    der snoozer

    • Offizieller Beitrag

    Hi, das funzt schon so:

    Spoiler anzeigen
    [autoit]

    Dim $aRecords[10]
    $aRecords[0] = 9
    For $i = 1 To $aRecords[0]
    $aRecords[$i] = "Item " & $i
    Next

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

    $txt = ""
    For $i = 1 to $aRecords[0]
    $txt &= $aRecords[$i] & @LF
    Next
    MsgBox(0, '', $txt)

    [/autoit]


    Aber ich hatte in meinem Bsp. von der Vorlage kopiert und dort war "$x" als Schleifenvariable. Innerhalb der Schleife habe ich aus Gewohnheit "$i" verwendet. ;)

  • @ Bugfix
    Jetzt läuft es. Danke

    So jetzt frag ich aber mal weiter um im großen Array-Dschungel zurechtzukommen.

    Ich hab mir mal PSTools runtergeladen und hole erstelle mir mittels psinfo eine Textdatei (Systeminformationen von einem entfernten PC)
    Ich weiß es wurden schon mit Autoit und pstools Programme geschrieben. Soll hier auch nur für mich zum test sein um ein wenig zu üben. ;)
    Na egal jedenfalls hab ich nun eine Textdatei
    die unter anderem folgendes Format hat.
    ....

    Physical memory: 1024 MB
    Video driver: NVIDIA GeForce FX 5200

    ....
    Wie man sieht, kommt nach jedem Doppelpunkt Leerzeichen.
    In der Textdatei dteht das alles wunderbar untereinander.
    Im ausgelesenen Array sieht das dann weniger schön aus.
    OK ein Schritt bin ich schon weiter und hab folgendes ersetzt...

    Code
    von For $iCounter = 0 To UBound($avArray) - 1
    		$sMsg = $sMsg & StringStripCR($avArray[$iCounter]) & @CR
    	Next


    das StringStripCR mit StringStripWS
    So jetzt sieht das alles ein wenig aufgeräumter aus.
    Jetzt aber meine Frage.
    Wie würdet Ihr die eingelesenen Daten verarbeiten ?
    Damit man daraus optisch was anspruchsvolles bekommt ?
    Mit anspruchsvoll meine ich z.B. Sowas in einer Gui ausgeben. Vielleicht in Tabellenform etc.
    Und besser gefragt wie funktioniert das dann ?

    erst dachte ich mir, ich sollte die Textdatei so verändern , das ich ein iniRead anwenden kann. Und aus dieser lese ich dann die Daten wieder ein.
    Für mein Beispiel hier würde ich dann
    Physical memory: 1024 MB nehmen und
    Physical_memory=1024daraus machen
    Dann kann ich das mit iniRead schön einbinden.
    Geht das überhaupt ?
    Schätze aber da mehr geht wenn man direkt mit den Arrays arbeitet.
    Aber wie ?

    Gruß und Danke
    viper67

    • Offizieller Beitrag

    Hi!

    Ich würde mit _FileReadToArray die Datei in ein Array einlesen und dann jede Zeile mit einer For-Schleife bis Ubound($array) -1 durchgehen. Dann jeweils $text = StringReplace($array[$i], ": ", "|"), dann hast du es ein einem Format in $text stehen, das GUICTRLCreateListViewItem annimmt. Vor der For-Schleife machst du noch ein GUICTRLCreateListView, dass dann die jeweiligen Items entgegennimmt. Dann sollte es optisch schon gut aussehen :)

    peethebee

  • Hi peethebee
    ich probiere das heute Abend mal aus.
    wäre das nicht mal was für's Wiki ?
    Ein Array HowTo das über die eigentliche Autoit Hilfe hinausgeht.
    Und zwar mit Beschreibung was der Code gerade macht.
    Ich denke ich bin da nicht der Einzige, der von Arrays keine Ahnung hat ;) oder doch ? ;)
    Nun ja jedenfalls vielen Dank erstmal für Deine Hilfe.

    Gruß viper67

    Einmal editiert, zuletzt von viper67 (12. Februar 2007 um 14:15)

    • Offizieller Beitrag

    Hi viper67,

    du hast nicht ganz unrecht, die Arrays (also die mehrdimensionalen), kommen in der Hilfe ein bischen ( naja eher total ;) ) dünn weg.
    Habe deinen Hilferuf erhört und schon mal das Wesentliche zu Mehrdimensionalen Arrays im Wiki hinterlegt. Sollte da noch mehr mit rein, dann sag mal an, wo Probleme sind. -> Wenn man erst mal mit umgehen kann, fehlt einem etwas der Blick auf die Anfangsschwierigkeiten. ;)

  • Hi BugFix, Hi Peethebee

    Dank Eurer Hilfe geht es hier Schritt für Schritt weiter.
    Das mit den Arrays ist ne fette Sache.
    Ist ein richtiger Sprung für mich in Sachen Autoit.
    Und die Info's im Wiki kommen bestimmt vielen zu Gute.

    So und nun in Bezug auf das Beispiel mit psinfo mein Script wie es bis jetzt aussieht.
    Zum Ablauf des Skriptes ganz kurz.
    Benutzername Passwort und Rechnername eingeben.(damit man das von jedem Account abrufen kann)
    Dann wird psinfo.exe gestartet und liest die Konfiguration aus und gibt das an eine Liste weiter.
    Ich denke als Übungsobjekt für den Anfang eine schöne Aufgabe ;)
    Da ist bestimmt noch nicht alles so wie es sein sollte, deshalb nehme ich gerne auch Kritik an wenn ich etwas falsch gemacht habe.
    Vielleicht möchte das jemand so ins Wiki übernehmen.
    Wenn ich da was zu schreiben soll sprich Erklärung oder oder oder ... dann erkläre ich mich gerne zu bereit.


    [autoit]


    #include <GUIConstants.au3>
    #include <file.au3>
    #Include <GuiListView.au3>
    #include <Process.au3>

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

    $remote_pc = InputBox ("Remote PC", "Geben sie den Rechnernamen ein")
    $remote_admin = InputBox ("Remote Username", "Geben Sie den Usernamen ein.")
    $remote_password = InputBox ("Remote Password", "Geben Sie das Passwort ein.", "", "*")
    Local $i, $Apps, $even = 1, $lv_item
    $psinfo = "psinfo \\"& $remote_pc &" -u "& $remote_admin &" -p "& $remote_password &" > psinfo.txt"
    Runwait(@ComSpec & " /c " & ''& $psinfo &'', "", @SW_SHOW)

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

    GUICreate("PC Info",420,520, 200,200,-1,$WS_EX_ACCEPTFILES)
    GUISetBkColor (0x00FFFFDD)
    $listview = GuiCtrlCreateListView ("Systeminfo|Ergebnis",10,10,400,300)

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

    Dim $array
    If Not _FileReadToArray("psinfo.txt",$array) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

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

    Local $i = 0, $text = ""
    For $i = 1 To UBound($array) - 1
    $text = StringStripWS( $array[$i], 4 )
    $text = StringReplace($text, ": ", "|")
    $text = StringReplace($text, "System information for \\", "PC-Name|")
    $text = StringReplace($text, ": ", "|")

    $item=GuiCtrlCreateListViewItem($text,$listview)
    _GUICtrlListViewSetColumnWidth ($listview, 1, $LVSCW_AUTOSIZE_USEHEADER)
    Next
    GuiSetState()
    Do
    $msg = GuiGetMsg ()

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

    Until $msg = $GUI_EVENT_CLOSE

    [/autoit]

    Wie Ihr im Dateianhang seht, sind in der Liste noch einige Fehler.
    vielleicht gibt es da eine Lösung
    z.B. im Feld Systeminfo wird die Spaltenbreite nicht angepasst.
    Dann hab ich hinter dem Rechnernamen noch einen Doppelpunkt, den ich nicht wegbekomme.

    Dann wäre es schick, wenn ich die Inputfelder im gleichen Fenster hätte mit einem Abfragebutton.
    Hab das zwar schon probiert, aber mehr als eine Abfrage nach dem Starten des Skriptes bekomme ich da nicht hin,...
    ...wenn ich danach die Inputfelder ändere und die Abfrage erneut ausführe wird nur ein null - Wert überliefert.
    Ja und zu guter letzt würde es nicht schlecht aussehen, wenn man während der Laufzeit das Dos-Fenster auf @SW_HIDE setzt dafür aber irgendeinen Laufbalken hinbekommt.
    Nun ja so nach und nach halt das Skript aufbaut...

    Was haltet Ihr davon, wenn man so eine Art Workshop im Wiki daraus macht ?
    Also nicht nur einfach das Skript posten wenn es fertig ist, sonder das ganze auch noch beschriften was da Zeile für Zeile geschieht.
    Hilft vielleicht auch dem ein oder anderen.

    Müssen ja auch nicht elendig lange Skripte sein ;) Aber so der ein oder andere Tipp den es in der Autoit Hilfe gibt ist bestimmt der Renner unter der Autoit Fangemeinde.

    Gruß Viper67

    • Offizieller Beitrag

    Ich habe dein Bsp. mal etwas zusammengefaßt. Da ich die PsInfo nicht habe kann ich den Teil nicht testen.

    Aber etwas soll ja auch für dich bleiben. ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <file.au3>
    #Include <GuiListView.au3>
    #include <Process.au3>
    Dim $complete = 0, $i, $array, $text = ""

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

    $Form1 = GUICreate("AForm1", 427, 201, -1, -1, BitOR($WS_POPUPWINDOW,$WS_BORDER))
    GUISetBkColor (0x4682B4)
    $inPC = GUICtrlCreateInput("", 160, 34, 225, 21)
    $inUser = GUICtrlCreateInput("", 160, 70, 225, 21)
    $inPW = GUICtrlCreateInput("", 160, 106, 225, 21, BitOR($ES_PASSWORD,$ES_AUTOHSCROLL))
    $Label1 = GUICtrlCreateLabel("Remote PC", 20, 37, 58, 17)
    $Label2 = GUICtrlCreateLabel("Remote Username", 20, 72, 92, 17)
    $Label3 = GUICtrlCreateLabel("Remote Password", 20, 109, 90, 17)
    $btnOK = GUICtrlCreateButton("OK", 304, 145, 81, 21, 0)

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

    $GUI_Info = GUICreate("PC Info", 420, 320, -1, -1, Default, $WS_EX_ACCEPTFILES)
    GUISetBkColor (0x4682B4)
    $listview = GuiCtrlCreateListView ("Systeminfo|Ergebnis",10,10,400,300)
    _GUICtrlListViewSetColumnWidth ($listview, 0, 150)
    _GUICtrlListViewSetColumnWidth ($listview, 1, 246)

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

    GUISetState(@SW_SHOW, $Form1)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnOK
    $remote_pc = GUICtrlRead($inPC)
    If $remote_pc = "" Then $complete += 1
    $remote_admin = GUICtrlRead($inUser)
    If $remote_admin = "" Then $complete += 1
    $remote_password = GUICtrlRead($inPW)
    If $remote_password = "" Then $complete += 1
    If $complete <> 0 Then
    MsgBox(262192,"Angaben unvollständig!","Bitte Angaben vervollständigen.")
    $complete = 0
    Else
    GUISetState(@SW_HIDE, $Form1)
    $psinfo = "psinfo \\"& $remote_pc &" -u "& $remote_admin &" -p "& $remote_password &" > psinfo.txt"
    RunWait(@ComSpec & " /c " & ''& $psinfo &'', "", @SW_HIDE)
    GUISetState(@SW_SHOW, $GUI_Info)
    If Not _FileReadToArray("psinfo.txt",$array) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf
    For $i = 1 To UBound($array) - 1
    $text = StringStripWS( $array[$i], 4 )
    $text = StringReplace($text, ": ", "|")
    $text = StringReplace($text, "System information for \\", "PC-Name|")
    $text = StringReplace($text, ": ", "|")
    $item = GuiCtrlCreateListViewItem($text, $listview)
    Next
    EndIf
    EndSwitch
    WEnd
    Exit

    [/autoit]
    • Offizieller Beitrag

    Hi viper67!

    Die Idee, das in das Tutorial zu übernehmen ist sicherlich nicht schlecht. Ich denke, dass es hier (http://wiki.autoit.de/wiki/index.php…eispielprojekte) gut passen würde als neuer Unterpunkt.

    Viel Spaß beim Schreiben!

    peethebee

    p.s. Danke an denjenigen, der die Ordnung bei den Arrays angepasst und damit die korrekte Nummerierung erreicht hat!