Arrayeinträge bearbeitbar in Gui darstellen

  • Hallo zusammen!

    Soeben bin ich in meinem Programm an einen Punkt gestoßen, bei dem ich nicht sicher bin, wie man das Problem mit AutoIT am elegantesten lösen könnte.
    Und zwar habe ich ein mehrdimensionales Array, welches ich "bearbeitbar" machen möchte.

    Die Inhalte dieses Arrays sollen in einer Gui (ähnlich wie bei _ArrayDisplay, vielleicht noch mit spezieller Beschriftung der Spaltenüberschriften sowie regelbaren Spaltenbreiten) dargestellt werden.
    Der Benutzer soll dann eine Zeile anklicken können und über einen "Bearbeiten"-Button könnte die gesamte Maske bearbeitbar werden, so dass man Änderungen vornehmen kann.
    Über einen "Speichern"-Button könnten die Feldinhalte dann neu eingelesen und neu in das Array geschrieben werden.

    Sollte dieses so einfach nicht möglich sein, so wäre bei einem Klick auf den "Bearbeiten"-Button auch denkbar, dass die Einträge des angeklickten Arrays in eine neue Gui geladen werden und dieses Arrayelement separat abgehandelt wird.
    Gibt es da evtl. schon vorgefertigte Codeschnippsel? Es muss ja gar nicht groß optisch hergemacht werden, eine leicht aufpolierte _ArrayDisplay-Ansicht würde mir ja schon reichen. ;)

    Danke schon mal vorab.
    Grüße

  • Schau dir mal WM_Notify und GuiCtrllistview an.
    Die Funktion _arrayDisplay erstellt auch nur ein GUI mit einem Listview und lädt das Array dann in das Listview.
    Du könntest dasselbe machen, nur eben mit dem WM_Notify einen z.B. Rechtsklick abwarten, dann das Item bearbeiten, und es dann in das Array schreiben.
    Ich schau mal ob ich sowas gebastelt bekomme

  • Danke schon mal für den Hinweis.
    Werde aber vermutlich erst heute Abend oder morgen im Laufe des Tages dazu kommen, mich im Detail einzulesen. Werde aber davon hier berichten :)

  • Hier gibt's ein schönes Beispiel.

  • Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    Opt("GuiCloseOnESC", 0)
    Global $avArray[10][2]
    For $i = 0 To 9
    $avArray[$i][0] = "Item "&$i
    $avArray[$i][1] = "SubItem "&$i
    Next

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

    Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0

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

    Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)

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

    $hGUI = GUICreate("ListView Subitems edit in place", 300, 200)

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

    $hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_GRIDLINES)

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

    _GUICtrlListView_AddArray($hListView, $avArray)

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    GUISetState()

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

    Do

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

    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iCode

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")

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

    Switch $hWndFrom
    Case $hListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If $aHit[0] <> -1 Then
    $Item = $aHit[0]
    $SubItem = $aHit[1]
    Local $iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
    Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
    Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
    $hEdit = _GUICtrlEdit_Create($hGUI, $iSubItemText, $aRect[0] + 6, $aRect[1], $iLen + 10, 17, $Style)
    _GUICtrlEdit_SetSel($hEdit, 0, -1)
    _WinAPI_SetFocus($hEdit)
    $hDC = _WinAPI_GetWindowDC($hEdit)
    $hBrush = _WinAPI_CreateSolidBrush(0)
    FrameRect($hDC, 0, 0, $iLen + 10 , 17, $hBrush)
    EndIf
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
    Local $stRect = DllStructCreate("int;int;int;int")
    DllStructSetData($stRect, 1, $nLeft)
    DllStructSetData($stRect, 2, $nTop)
    DllStructSetData($stRect, 3, $nRight)
    DllStructSetData($stRect, 4, $nBottom)

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

    DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
    EndFunc

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

    Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $iCode = BitShift($wParam, 16)

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

    Switch $lParam
    Case $hEdit
    Switch $iCode
    Case $EN_KILLFOCUS
    Local $iText = _GUICtrlEdit_GetText($hEdit)
    _GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_ReleaseDC($hEdit, $hDC)
    _WinAPI_DestroyWindow($hEdit)
    $avArray[$Item][$SubItem] = $iText
    $Item = -1
    $SubItem = 0
    _ArrayDisplay($avArray)
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Der meiste Code kommt von HIER

    Habe es nur an ein Array angepasst. Einfach mal Doppelklick auf ein Item, dann siehste was sich ändert ;)

  • Hey BugFix,

    dein Script ist ja genau das was ich gesucht habe :)
    Super umgesetzt, arbeitet wie gedacht.
    Ist aber ne tolle Community hier, hätte ich gar nicht gedacht!! :thumbup:

    Grüße