LV - Editieren SubItem

  • [Edit BugFix: Da sich das zu einem längeren Thread entwickelt, habe ich es aus den Skripten verschoben.]

    Hey,

    das script ist wirklich ne tolle sache, auch das man jetzt das fenster mit ENTER wieder schließen kann.

    Aber eine andere Sache, was mache ich, wenn ich eine leere Zelle editieren will? Dann reagiert das Script leider nicht.
    Kann man da noch was machen?

    Schonmal THX und weiter so =)

    • Offizieller Beitrag

    Aber eine andere Sache, was mache ich, wenn ich eine leere Zelle editieren will? Dann reagiert das Script leider nicht.


    Selbstverständlich kannst du auch leere Zellen editieren.(erstelle doch mal ein paar leere, wirst sehen es geht). Aber du meinst wohl eher nicht existierende Zellen. Die kann man natürlich nicht editieren, die mußt du erst erstellen.

  • das ist ne gute idee.

    mir ist aber noch was aufgefallen.
    wenn ich leere zellen generiere und dort einen doppelklick mache, kommt das Edit-Fenster sofort.
    ist jedoch ein wert in der zelle, poppt das fenster beim ersten doppelklick nur kurz auf, beim 2ten mal funzt es dann richtig.

    kann das wer bestätigen?

    bzw wenn ich nen eintrag mache und dann nochmal editieren will, iwie ...

    • Offizieller Beitrag

    Ich kann das Verhalten nicht bestätigen.
    Ich habe das Skript mal als Bsp. um ein Kontextmenü mit Anhängen, Einfügen, Löschen ergänzt. Das klappt tadellos.

    Spoiler anzeigen
    [autoit]

    #include<StaticConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<ListViewConstants.au3>
    #include<StructureConstants.au3>
    #include<WindowsConstants.au3>
    #include <GUIListView.au3>

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

    Global $hListView, $currentItem[2], $title, $currentOpt[2] = ["none"]

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

    $GUI = GUICreate('test')
    $ListView = GUICtrlCreateListView('Spalte1|Spalte2|Spalte3', 10, 10, 300, 200, $LVS_REPORT)
    $hListView = GUICtrlGetHandle(-1)
    $LV_mnu = GUICtrlCreateContextMenu($ListView)
    $mnuAdd = GUICtrlCreateMenuItem('Anhängen - Leeres Item', $LV_mnu)
    $mnuIns = GUICtrlCreateMenuItem('Einfügen - Leeres Item', $LV_mnu)
    GUICtrlCreateMenuItem('', $LV_mnu)
    $mnuDel = GUICtrlCreateMenuItem('Löschen - Markiertes Item', $LV_mnu)
    _GUICtrlListView_SetColumnWidth($hListView, 0, 70)
    _GUICtrlListView_SetColumnWidth($hListView, 1, 60)
    _GUICtrlListView_SetColumnWidth($hListView, 2, $LVSCW_AUTOSIZE_USEHEADER )
    For $i = 1 To 9
    GUICtrlCreateListViewItem('Z. ' & $i & ' - Sp. 1|Z. ' & $i & ' - Sp. 2|Z. ' & $i & ' - Sp. 3', $ListView)
    Next

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

    $EditBox = GUICreate('', 200, 30, -1, -1, BitOR($WS_POPUP,$WS_BORDER), $WS_EX_TOPMOST)
    $dummy = GUICtrlCreateDummy()
    $hEdit = GUICtrlCreateInput('', 5, 5, 190, 20, $SS_CENTER)
    HotKeySet('{ESC}', '_EscEdit')
    Global $AccelKeys[1][2]=[["{ENTER}", $dummy]]
    GUICtrlSetOnEvent($dummy, "_EditEnter")
    GUISetAccelerators($AccelKeys)

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

    GUISetState(@SW_SHOW, $GUI)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    While True
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $mnuAdd
    _mnuAdd()
    Case $mnuIns
    _mnuIns()
    Case $mnuDel
    _mnuDel()
    EndSwitch
    WEnd

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

    Func _mnuAdd()
    Local $new = _GUICtrlListView_AddItem($hListView, '')
    Local $col = _GUICtrlListView_GetColumnCount($hListView)
    If $col = 1 Then Return
    For $i = 1 To $col -1
    _GUICtrlListView_AddSubItem($hListView, $new, '', $i)
    Next
    EndFunc

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

    Func _mnuIns()
    Local $marked = _GUICtrlListView_GetSelectedIndices($hListView)
    If $marked = '' Then Return MsgBox(0, 'Fehler Einfügen', 'Kein Item markiert!')
    _GUICtrlListView_InsertItem($hListView, '', $marked)
    EndFunc

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

    Func _mnuDel()
    Local $marked = _GUICtrlListView_GetSelectedIndices($hListView)
    If $marked = '' Then Return MsgBox(0, 'Fehler Löschen', 'Kein Item markiert!')
    _GUICtrlListView_DeleteItem($hListView, $marked)
    EndFunc

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

    Func _LeftDblClick($Info)
    If $Info[3] = -1 Then Return
    If $currentOpt[0] = "none" Then
    $currentOpt[0] = Opt('GUICoordMode', 1)
    $currentOpt[1] = Opt("GUIOnEventMode", 1)
    EndIf
    GUICtrlSetOnEvent($hEdit, '_EditEnter')
    _GUICtrlListView_SetSelectedColumn($Info[1], $Info[4])
    $title = WinGetTitle($GUI)
    Local $mouse = MouseGetPos(), $posEdit = WinGetPos($EditBox)
    Local $posGUI = WinGetPos($GUI), $posLV = ControlGetPos($GUI, '', $hListView)
    Local $colInfo = _GUICtrlListView_GetColumn($Info[1], $Info[4]), $sumWidth = 0, $tmp
    WinSetTitle($GUI, '', 'Editiere: Zeile ' & $Info[3]+1 & ', ' & $colInfo[5])
    For $i = 0 To $Info[4]
    $tmp = _GUICtrlListView_GetColumn($Info[1], $i)
    $sumWidth += $tmp[4]
    Next
    $sumWidth -= $colInfo[4]
    Local $xPos = $posGUI[0]+$posLV[0]+$sumWidth
    If $xPos+$colInfo[4]+10 > @DesktopWidth Then $xPos = @DesktopWidth - ($colInfo[4] + 10)
    If $xPos < 0 Then $xPos = 0
    WinMove($EditBox, '', $xPos, $mouse[1]-$posEdit[3], $colInfo[4]+10)
    GUICtrlSetData($hEdit, _GUICtrlListView_GetItemText($Info[1], $Info[3], $Info[4]))
    $currentItem[0] = $Info[3]
    $currentItem[1] = $Info[4]
    GUISetState(@SW_SHOW, $EditBox)
    EndFunc

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

    Func _EscEdit()
    WinSetTitle($GUI, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    Func _EditEnter()
    WinSetTitle($GUI, '', $title)
    Opt('GUICoordMode', $currentOpt[0])
    Opt("GUIOnEventMode", $currentOpt[1])
    $currentOpt[0] = "none"
    _GUICtrlListView_SetItemText($hListView, $currentItem[0], GUICtrlRead($hEdit), $currentItem[1])
    GUISetState(@SW_HIDE, $EditBox)
    EndFunc

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
    $hWndListView = $hListView ; ID des LV
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView) ; ID des LV
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $NM_DBLCLK
    Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
    Local $aInfo[5] = [$hWndFrom, $iIDFrom, $iCode, DllStructGetData($tInfo, "Index"), _
    DllStructGetData($tInfo, "SubItem")]
    _LeftDblClick($aInfo)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
  • Hallo sc4ry

    Zitat

    mir ist aber noch was aufgefallen.
    wenn ich leere zellen generiere und dort einen doppelklick mache, kommt das Edit-Fenster sofort.
    ist jedoch ein wert in der zelle, poppt das fenster beim ersten doppelklick nur kurz auf, beim 2ten mal funzt es dann richtig.

    Ich Kann dieses Verhalten auch nicht bestätigen, das Edit-Fenster verhält sich in beiden Fällen gleich.

    BugFix Mir ist aber was anderes aufgefallen, Das Editfenster ist etwas zu weit oben, also nicht genau in der Zeile die editiert werden soll. Der Abstand wächst proportional mit der Anzahl der Items, (Edit 2: optische Täuschung)
    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (17. Mai 2009 um 06:28)