HILFE

  • Hallo,

    ich habe ein problem ich will dynamisch teste daten aus ein ordner lessen und die dann splitten. So das ich mit checkboxen die 1 spalte ausgebe und wenn es gecheckt wir soll er mit die 2 splate aus geben.

    so habe ich angefangen

    [autoit]


    #include <GUIConstantsEx.au3>
    #include <file.au3>
    #include <array.au3>

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

    Global $aArray
    Global $text
    Global $htab
    Global $htabtext [10]
    Global $hchks1[10][30]
    Global $hchks2[10][30]

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

    GUISetBkColor(0x00E0FFFF)
    GUISetFont(9, 300)

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

    GUICreate("Test", 450, 415)
    Global $hbtnWakeUp = GUICtrlCreateButton("Aufwecken",350, 390, 100)
    $htab = GUICtrlCreateTab(10, 10, 435, 380)
    GUISetState(@SW_SHOW)

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

    $ordner = _FileListToArray(@ScriptDir & "\ordner\" , "*.txt", 1)

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

    For $text = 1 To $ordner[0]


    $FileToRead = @ScriptDir & $ordner & "\" & $ordner[$text]
    $htabtext[$text] = GUICtrlCreateTabItem($ordner[$text])

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

    MsgBox(0,"",$FileToRead)
    Next

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

    If _FileReadToArray($FileToRead,$aArray) Then
    MsgBox(0,"",$FileToRead)
    For $zeile1 = 1 To $aArray[0]
    $ausgabe = StringSplit($aArray[$zeile1], ";")

    $i = Int(($pc + 9) / 10) * 80
    $j = Mod(($pc + 9), 10) * 25 + 80
    $hchks1[$text][$zeile1] = GUICtrlCreateCheckbox("" & $ausgabe[1], $i,$j )
    MsgBox(64,"",$ausgabe[1])
    $hchks2[$text][$zeile1] = $ausgabe[2])
    MsgBox(0,"", $hchkzeile1[$text][$zeile1])
    Next
    EndIf
    GUICtrlCreateTabItem("")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    case $msg = $hbtnWakeUp
    for $raum = 1 to $ordner[0]

    For $pc = 1 to 29
    if BITAND(GUICtrlRead($hchks1[$text][$zeile1]),$GUI_CHECKED) = $GUI_CHECKED Then
    msgbox( 64,"",$hchks2)

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


    EndIf
    Next
    Next
    EndSelect
    WEnd

    [/autoit]

    nur das problem ist es das er nicht in die nächste schleife will
    im anhang sind noch 2 beispiel texte

    Einmal editiert, zuletzt von H1tsugaya (2. November 2009 um 07:25)

    • Offizieller Beitrag

    ?( Sorry, aber mit deiner Erklärung kann ich leider nicht viel anfangen. Versuche mal, die Aufgabenstellung Schritt für Schritt darzustellen.
    - Situation vor Start (wie sieht der Text aus)
    - Schritt 1 (was hat/soll sich wie verändern)
    - Schritt 2..n (dito)
    - wie soll das Endergebnis aussehen

  • Also der text ist so auf gebaut das erst so art eine über schrift steht und wenn die checkbox checked ist soll die daten von dieser überschrift herausgegeben werden. Da aber immer neue Datein reinkommen muss das dynamisch sein. Je mehr Datein desti mehr Tabs.

    Hier ist der script mit Beschreibung

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <file.au3>
    #include <array.au3>

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

    Global $aArray
    Global $text
    Global $htab
    Global $htabtext [10]
    Global $hchks1[10][30]
    Global $hchks2[10][30]

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

    GUISetBkColor(0x00E0FFFF)
    GUISetFont(9, 300)

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

    GUICreate("Test", 450, 415)
    Global $zeigen = GUICtrlCreateButton("Zeigen",350, 390, 100)
    $htab = GUICtrlCreateTab(10, 10, 435, 380)
    GUISetState(@SW_SHOW)

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

    $ordner = _FileListToArray(@ScriptDir & "\ordner\" , "*.txt", 1) ; Hier werden die Text Daten eingelessen

    For $text = 1 To $ordner[0]


    $FileToRead = @ScriptDir & $ordner & "\" & $ordner[$text]
    $htabtext[$text] = GUICtrlCreateTabItem($ordner[$text]) ; Hier so für jeder Text Datei ein Tab gemacht werden

    Next

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

    If _FileReadToArray($FileToRead,$aArray) Then

    For $zeile1 = 1 To $aArray[0]
    $ausgabe = StringSplit($aArray[$zeile1], ";") ; Hier soll die Text Datei gesplittet werden beim ;

    $i = Int(($pc + 9) / 10) * 80
    $j = Mod(($pc + 9), 10) * 25 + 80
    $hchks1[$text][$zeile1] = GUICtrlCreateCheckbox("" & $ausgabe[1], $i,$j ) ; Hier soll eine checkbox erstellt werden und den namen von der ersten Spallte der Arrays habe
    $hchks2[$text][$zeile1] = $ausgabe[2])
    Next
    EndIf
    GUICtrlCreateTabItem("")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    case $msg = $zeigen
    for $text = 1 to $ordner[0]

    For $zeile1 = 1 to 29
    if BITAND(GUICtrlRead($hchks1[$text][$zeile1]),$GUI_CHECKED) = $GUI_CHECKED Then ;was gecheckt ist soll denn ausgeben werder aber nur die daten also 2. Spalte
    msgbox( 64,"",$hchks2)

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


    EndIf
    Next
    Next
    EndSelect
    WEnd

    [/autoit]
  • Hi,
    nachdem ich ca 10 Syntaxfehler berichtigt hatte, stehe ich nun vor einer Reihe Logikprobleme.
    WAS soll das Script eigentlich genau machen?
    Wieso stellst du nicht das komplette Script, sondern nur einen Ausschnitt ein?
    Die Variable $pc in Zeile 37 z.B. wurde weder irgendwo definiert noch vorher benutzt....

    Andy

    • Offizieller Beitrag

    Je mehr Datein desti mehr Tabs.


    Bevor ich mir das im Detail anschaue eine Anmerkung.
    Das Konzept ist unglücklich gewählt. Für eine dynamische Anzahl von Dateien Tabs zu erstellen wird sehr unübersichtlich.
    Ich schlage dir vor, verwende lieber ein Listview mit Checkbox. (Checkbox nicht zwingend, kannst auch Klick auf Eintrag auswerten)
    - alle Dateinamen in Listview laden
    - wenn du eine Checkbox aktivierst (auf Eintrag klickst) wird die Datei zur Bearbeitung geladen
    - die Checkbox anschließend disablen, damit keine Doppelbearbeitung möglich ist (alternativ: Datei nach Bearbeitung aus dem Listview entfernen)
    - zur Bearbeitung der einzelnen Files kannst du wiederum mit einem Listview arbeiten
    - dort setzt du die ersten Teile des Splits als Einträge
    - klickst du auf einen dieser Einträge, kannst du den zugehörigen Part z.B. in einem Edit od. einer MsgBox od. was auch immer anzeigen lassen

  • Habs jetzt mal so wie ich denke dass es geplant war^^

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <file.au3>
    #include <array.au3>

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

    Global $aArray
    Global $text
    Global $htab
    Global $htabtext [10]
    Global $hchks1[10][30]
    Global $hchks2[10][30]
    Global $pc[100]
    GUISetBkColor(0x00E0FFFF)
    GUISetFont(9, 300)

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

    GUICreate("Test", 450, 415)
    Global $hbtnWakeUp = GUICtrlCreateButton("Aufwecken",350, 390, 100)
    $htab = GUICtrlCreateTab(10, 10, 435, 380)
    GUISetState(@SW_SHOW)

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

    $ordner = _FileListToArray(@ScriptDir, "testdatei*.txt", 1)
    _arraydisplay($ordner)

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

    For $text = 1 To $ordner[0]


    $FileToRead = @ScriptDir & $ordner & "\" & $ordner[$text]
    $htabtext[$text] = GUICtrlCreateTabItem($ordner[$text])

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

    If _FileReadToArray($FileToRead,$aArray) Then
    $pc[$text]=$aarray[0]
    MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$pc' & @lf & @lf & 'Return:' & @lf & $pc) ;### Debug MSGBOX

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


    ; MsgBox(0,"filetoread",$FileToRead)
    For $zeile1 = 1 To $aArray[0]
    $ausgabe = StringSplit($aArray[$zeile1], ";")
    ; _arraydisplay($aarray)
    $i = 50
    $j = 30+$zeile1 *25
    $hchks1[$text][$zeile1] = GUICtrlCreateCheckbox("" & $ausgabe[1], $i,$j )
    ; MsgBox(64,"",$ausgabe[1])
    $hchks2[$text][$zeile1] = $ausgabe[2]
    ; MsgBox(0,"", $hchks2[$text][$zeile1])
    Next
    EndIf
    Next

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

    GUICtrlCreateTabItem("")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    case $msg = $hbtnWakeUp
    for $raum = 1 to $ordner[0]

    For $pc_nummer = 1 to $pc[$raum]
    if BITAND(GUICtrlRead($hchks1[$raum][$pc_nummer]),$GUI_CHECKED) = $GUI_CHECKED Then
    msgbox( 64,"",$hchks2[$raum][$pc_nummer])

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


    EndIf
    Next
    Next
    EndSelect
    WEnd

    [/autoit]

    Testdatei1:

    Zitat

    1;Eins
    2;Zwei
    3;Drei
    4;vier
    5;fünf


    Testdatei2:

    Zitat

    Mo;Montag
    Di;Dienstag
    Mi;Mittwoch

    Falls der Ablauf wirklich so sein sollte, dann würde ich allerdings anhand der maximalen Anzahl der Rechner in den einzelnen Räumen die GUI aufbauen.

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (30. Oktober 2009 um 09:55)

  • nur zur kurzen Erklärung, der Ausdruck ($i>10) liefert für alle $i>10 EINS und ansonsten NULL

    für 2 Spalten a 15 Rechner

    [autoit]

    guicreate("")
    dim $pc[31] ;anzahl Rechner+1
    For $i = 1 To 30 ;2 spalten
    $pc[$i] = GUICtrlCreateCheckbox($i, 10 + (($i > 15) * 40), 30 + ($i - (($i > 15) * 15)) * 20)
    Next
    guisetstate()
    sleep(3000)

    [/autoit]


    für 3 Spalten a 10 Rechner

    [autoit]

    guicreate("")
    dim $pc[31] ;anzahl Rechner+1
    For $i = 1 To 30
    $pc[$i] = GUICtrlCreateCheckbox($i, 10 + ((($i > 10)+($i>20)) * 40), 30 + ($i - (($i > (($i>20)+1)*10) * (($i>20)+1)*10)) * 20)
    Next
    guisetstate()
    sleep(3000)

    [/autoit]

    nicht vergessen DIM $pc[31] usw anpassen, ggf eine Variable $anzahl_pcs= erstellen

  • Ich habe meins mall überarbeitet, da kam gleich schon der nächste fehler. Die Checkboxen kammen nur in einen Tab und die anderen Tabs waren leer

    Hier ist das überarbeitet:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <file.au3>
    #include <array.au3>

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

    Global $aArray
    Global $textdata
    Global $htab
    Global $htabtext[10]
    Global $hchks1[10][30]
    Global $hchs2[10][30]

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

    GUISetBkColor(0x00E0FFFF)
    GUISetFont(9, 300)

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

    GUICreate("test", 450, 415)
    Global $hbtnZeigen = GUICtrlCreateButton("Zeigen",350, 390, 100)

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

    $htab = GUICtrlCreateTab(10, 10, 435, 380)
    GUISetState(@SW_SHOW)

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

    $ordner = _FileListToArray(@ScriptDir & '\Ordner\' , '*.txt', 1); Hier werden die Text Daten eingelessen

    For $textdata = 1 To $ordner[0]
    $FileToRead = @ScriptDir & '\Ordner\' & $ordner[$textdata]
    $htabtext[$textdata] = GUICtrlCreateTabItem($ordner[$textdata]) ; Hier so für jeder Text Datei ein Tab gemacht werden

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

    Next

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

    _FileReadToArray($FileToRead,$aArray)

    For $s1 = 1 To $aArray[0]
    $ausgabe = StringSplit($aArray[$s1], ";"); Hier soll die Text Datei gesplittet werden beim
    $i = Int(($s1 + 9) / 10) * 80
    $j = Mod(($s1 + 9), 10) * 25 + 80
    $hchks1[$textdata][$s1] = GUICtrlCreateCheckbox("" & $ausgabe[1], $i,$j ); Hier soll eine checkbox erstellt werden und den namen von der ersten Spallte der Arrays habe
    $hchs2[$textdata][$s1] = $ausgabe[2]
    Next
    GUICtrlCreateTabItem("")

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    case $msg = $hbtnZeigen
    for $textdata = 1 to $ordner[0]

    For $s1 = 1 to 29
    if BITAND(GUICtrlRead($hchks1[$textdata][$s1]),$GUI_CHECKED) = $GUI_CHECKED Then ;was gecheckt ist soll denn ausgeben werder aber nur die daten also 2. Spalte

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

    MsgBox(64,"",$hchs2[$textdata][$s1])

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


    EndIf
    Next
    Next
    ;
    EndSelect
    WEnd

    [/autoit]
  • Zitat

    Ich habe meins mall überarbeitet, da kam gleich schon der nächste fehler

    wenn du hier Threads erstellst die definitiv "HILFE" im Titel haben und dann nicht mal die Scripte anschaust bzw ausprobierst, welche FUNKTIONIEREN ( ! ) dann besteht wohl auch kein weiterer Grund hier Antworten zu geben....

    Zitat

    Die Checkboxen kammen nur in einen Tab und die anderen Tabs waren leer

    Hättest du dir das Script von mir im Post von 9:42 Uhr mal angeschaut, dann hättest du gesehen, was ich geändert habe, damit genau DAS nicht passiert..

  • Ich habe ja auch die scripts von den anderen aus probiert nur bei mir gingen manche nicht. Ich habe auch versucht die Lösungsvorschläge bzw Lösungswege mit einzubauen aber wenn ich ein lösungsweg genommen habe ging was andees wiederrum nicht. Ich habe ja auch nicht so viel anung von Autoit das kann sein das ich auch die Lösungswege falsch zusammen gebaut habe.

  • Zitat

    Ich habe ja auch die scripts von den anderen aus probiert nur bei mir gingen manche nicht

    Kann sein daß mein Browser nicht richtig funktioniert und nur die Hälfte aller Postings hier im Thread anzeigt, aber so wie ich das hier sehe habe nur ich Scripte gepostet, und wenn die nicht funktionieren, dann sollte man mir das mitteilen^^
    Da diese Scripte aber alle funktionieren werde ich mich jetzt hier ausklinken.

    Zitat

    ch habe ja auch nicht so viel anung von Autoit das kann sein das ich auch die Lösungswege falsch zusammen gebaut habe.

    Man stellt deshalb eine Frage weil man etwas nicht versteht. Wenn man die Antwort auch nicht versteht, dann muss man so lange weiterfragen, bis man es begriffen hat. Das ist nicht schlimm, sondern zeigt, daß man sich mit dem Problem konstruktiv auseinander setzen möchte! Wenn aber der Eindruck entsteht, daß du nicht auf die Antworten eingehst, dann musst du dich nicht wundern, wenn du irgendwann keine Antworten mehr bekommst....

  • Ich habe es gelöst dank Andys Script ich musste es nur erstmall verstehen. Wieso es bei mir nicht ging die Antwort war das ich bei der Zeile wo ich die Daten ausgelesen hatte, hat der Andy die Zeile umgeändert was ich anfangs nicht bemerkt hatte.

    Aber trots allem Danke für die Hilfe