Perle für alle LV-Benutzer gefunden, muss aber noch poliert werden

  • Hallo zusammen,

    auf AutoItScript.com habe ich eine recht gelungeUDF für Listview gefunden. Mit ihr kann man u.a. Combo-Boxen und auch Datumsauswahl direkt in der Listview editieren. Leider gibt es das Datum immer im Langen Format zurück und ich kann den Fehler nicht finden, anbei UDF und Demo. Wäre nett wenn jemand bei Gelegenheit nachschauen könnte,

    Edit1: vorerst betrachte ich es als gelöst, bis sich das Problem stellt in einer Listview kurzes und langes Datumsformat anzuzeigen,

    Edit2: einige consts verursachen Fehler da bereits in Includes deklariert, daher auskommentiert und beides als ZIP eingestellt, die Orihinaldateien im Anhang habe ich aber nicht verändert,

    Edit3: weiterer Bug bei der Positionierung behoben

    UDF korrigierte Version
    [autoit]

    Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    #forceref $hWndGUI, $MsgID, $wParam
    Local $tagNMHDR, $pressed,$event, $retval = $GUI_RUNDEFMSG ;, $idFrom
    $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
    If @error Then
    $tagNMHDR =0
    Return
    EndIf
    ;~ $from = DllStructGetData($tagNMHDR, 1)
    ;~ $idFrom = DllStructGetData($tagNMHDR,2)
    ;ConsoleWrite("idFrom="&$idFrom&@LF)
    $event = DllStructGetData($tagNMHDR, 3)
    Select
    case
    Case ($event = $HDN_TRACK or $event = $HDN_TRACKW)
    ;column dragging
    _CancelEdit()
    Case $MsgID = $WM_MOVING
    _MoveControl()
    Case $wParam = $__LISTVIEWCTRL
    Select
    Case $event = $LVN_ITEMCHANGED
    Local $ckcount = _LvGetCheckedCount($__LISTVIEWCTRL)
    If $LVCHECKEDCNT <> $ckcount Then
    $LVCHECKEDCNT = $ckcount
    $bLVITEMCHECKED = True
    _CancelEdit()
    EndIf

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

    Case $event = $NM_CLICK
    If $bLVEDITONDBLCLICK = False Then
    _LVGetInfo($lParam)
    ;scroll column into view.
    Switch $LVINFO[1]
    Case 0
    _GUICtrlListView_Scroll ( $__LISTVIEWCTRL, -$LVINFO[4], 0 )
    _FillLV_Info($__LISTVIEWCTRL, $LVINFO[8], $LVINFO[9], $LVINFO,0)
    ;_LVGetInfo($lParam)
    Case Else
    Local $ctrlSize = ControlGetPos("","",$__LISTVIEWCTRL)
    If $LVINFO[2]+$LVINFO[4] > $ctrlSize[2] Then
    _GUICtrlListView_Scroll ( $__LISTVIEWCTRL, $LVINFO[4], 0 )
    _FillLV_Info($__LISTVIEWCTRL, $LVINFO[8], $LVINFO[9], $LVINFO,0)
    EndIf
    EndSwitch
    if Not $bLVITEMCHECKED Then
    _ListView_Click()
    EndIf
    Else
    if $editFlag = 1 Then _CancelEdit()
    EndIf

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

    $bLVITEMCHECKED = False;
    Case $event = $NM_DBLCLK
    ConsoleWrite("$NM_DBLCLK"&@LF)
    _LVGetInfo($lParam)
    _ListView_DoubleClick()
    Case $event = $NM_RCLICK
    _LVGetInfo($lParam)
    _ListView_RClick()
    Case $event = -180
    If $DebugIt Then ConsoleWrite("LVEVENT=-180"&@LF)
    If $editFlag = 1 Then
    Send("{Esc}")
    _CancelEdit()
    $retval = 0
    EndIf
    Case $event = -181
    If $DebugIt Then ConsoleWrite("LVEVENT=-181"&@LF)
    _FillLV_Info($__LISTVIEWCTRL, $LVINFO[0], $LVINFO[1], $LVINFO,0)
    Case $event= -121
    If $DebugIt Then ConsoleWrite("LVEVENT=-121"&@LF)
    _LVGetInfo($lParam,1)
    Case Else
    If $DebugIt Then ConsoleWrite("LV_EVENT>>"&$event&@LF)
    EndSelect
    Case $lvDate
    Select
    Case $event = $DTN_DROPDOWN
    $bCanceled = False
    $bDATECHANGED = False
    Case $event = $DTN_WMKEYDOWNA
    $pressed = _vKeyCheck()
    If $pressed = 27 Then _CancelEdit()
    Case $event = $DTN_DATETIMECHANGE
    If $DebugIt Then ConsoleWrite("DTN_DATETIMECHANGE"&@LF)
    If $bDATECHANGED = False Then $bDATECHANGED = True
    $pressed = _vKeyCheck()
    if $pressed = 27 Then
    _CancelEdit()
    $bDATECHANGED = False
    EndIf
    Case $event = $DTN_CLOSEUP
    If $DebugIt Then ConsoleWrite("DTN_CLOSEUP"&@LF)
    if $bCanceled or ($bDATECHANGED = False) Then
    Send("{Esc}")
    $bDATECHANGED = False
    Else
    ; If $bLVUPDATEONFOCUSCHANGE = True Then
    Send("{Enter}")
    $bDATECHANGED = True
    ; Else
    ; Send("{Esc}")
    ; EndIf
    EndIf
    case $event = -7
    If $DebugIt Then ConsoleWrite("dtn $event="&$event&@LF)
    $bCanceled = False
    $bDATECHANGED = False
    Case $event = -8
    If $DebugIt Then ConsoleWrite("dtn $event="&$event&" , ")
    If $DebugIt Then ConsoleWrite("$bCanceled="&$bCanceled&@LF)
    If $DebugIt Then ConsoleWrite("$bDATECHANGED="&$bDATECHANGED&@LF)
    if $bCanceled = True Then
    ;or ($bDATECHANGED = False) Then
    Send("{Esc}")
    $bDATECHANGED = False
    $bCanceled = False
    Else
    $bDATECHANGED = True
    EndIf
    EndSelect
    Case $event = -326
    ConsoleWrite("HDN Notification: "&$event&@LF)
    if $editFlag Then _CancelEdit()
    Case $MsgID = $WM_KEYDOWN
    ;----------------------------------------------------------------------------------------------
    If $DebugIt Then ConsoleWrite(_DebugHeader("Keydown"))
    ;----------------------------------------------------------------------------------------------
    Case Else
    If $DebugIt Then ConsoleWrite("WPARAM = "&$wParam&@LF)
    ;;uncomment the following line to have the edit _LVUpdate if the mouse moves
    ;;off of the listview.
    If $editFlag And Not(_HasFocus($editCtrl)) Then _LVUpdate($editCtrl, $__LISTVIEWCTRL, $LVINFO[0], $LVINFO[1])
    EndSelect
    If $DebugIt Then
    If $wParam <> $__LISTVIEWCTRL Then
    ConsoleWrite($hWndGUI &" "& $event&@LF)
    EndIf
    EndIf

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

    $tagNMHDR = 0
    $event = 0
    $lParam = 0
    Return $retval

    [/autoit]

    mfg (Auto)Bert

  • Leider gibt es das Datum immer im Langen Format zurück

    Habe mal die Zeile 157 der UDF wie folgt geändert:

    [autoit]

    $lvDate = GUICtrlCreateDate($lvDataStart,0, 0, 1, 1, $DTS_SHORTDATEFORMAT,BitOr($WS_EX_CLIENTEDGE,$WS_EX_TOPMOST ))

    [/autoit]


    Damit wird dann das kurze Datum angezeigt.

    Im Original stand dort:

    [autoit]

    $lvDate = GUICtrlCreateDate($lvDataStart,0, 0, 1, 1,BitOR($GUI_SS_DEFAULT_DATE, $DTS_SHORTDATEFORMAT),BitOr($WS_EX_CLIENTEDGE,$WS_EX_TOPMOST ))

    [/autoit]


    und in der DateTimeConstants.au3 ist $GUI_SS_DEFAULT_DATE wie folgt definiert:

    [autoit]

    Global Const $GUI_SS_DEFAULT_DATE = $DTS_LONGDATEFORMAT

    [/autoit]

    Warum sollte man $DTS_LONGDATEFORMAT und $DTS_SHORTDATEFORMAT verodern?
    Ich hoffe, dass das das war, was du meintest :D

    Gruß Ashpool

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.

  • Hallo Ashpool,

    Warum sollte man $DTS_LONGDATEFORMAT und $DTS_SHORTDATEFORMAT verodern?
    Ich hoffe, dass das das war, was du meintest


    Diese Änderung hilft mir zumindest bei Projekten, in denen kein Bedarf besteht in einer Listview beide Varianten anzuzeigen, besser wäre es wenn man es im eigenen Skript lösen könnte (hier halt in der Demo). Meine Glaskugel sagt mir die Lösung müsste durch GuiCtrlSendMsg zu lösen sein (ähnlich Zeilen 46, 47) ich kann aber in keinen DateTimePicker in der UDF finden an den ich die Msg schicken könnte und die Listview bringt meine Msg so durcheinander, dass man nicht mehr editieren kann:

    [autoit]

    Local $DTM_SETFORMAT_ = 0x1032
    Local $style = "yyyy/MM/dd"
    GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $DTM_SETFORMAT_, $style)

    [/autoit]

    Vieleicht findet jemand eine Lösung,

    mfg (Auto)Bert

    Einmal editiert, zuletzt von AutoBert (18. Mai 2009 um 15:16)

    • Offizieller Beitrag

    Warum benutzt du nicht einfach GuiCtrlSetStyle ?

  • ich habe in Post #1 eine abgeänderte Version der UDF eingestellt, da es Pobleme bei der Positionierung der eingebetten Controls kam, wenn die LV einen horizontalen Scrollbalken benötigt,

    mfg autoBert