ini datei richtig in array einlesen und editieren

  • meine arraykenntnisse sind doch etwas mangelhaft... ich brauche schon wieder euere hilfe :S
    ich hab meine fragen mal ins script geschrieben:

    [autoit]


    Global $listViewEditor = GuiCtrlCreateListView(" IP/Hostname | Description ", 10, 70, 374, 250, BitOR($WS_VSCROLL,$LVS_EX_BORDERSELECT,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetColumnWidth($listViewEditor, 0, 170)
    _GUICtrlListView_SetColumnWidth($listViewEditor, 1, 180)
    $list456 = Iniread("serverlist.ini" , "serverlist", "servers","")
    $list456 = StringRegExpReplace($list456, '\(', '|')
    $list456 = StringRegExpReplace($list456, '\)', @CRLF) ; <- das klappt nicht. wie bekomme ich einen zeilenumbruch im listview/array hin, so dass an jeder stelle wo eine geschlossene klammer steht das listview eine neue zeile bekommt ...?.
    GUICtrlCreateListViewItem($list456&"|"&$descriptionxx, $listViewEditor)

    [/autoit]

    Wie mache ich die Einträge / Zellen editierbar ? ?(

    thx!

    Einmal editiert, zuletzt von WhiteLion (4. Juni 2010 um 14:45)

    • Offizieller Beitrag

    Hm, die Frage ist, wo du da dein Arrayproblem hast? Ich sehe keines. (Array meine ich)

    Zitat

    Wie mache ich die Einträge / Zellen editierbar ? ?(

    Hab keine Ahnung was du meinst, erkläre mal ein bischen genauer.

  • Hallo White Loin,

    ich glaube hier fehlen uns noch mehr informationen!

    wie sehen die daten in der ini aus? kannst du da mal paar dummie daten bereitstellen?

    wie sollen die daten dann in der listview aussehen?

    ich persönlich hab mit listview noch nichts weiter gemacht, benutze meistens immer eine normale list!

    gruß gmmg

  • [autoit]

    $list456 = StringRegExpReplace($list456, '\)', @CRLF)

    [/autoit]

    Da liegt (wie du schon richtig erkannt hast) das Problem...
    Du könntests das erst mit

    [autoit]

    StringSplit($list456, ")")

    [/autoit]

    zerteilen, und dann in einer For Schleife einzelne Items erstellen, so in etwa wie hier:

    [autoit]

    For $i = 1 To $split[0]
    GUICtrlCreateListViewItem($split[$i]&"|"&$descriptionxx, $listViewEditor)
    Next

    [/autoit]

    Edit: Ich glaub, dafür musst du die Struktur deiner Ini verändern...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • ich habs so mal getestet... leder gehts nicht:
    (349) : ==> Subscript used with non-Array variable.:
    For $i9 = 1 To $split66[0]
    For $i9 = 1 To $split66^ ERROR

    [autoit]

    $h4Gui = GUICreate("Serverlist Editor V1.0", 400, 400, -1, -1, $WS_MINIMIZEBOX)

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

    ;GUICtrlCreatePic(@TempDir&"logo.jpg",10,10,374,55)
    $Label41 = GUICtrlCreateLabel("Note: Press right mousebutton to edit the line", 50, 70)
    Global $hostnamexx, $descriptionxx, $split66
    $QuitEdit = GUICtrlCreateButton("Quit", 140, 340, 112, 25, 0)
    GUISetState()
    Global $listViewEditor = GuiCtrlCreateListView(" IP/Hostname | Description ", 10, 90, 374, 250, BitOR($WS_VSCROLL,$LVS_EX_BORDERSELECT,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetColumnWidth($listViewEditor, 0, 170)
    _GUICtrlListView_SetColumnWidth($listViewEditor, 1, 180)
    $list456 = Iniread("serverlist.ini" , "serverlist", "servers","")
    $list456 = StringRegExpReplace($list456, '\(', '|')
    StringSplit($list456, ")")
    For $i9 = 1 To $split66[0]
    GUICtrlCreateListViewItem($split66[$i9]&"|"&$descriptionxx, $listViewEditor)
    Next
    GUICtrlCreateListViewItem($list456&"|"&$descriptionxx, $listViewEditor)
    While 1
    $nMsg = GUIGetMsg()
    Sleep(20)
    Switch $nMsg
    Case $QuitEdit
    GUISetState(0,$h4Gui)
    ExitLoop
    Case $GUI_EVENT_SECONDARYDOWN
    $hWnd88 = ControlGetHandle('','',$listViewEditor)
    $indx = _GUICtrlListView_SubItemHitTest($hWnd88)
    $newText = InputBox('Change entry', 'Row: ' & $indx[0]+1 & '/Column: ' & $indx[1]+1, _GUICtrlListView_GetItemText($hWnd88, $indx[0], $indx[1]))
    If $newText <> '' Then _GUICtrlListView_SetItemText($hWnd88, $indx[0], $newText, $indx[1])
    EndSwitch
    WEnd

    EndFunc

    [/autoit]


    ziel ist es die ini-datei in die tabelle zu lesen(klappt nicht), editierbar zu machen (klappt), man sollte eine zeile hinzufügen können.
    dann sollte man die ini wieder in gleicher struktur schreiben können.

    hier die serverlist.ini

    Code
    [serverlist]
    servers=www.web.net(Standdart)|127.0.0.1(localhost)|7.0.133.109(Ever)|7.0.133.111(Night)|7.3.247.97|7.1.14.12(steve)|23.23.32.1|blblba.de|(enter infos in brackets )|lecker.no-ip.info(lol)||
    • Offizieller Beitrag

    Hier ist mal ein Beispiel wie es funzt. Du mußt aber meine INIArray_UDF benutzen.

    Spoiler anzeigen
    [autoit]

    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <ListViewConstants.au3>
    #include <GUIConstantsEx.au3>
    #Include <IniArray_UDF.au3>
    $h4Gui = GUICreate("Serverlist Editor V1.0", 400, 400, -1, -1, $WS_MINIMIZEBOX)

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

    ;GUICtrlCreatePic(@TempDir&"logo.jpg",10,10,374,55)
    $Label41 = GUICtrlCreateLabel("Note: Press right mousebutton to edit the line", 50, 70)
    Global $hostnamexx, $descriptionxx, $split66
    $Save= GUICtrlCreateButton("Save", 20, 340, 112, 25, 0)
    $QuitEdit = GUICtrlCreateButton("Quit", 140, 340, 112, 25, 0)
    GUISetState()
    Global $listViewEditor = GuiCtrlCreateListView(" IP/Hostname | Description ", 10, 90, 374, 250, BitOR($WS_VSCROLL,$LVS_EX_BORDERSELECT,$LVS_SINGLESEL,$LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT))
    _GUICtrlListView_SetColumnWidth($listViewEditor, 0, 170)
    _GUICtrlListView_SetColumnWidth($listViewEditor, 1, 180)
    $hWnd88 = GuiCtrlGetHandle( $listViewEditor)
    $list456 = _IniReadArray(@Scriptdir&"\serverlist.ini" , "serverlist", "servers", True)
    If IsArray($list456) Then
    For $i = 1 To $list456[0][0]
    GUICtrlCreateListViewItem($list456[$i][0]&"|"&$list456[$i][1], $listViewEditor)
    Next
    EndIf
    GUICtrlCreateListViewItem($list456&"|"&$descriptionxx, $listViewEditor)
    While 1
    $nMsg = GUIGetMsg()
    Sleep(20)
    Switch $nMsg
    Case $QuitEdit
    GUISetState(0,$h4Gui)
    ExitLoop
    Case $GUI_EVENT_SECONDARYDOWN
    $indx = _GUICtrlListView_SubItemHitTest($hWnd88)
    $newText = InputBox('Change entry', 'Row: ' & $indx[0]+1 & '/Column: ' & $indx[1]+1, _GUICtrlListView_GetItemText($hWnd88, $indx[0], $indx[1]))
    If $newText <> '' Then _GUICtrlListView_SetItemText($hWnd88, $indx[0], $newText, $indx[1])
    Case $Save
    _IniWriteArray(@Scriptdir&"\serverlist.ini" , "serverlist", "servers",_ListViewToArray($hWnd88), True)
    EndSwitch
    WEnd

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

    Func _ListViewToArray($hListView)
    Local $ItemAnzahl = _GUICtrlListView_GetItemCount($hListView)
    Local $aItemArray[$ItemAnzahl + 1][2]
    $aItemArray[0][0] = $ItemAnzahl;
    For $i = 1 To $ItemAnzahl
    $aItemArray[$i] [0]= _GUICtrlListView_GetItemText($hListView, $i - 1, 0)
    $aItemArray[$i] [1]= _GUICtrlListView_GetItemText($hListView, $i - 1, 1)
    Next
    Return $aItemArray;
    EndFunc ;==>_alteUser

    [/autoit]

    PS: Deine alte INI funzt nicht mehr, weil meine Funktion in einem anderen Format schreibt.
    Beispielini angepaßt:

    Code
    [serverlist]
    servers=2D*www.web.net,Standdart|127.0.0.1,localhost|7.0.133.109,Ever|7.0.133.111,Night|7.3.247.97,|7.1.14.12,steve|23.23.32.1,|blblba.de,|lecker.no-ip.info,lol