Tabelle zur Eingabe

  • Hey Leute,
    ich würde gerne eine Reihe von Eingaben schön darstellen. Ich weiß nicht genau, wie ich es erklären soll :D
    Ich habe mir überlegt das in einer Tabelle wie folgt darstellen zu lassen:

    [BILD] Siehe Anhang ;) [/BILD]

    Das soll also in der GUI so in etwa dargestellt sein und in der rechten Spalte soll der User dann die jeweiligen Eingaben tätigen, die das Programm dann auslesen soll.
    Ich habe gedacht das geht mit einer ListView aber da kann man in die Zeilen nichts hineinschreiben und außerdem stört mich die Leiste über der ersten Zeile.

    Ich hoffe ihr könnt mir trotz dürftiger Erklärung helfen :D
    Danke
    DFPWare

    • Offizieller Beitrag

    ch habe gedacht das geht mit einer ListView aber da kann man in die Zeilen nichts hineinschreiben und außerdem stört mich die Leiste über der ersten Zeile.


    Beides falsch.
    Sieh dir mal die Styles zum Listview an, da kannst du die Header ausblenden. Auch Editieren ist per Style möglich. Allerdings in begrenztem Umfang. Für volles Editieren der SubItem findest du hier oder im EN-Forum Lösungen.

  • Also die Leiste entfernt hab ich jetzt, aber das editieren....
    Ich hab es mit dem Style versucht, mit dem man aber nur die linke Spalte editieren kann.
    Also hab ich im englischen Forum geguckt und tatsächlich etwas gefunden, was aber sehr viel Code ist und ich will dem armen Mann seine Funktionen auch nicht klauen, deshalb wollte ich mal fragen, ob die Funktionen WM_NOTIFY und WM_COMMAND von ihm sind, oder in irgendeiner UDF schon existieren.
    Hier das Beispiel von rasim aus dem englischen Forum:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GuiEdit.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include <WinAPI.au3>

    [/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]

    For $i = 1 To 10
    _GUICtrlListView_AddItem($hListView, "Item " & $i)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, "SubItem " & $i, 1)
    Next

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

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

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

    GUISetState()

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/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)

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

    If ($aHit[0] <> -1) And ($aHit[1] = 0) Then
    $Item = $aHit[0]
    $SubItem = 0
    Local $aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
    ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then
    $Item = $aHit[0]
    $SubItem = $aHit[1]
    Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
    Else
    Return $GUI_RUNDEFMSG
    EndIf

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

    Local $iItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
    Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iItemText)
    $hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 3, $aRect[1], $iLen + 10, 17, $Style)

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

    _GUICtrlEdit_SetSel($hEdit, 0, -1)
    _WinAPI_SetFocus($hEdit)
    $hDC = _WinAPI_GetWindowDC($hEdit)
    $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
    FrameRect($hDC, 0, 0, $iLen + 10 , 17, $hBrush)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
    Local $stRect = DllStructCreate("int;int;int;int")

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

    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)

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

    $Item = -1
    $SubItem = 0
    EndSwitch
    EndSwitch

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

    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]


    Ich hoffe ich darf das hier posten, ansonsten könnt ihr das ruhig rauseditieren ;)
    Danke
    DFPWare

    • Offizieller Beitrag

    Statt des Listviews würde ich mir lieber eine Pseudo-Tabelle (mit Label und Input) basteln.
    Das lässt sich viel leichter handhaben, IMHO.
    Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    Global $aIDInput[6]
    Global $aText[6] = ['Stromstärke', 'X-KOO', 'Y-KOO', 'Z-KOO', 'Windungen', 'Seitenlänge']
    $hGui = GUICreate('Test', 300, 200)
    GUISetFont(10, 400, 0, 'Arial')
    For $i = 0 To 5
    GUICtrlCreateLabel($aText[$i], 10, 10 + $i * 20, 120, 20, Default, $WS_EX_CLIENTEDGE)
    $aIDInput[$i] = GUICtrlCreateInput('', 130, 10 + $i * 20, 120, 20)
    Next
    GUISetState()
    Do
    Until GUIGetMsg() = -3

    [/autoit]

    Edit: Da fehlte noch die Zuweisung zu dem Array $aIDInput[$i].