INI-Datei sektionsweise aktualisieren

  • Hallo,

    irgendwie stehe ich grad ein wenig auf dem Schlauch - könnte an der Hitze liegen *G*

    Ich habe ein Listview mit einer Combobox.
    Je nach Combowert (feste Anzahl: 4 mit festen Werten/Kürzeln) soll die Listview mit den Werten aus einer entsprechenden Datei (ebenso Anzahl: 4) gefüllt werden (darin stehen jeweils 5 durch ";" getrennte Werte). Das ist kein großes Thema.
    Diese Listen sind unterschiedlich groß und der erste Wert in dieser Datei ist das Datum der Daten, um zu sehen von wann diese sind.

    Ich möchte nun diese 4 Listen/Dateien am liebsten in einer INI-Datei zusammenfassen, wobei aber die Daten entsprechend ein unterschiedliches Aktualisierungsdatum haben können und die evtl. Änderungen der ausgewählten Listview gespeichert werden können.
    Da diese aber immer nur ein Teil, der dann erhältlichen/zusammengefassten INI anzeigt, weiss ich nicht, wie ich die alte Sektion aus der zusammengefassten INI raus und in die neue rein soll (sofern ich auf den Speichern-Knopf drücke)

    Ist das überhaupt verständlich, was ich da geschrieben habe??

  • Da gibt es noch nicht viel, außer daß bei Combochange die Datei ins Listview geladen wird.
    Mir geht es ja um das Speichern aller ListView-Inhalte in eine Datei - und neues Einlesen des entsprechenden "Datei-Blocks" wenn ComboChange.
    Hier habe ich eine komplette Logik-"Blockade"

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>

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

    #Region ### START Koda GUI section ###
    $Form1 = GUICreate("Ranked", 424, 486, 192, 124)
    $Combo1 = GUICtrlCreateCombo("", 24, 448, 89, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
    GUICtrlSetData(-1, "SP|RU|AL|EF", "SP")
    $ListView1 = GUICtrlCreateListView("Name|Vorname|Ranking|TopOrder|Verified", 24, 8, 377, 433)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 120)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 80)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 60)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 60)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 4, 55)
    $Button1 = GUICtrlCreateButton("Save", 136, 446, 73, 25)
    $Label1 = GUICtrlCreateLabel("Datum:", 232, 448, 126, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Combo1
    ComboChange()
    EndSwitch
    WEnd

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

    Func ComboChange()
    Local $aCombo = GUICtrlRead($Combo1)
    Local $sAdr = (@ScriptDir & "\" & $aCombo & ".txt")
    Local $h = FileOpen($sAdr, 0)
    Local $aArray1 = _CSV2Array($h, ";", False, 2)

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

    If IsArray($aArray1) Then
    GUICtrlSetData($Label1, "Datum: " & $aArray1[0][0])
    ;_ArrayDisplay($aArray1)

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

    For $i=1 To UBound($aArray1)-1
    GUICtrlCreateListViewItem($aArray1[$i][0] & "|"& $aArray1[$i][1]& "|"& $aArray1[$i][2]& "|"& $aArray1[$i][3]& "|"& $aArray1[$i][4], $ListView1)
    Next

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

    EndIf
    EndFunc

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

    ; #FUNCTION# ===================================================================
    ; Name ..........: _CSV2Array
    ; Description ...:
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True[, $iColumnMode = 0]]])
    ; Parameter(s): .: $hFile - Handle for the CSV file to Read
    ; $cSeperator - Optional: (Default = "auto") : Tries to find the separator char ;) or , or TAB or | or space)
    ; | Data-seperator-char
    ; | Empty-string = Opt("GUIDataSeparatorChar")
    ; $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
    ; $iColumnMode - Optional: (Default = 0) :
    ; | 0: Sets error if lines have different columns and @extended to the csv-line number
    ; | 1: returns lines with different columns numbers comparing to the first line, too
    ; | 2: removing all columns > column numbers in the first line
    ; Return Value ..: Success - 2-dim Array
    ; Failure - 0
    ; @ERROR - 1: error file read
    ; @ERROR - 2: different number of columns / @EXTENDED = CSV-line
    ; - 3: parameter error
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Mon Dec 07 18:54:35 CET 2009
    ; ==============================================================================
    Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)

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

    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")

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

    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
    $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
    $aLines = StringSplit($s, @CR)
    Else
    $aLines = StringSplit($s, @LF)
    EndIf

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

    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
    Local $iMax = 0
    Local $iC[5] = [0, 0, 0, 0, 0]
    Local $sC[5] = [";", ",", @TAB, "|", " "]

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

    $aTMP = StringRegExp($aLines[1], ";", 3)
    If Not @error Then $iC[0] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], ",", 3)
    If Not @error Then $iC[1] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\t", 3)
    If Not @error Then $iC[2] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\|", 3)
    If Not @error Then $iC[3] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "[ ]", 3)
    If Not @error Then $iC[4] = UBound($aTMP)

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

    For $i = 0 To UBound($sC) - 1
    If $iC[$i] > $iMax Then
    $iMax = $iC[$i]
    $cSeperator = $sC[$i]
    EndIf
    Next
    EndIf

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

    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]

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

    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
    $aTMP = StringSplit($aLines[$i], $cSeperator)
    If @error Then ContinueLoop
    If $aTMP[0] > $iCol Then
    Switch $iColumnMode
    Case 0
    Return SetError(2, $i)
    Case 1
    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
    Case 2
    $aTMP[0] = $iCol
    Case Else
    Return SetError(3)
    EndSwitch
    EndIf
    For $j = 1 To $aTMP[0]
    $aTMP[$j] = StringStripWS($aTMP[$j], 3)
    If $bFilterString Then ; removing leading and trailing " or '
    $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')
    EndIf
    $aRet[$i - 1][$j - 1] = $aTMP[$j]
    Next ; /cols
    Next ; /lines

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

    Return $aRet
    EndFunc ;==>_CSV2Array

    [/autoit]

    Eine .txt-Datei hat immer folgendes Format (Länge variiert):

    Spoiler anzeigen


    29.06.2012;;;;
    Müller;Michel;12;14;yes
    Maier;Bernd;1;12;yes
    Becker;Peter;17;1;no

    sind jetzt willkürliche Daten, Alles noch am Anfang.