Problem mit ListView - Anzahl Einträge

  • Hallo Leute,

    ich sitze derzeit an einem Log-Viewer welcher deine .txt-Datei ausliest & den Zeilen entsprechend ausgibt.

    Hier erstmal mein aktuelles Script:

    Spoiler anzeigen
    [autoit]

    #RequireAdmin

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <MsgBoxConstants.au3>
    #include <ComboConstants.au3>
    #include <EditConstants.au3>
    #include <Array.au3>
    #include <GuiComboBox.au3>

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

    Opt("GUIResizeMode",$GUI_DOCKALL)

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

    #Region ### START Koda GUI section ### Form=
    $Window_Title = GUICreate("D2BS Tornister", 1027, 451, 254, 124)
    $iListview = GUICtrlCreateListView("", 10, 10, 1000, 390)
    $button_reload = GUICtrlCreateButton("Reload", 826, 416, 65, 25)
    $button_autoReload = GUICtrlCreateButton("Start Auto-Reload", 896, 416, 105, 25)
    $button_open = GUICtrlCreateButton("Open", 756, 416, 65, 25)
    $comboAction = GUICtrlCreateCombo("All", 16, 416, 121, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    $comboType = GUICtrlCreateCombo("All", 160, 416, 121, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    $comboEntrys = GUICtrlCreateCombo("10", 304, 416, 129, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    $inputSearch = GUICtrlCreateInput("Input1", 448, 416, 129, 21)
    $buttonSearch = GUICtrlCreateButton("Search", 592, 415, 69, 25)
    GUISetState(@SW_SHOW)
    GUICtrlSetState($button_reload, $GUI_DISABLE)
    GUICtrlSetState($button_autoReload, $GUI_DISABLE)
    GUICtrlSetData($inputSearch, '')
    #EndRegion ### END Koda GUI section ###

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

    _GUICtrlListView_AddColumn($iListview, "Zeit", 100)
    _GUICtrlListView_AddColumn($iListview, "Aktion", 100)
    _GUICtrlListView_AddColumn($iListview, "Typ", 100)
    _GUICtrlListView_AddColumn($iListview, "Name", 100)
    _GUICtrlListView_AddColumn($iListview, "Area", 100)
    _GUICtrlListView_AddColumn($iListview, "Beschreibung", 278)

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

    Global $sFilePath = RegRead("HKEY_CURRENT_USER\Software\Loginator", "Path")
    Global $tStart
    Global $tStatus = '0'
    Global $vActionArray
    Global $vTypeArray
    Global $vCountEntry[1]
    Global $vFirstTime = 1
    Global $counter = 0

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

    if($sFilePath <> '') Then
    _readFile()
    GUICtrlSetState($button_reload, $GUI_ENABLE)
    GUICtrlSetState($button_autoReload, $GUI_ENABLE)
    EndIf

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

    _ArrayAdd($vCountEntry, '10')
    _ArrayAdd($vCountEntry, '20')
    _ArrayAdd($vCountEntry, '30')
    _ArrayAdd($vCountEntry, '40')
    _ArrayAdd($vCountEntry, '50')
    _ArrayAdd($vCountEntry, '100')
    _ArrayAdd($vCountEntry, 'All')

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

    GUICtrlSetData($comboEntrys, _ArrayToString($vCountEntry))
    _GUICtrlComboBox_SelectString($comboEntrys, '10')

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

    While 1
    $nMsg = GUIGetMsg()

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

    Switch $nMsg

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

    Case $comboAction
    _readFile()

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

    Case $comboType
    _readFile()

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

    Case $comboEntrys
    _readFile()

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

    Case $buttonSearch
    $vFilter3 = StringLower(GuiCtrlRead($inputSearch))
    _readFile()

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

    Case $GUI_EVENT_CLOSE
    $hFileOpen = ""
    if($hFileOpen <> "") Then
    FileClose($hFileOpen)
    EndIf
    Exit

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

    Case $button_reload
    _readFile()

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

    Case $button_autoReload
    If(GUICtrlRead($button_autoReload) == "Stop Auto-Reload") Then
    GUICtrlSetData($button_autoReload, 'Start Auto-Reload')
    GUICtrlSetState($button_reload, $GUI_ENABLE)
    $tStatus = '0'
    Else
    GUICtrlSetData($button_autoReload, 'Stop Auto-Reload')
    GUICtrlSetState($button_reload, $GUI_DISABLE)
    $tStatus = '1'
    $tDiff = TimerInit()
    EndIf

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

    Case $button_open
    $sFilePath = FileOpenDialog("Open Log", @WorkingDir, "Textdateien (*.txt)")
    if($sFilePath <> '') Then
    RegWrite("HKEY_CURRENT_USER\Software\Loginator", "Path", "REG_SZ", $sFilePath)
    EndIf
    GUICtrlSetState($button_reload, $GUI_ENABLE)
    GUICtrlSetState($button_autoReload, $GUI_ENABLE)
    _readFile()

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

    EndSwitch

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

    if($tStatus = 1) Then
    if TimerDiff($tStart) > 300000 Then
    _GUICtrlListView_DeleteAllItems($iListview)
    _readFile()
    $tStart = TimerInit()
    EndIf
    EndIf

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

    WEnd

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

    Func _readFile()
    _GUICtrlListView_DeleteAllItems($iListview)
    $vActionArray = 0
    $vTypeArray = 0
    Global $vActionArray[1]
    Global $vTypeArray[1]
    _ArrayAdd($vTypeArray, 'All')
    _ArrayAdd($vActionArray, 'All')
    Global $hFileOpen = FileOpen($sFilePath)

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

    If $hFileOpen = -1 Then
    Return False
    Else
    Global $vFileSize = _FileCountLines ( $sFilePath )
    _GUICtrlListView_SetItemCount($iListview, $vFileSize)
    Global $aItems[$vFileSize+1][6]

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

    For $iI = 1 To UBound($aItems) - 1
    Global $sFileRead = FileReadLine($hFileOpen, $iI)

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

    Global $lineItem = StringSplit($sFileRead, "_")

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

    if($lineItem[3] == GuiCtrlRead($comboAction) or GuiCtrlRead($comboAction) == 'All') Then
    if($lineItem[4] == GuiCtrlRead($comboType) or GuiCtrlRead($comboType) == 'All') Then
    if(_elementExists($lineItem, 7)) Then
    if(StringInStr($lineItem[7], StringLower(GuiCtrlRead($inputSearch))) > 0 or GuiCtrlRead($inputSearch) == '') Then
    _buildOutput($iI)
    EndIf
    Else
    if(GuiCtrlRead($inputSearch) == '') Then
    _buildOutput($iI)
    EndIf
    EndIf
    EndIf
    EndIf

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

    Next
    _buildLayout()
    FileClose($hFileOpen)
    EndIf
    EndFunc

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

    Func _buildOutput($i)
    $aItems[$i][0] = $lineItem[1]
    $aItems[$i][1] = $lineItem[3]
    If(_ArraySearch($vActionArray, $lineItem[3]) < 0) Then
    _ArrayAdd($vActionArray, $lineItem[3])
    EndIf
    $aItems[$i][2] = $lineItem[4]
    If(_ArraySearch($vTypeArray, $lineItem[4]) < 0) Then
    _ArrayAdd($vTypeArray, $lineItem[4])
    EndIf
    $aItems[$i][4] = $lineItem[5]
    If _elementExists($lineItem, 7) Then
    $aItems[$i][5] = $lineItem[7]
    Else
    $aItems[$i][5] = ''
    EndIf
    EndFunc

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

    Func _buildLayout()

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

    _clearEmpty('0')

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

    If($vFileSize > GuiCtrlRead($comboEntrys) and GuiCtrlRead($comboEntrys) <> 'All') then
    For $i = UBound($aItems) - 1 to 0 Step -1
    If ($i < $vFileSize- GuiCtrlRead($comboEntrys)) Then
    _ArrayDelete($aItems, $i)
    EndIf
    Next
    EndIf

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

    _ArrayDisplay($aItems)

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

    _GUICtrlListView_AddArray($iListview, $aItems)

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

    If($vFirstTime == 1) Then
    GUICtrlSetData($comboType, _ArrayToString($vTypeArray))
    GUICtrlSetData($comboAction, _ArrayToString($vActionArray))
    $vFirstTime = 0
    Endif

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

    If(GuiCtrlRead($comboAction) == '') then
    GuiCtrlSetData($comboAction, 'All')
    EndIf

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

    If(GuiCtrlRead($comboType) == '') then
    GuiCtrlSetData($comboType, 'All')
    EndIf

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

    _GUICtrlListView_SetColumnWidth($iListview, 0, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListview, 1, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListview, 2, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListview, 3, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListview, 4, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListview, 5, $LVSCW_AUTOSIZE)
    ;_GUICtrlListView_Scroll($iListview, 0, $vFileSize*20)
    EndFunc

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

    Func _elementExists($array, $element)
    If $element > UBound($array)-1 Then Return False ; element is out of the array bounds
    Return True ; element is in array bounds
    EndFunc

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

    Func _clearEmpty($row)
    For $i = UBound($aItems) - 1 To 0 Step -1
    If ($aItems[$i][$row] == '') Then
    _ArrayDelete($aItems, $i)
    EndIf
    Next
    EndFunc

    [/autoit]

    Test-Daten:

    Spoiler anzeigen

    Jede dieser Zeilen in der .txt (Testdaten) entspricht 1nem Datensatz. Die Ausgabe in der GUI mit mehr Daten schaut so aus:
    http://prntscr.com/484pp7

    Nun habe ich bereits folgendes gemacht: Mit der linken Combobox lassen sich die verschiedenen Arten unter "Aktion" filtern, mit der 2ten Combobox die verschiedenen Arten der Items Mit dem Input wird der Inhalt der Beschreibung nach dem eingegebenen Begriff durchsucht & ebenfalls ausgefiltert. Also NUR die Daten werden angezeigt, welche den 3 Filtern entsprechen. Die 3te Combobox soll die Einträge limitieren, welche angezeigt werden. Denn die Datei kann innerhalb von 10 Minuten um hunderte Einträge wachsen & dann brauch das einfach zu lang.

    Das Problem bei der Funktion liegt warscheinlich in Zeile 193-199. Dort überprüfe ich ob die Anzahl der Einträge in der Datei größer ist als die Anzahl der Dateien welche angezeigt werden sollen (Wert der 3. Combobox [10,20,30,40,50,100,Alle] Problem ist nur: Wenn ich nun 16 Einträge habe, und die folgenden auf meine FIlter zutreffen: [1,2,3,6,11,12,13] werden diese richtig angezeigt bei allen FilterWerten über 10. Wenn ich jedoch eine 10 dort auswähle, schmeißt er mir [1,2,3] raus da sie in der Datei NICHT unter den letzten 10 sind. Jedoch möchte ich dass der 10 gefilterte Einträge ausgibt, somit erst ab dem 11. Eintrag welcher zum Filter passt den Cut macht & diese nicht ausgibt. BeispielScreen für das Problem:

    http://prntscr.com/484rsh -> Unter ALLEN Einträgen sind diese dabei die "Keep" unter Beschreibung enthalten.

    http://prntscr.com/484rxj -> Unter den letzten 20 Kompletteinträgen ist das die einzige "Keep" (Falsche Ausgabe), hier möchte ich dass er die letzten 20 Keep-Einträge ausgibt & nicht die letzten 20 filtert.


    Ich hoffe Ihr könnt das nun ein wenig eher & besser verstehen.

    Wäre echt nett wenn sich jemand die Mühe macht & drüberschaut.


    Freundliche & morgendliche Grüße,
    Schrubber

    2 Mal editiert, zuletzt von Schrubber (1. August 2014 um 04:43)

    • Offizieller Beitrag

    Bevor wir uns durch dein Skript wühlen:
    Du weißt, was du da haben willst - wir nicht.
    Also wäre es erst mal sinnvoll uns mitzuteilen
    - ich habe Daten in folgender Struktur...
    - daraus will ich auslesen...
    - mit zusätzlichen Filtern...
    - Ergebnis soll so aussehen...
    DANN haben wir eine grobe Vorstellung, was in deinem Skript passiert. Im Moment müßte ich das Skript Zeile für Zeile durchforsten um auf seine Funktion zu schließen. ;)

  • Achso, alles klar. Erster Post wird editiert :)

    Edit2:

    Habe das Problem gelöst. In meiner bisherigen Vorgangsweise hatte ich den bereits bestehenden Array immer wieder bearbeitet... Die Lösung zum Problem aber war ganz einfach:
    Ein Array mit allen Daten & dann dazu einen filteredArray wo ich nach belieben die Daten reinschreibe & diesen dann ausgebe.... Manchmal liegt die Lösung echt näher als man denkt :)

    Einmal editiert, zuletzt von Schrubber (1. August 2014 um 04:38)