Hallo liebe Community,
habt ihr eine Ahnung wie man an ein ListView einen Klick senden kann OHNE MouseClick()?
Vlt. mit GuiCtrlSendMsg()? doch wie soll dann der Syntax aussehen?
LG
Hallo liebe Community,
habt ihr eine Ahnung wie man an ein ListView einen Klick senden kann OHNE MouseClick()?
Vlt. mit GuiCtrlSendMsg()? doch wie soll dann der Syntax aussehen?
LG
An ein ListView deines Scripts oder extern?
In meinem Script intern xD
Warum willst du auf dein ListView klicken? Zum selektieren? Was hast du vor?
Ich habe eine Funktion die aufgerufen wird wenn man auf ein listview item klickt. Nun soll dass aber auch bei einem markierten item mit enter passieren. Da die vorherigen versuche ein enter-event abzufangen fehlgeschlagen sind wollte ich mal fragen ob man nicht einen klick so senden kann.
Zeig mal deinen Versuch. Da kann man was machen.
Hey teamnoobPDB,
Ich habe dein Problem nicht ganz verstanden. Du schreibst ja, du hast es nicht geschafft das Enter-Klick Event abzufangen. Stattdessen möchtest du einen Mausklick senden..
Das passt nicht zusammen. Du willst den Listview-Eintrag ja dennoch "anklicken", wenn Enter gedrückt wurde.
Für das Auswerten des Enter-Drucks, böte sich hier doch u.a. HotKeySet, ein Dummy-Button mit GUISetAccelerators, oder _IsPressed an.
Kann es sein, dass du doch eher Probleme mit dem Auswerten des aktuellen Listview-Eintrags hast?
Prinzipiell kannst du per _GUICtrlListView_ClickItem einen Eintrag anklicken. Allerdings ist das doch unnötig.
Du könntest etwa ENTER als Hotkey einstellen, mit dem du deine Funktion, die den Klick verarbeiten Soll startest. In der fragst du dann einfach den markierten Listview Eintrag ab, oder startest diese Funktion schon mit dem Indexwert des markierten Eintrags als Parameter. Den markierten Tabelleneintrag ermittelst du z.B. mit _GUICtrlListView_GetSelectionMark($hListviewHandle).
Hier habe ich mal die ListviewAddArray Funktion für ein Bsp. mit HotKeySet für dich missbraucht:
#include <GuiListView.au3>
Global $idListview
HotKeySet("{ENTER}", "_ListviewElement") ; Hier wird Enter als globaler Hotkey definiert, der die Funktion _ListviewElement startet.
Example()
Func Example()
Local $iI
GUICreate("ListView Add Array", 400, 300)
$idListview = GUICtrlCreateListView("", 2, 2, 394, 268)
GUISetState(@SW_SHOW)
_GUICtrlListView_AddColumn($idListview, "Items", 100)
_GUICtrlListView_SetItemCount($idListview, 5000)
Local $aItems[5000][1]
For $iI = 0 To UBound($aItems) - 1
$aItems[$iI][0] = "Item " & $iI
Next
_GUICtrlListView_AddArray($idListview, $aItems)
While Sleep(10)
If GUIGetMsg() = -3 Then ExitLoop
WEnd
GUIDelete()
EndFunc ;==>Example
Func _ListviewElement() ; Diese Funktion gibt dir beispielhaft, die ermittelten Werte in der Konsole aus.
ConsoleWrite("Listview-Item Index: " & _GUICtrlListView_GetSelectionMark($idListview) & ", Item-Text: " & _GUICtrlListView_GetItemText($idListview, _GUICtrlListView_GetSelectionMark($idListview)) & @LF)
EndFunc ;==>_ListviewElement
Alles anzeigen
Ok danke schonmal für die Ansätze. Bin gerade nicht an meinem PC und werde euch später den Code schicken.
So,
hier mal der Code wie es aussieht.
Wenn man auf Column2 Klickt erscheint ein Edit-Feld neben der Zahl dort soll man eine postive oder negative Zahl eingeben und die wird dann auf die schon dort stehende addiert. Mit Tab kann man die eingabe beenden und die Aktion durchführen lassen. Nun sollte es aber erstens mit enter machbar sein UND wenn ein Item mit den Pfeiltasten ausgewählt wird und dann enter drückt soll dasselbe passieren wie bei einem Mausklick auf dasselbe item.
#include <GUIListView.au3>
#include <WindowsConstants.au3>
#include <GUIEdit.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = -1
$hGUI = GUICreate("", 500, 500)
$hListView = GUICtrlCreateListView("", 10, 10, 480, 480)
_GUICtrlListView_AddColumn($hListView, "Column1", 200)
_GUICtrlListView_AddColumn($hListView, "Column2", 100, 2)
For $i = 1 To 4
$iIndex = _GUICtrlListView_InsertItem($hListView, "Item" & $i)
_GUICtrlListView_AddSubItem($hListView, $iIndex, $i, 1)
Next
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState()
While Sleep(10)
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
WEnd
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $aHitTest
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo, $hWndEdit
$hWndListView = $hListView
$hWndEdit = $hEdit
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
If Not IsHWnd($hEdit) Then $hWndEdit = GUICtrlGetHandle($hEdit)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
;$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $aHit = _GUICtrlListView_SubItemHitTest($hWndListView)
If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
$bDisableUpdates = True
Local $iSubItemText = _GUICtrlListView_GetItemText($hWndListView, $Item, $SubItem)
Local $iLen = _GUICtrlListView_GetStringWidth($hWndListView, $iSubItemText)
Local $aRect = _GUICtrlListView_GetSubItemRect($hWndListView, $Item, $SubItem)
$hEdit = _GUICtrlEdit_Create($hGUI, "", 20 + $aRect[0], 13 + $aRect[1], $iLen + 10, 17, BitOR($WS_CHILD, $WS_VISIBLE, $ES_CENTER, $ES_AUTOHSCROLL))
_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
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
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)
DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc ;==>FrameRect
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitShift($wParam, 16)
Switch $lParam
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
Local $iText = _GUICtrlEdit_GetText($hEdit)
_GUICtrlListView_SetItemText($hListView, $Item, Int($iText) + Int(_GUICtrlListView_GetItemText($hListView, $Item, $SubItem)), $SubItem)
_WinAPI_DeleteObject($hBrush)
_WinAPI_ReleaseDC($hEdit, $hDC)
_WinAPI_DestroyWindow($hEdit)
GUICtrlSetState($hListView, 256)
_GUICtrlListView_SetItemSelected($hListView, $Item, True, True)
$Item = -1
$SubItem = -1
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Alles anzeigen
Ah, verstehe.
Dir ist nicht klar, wie du jetzt auf welchem Weg auch immer die WM_NOTIFY-Funktion aufrufen sollst? Antwort: Einfach gar nicht.
Starte bei Case $NM_CLICK einfach eine Funktion, in die du schreibst, was passieren soll. Die WM_NOTIFY-Funktion sollst du eh schnell verlassen..
Diese neue Funktion kannst du dann einfach wie in meinem Bsp. aufrufen. Einmal über Klick und einmal über Enter
ok danke ich habs jetzt hingekriegt xD
Kannst Du bitte das Ergebnis als ausführbaren Code posten?
Da musst du dich leider noch bis morgen gedulden. Bin aufm Sprung und komme erst spät in der Nacht wieder. Aber morgen kann ich es Posten.
Nochmal kurz nachgeharkt - kannst Du bitte das Ergebnis als ausführbaren Code posten?
(Oder hast Du den Code irgendwo weiter oben schon eingefügt?)
Da musst du dich leider noch bis morgen gedulden. Bin aufm Sprung und komme erst spät in der Nacht wieder. Aber morgen kann ich es Posten.
Nochmal kurz nachgeharkt - kannst Du bitte das Ergebnis als ausführbaren Code posten?
(Oder hast Du den Code irgendwo weiter oben schon eingefügt?)
teamnoobPDB kpmmt warscheins von einem anderen Planeten auf dem die Tage länger sind. Hoffentlich ist er nicht auf dem neu entdecktem Planet 9 zu Hause, denn dann brauchst du noch sehr viel Geduld
Huch sorry hab ich total vergessen ... Bin momentan durch den Wind hab ne Mathe Klausur vor mir und ich hab viel zu wenig Zeit ich schmeiß aber mal gerade den Rechner an und lade es sofort hoch ... Bevor ich es nochmal vergesse
Also das Ziel war es ja ein Klick auf ein Listview Item zu erzielen xD Das habe ich etwas umgangen... schaut was passiert wenn man auf die anzahl klick... es öffnet sich ein editfeld um die Anzahl anzupassen. Nun wollte ich, dass das auch passiert wenn ich auf der rechten seite ein item per ENTER oder doppelklick auf die linke seite verfrachte...
aber hier der Code:
#include-once
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GUIListView.au3>
#include <ListViewConstants.au3>
#include <GUIEdit.au3>
#include <SQLite.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>
#include <Constants.au3>
#include <Misc.au3>
#include <Date.au3>
#include <File.au3>
Global Const $VK_RETURN = 0x0D
Global $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0, $bEditing = False, $hTimerENTERLock
Global Const $sTitle = "Title"
Global $hGUI = GUICreate($sTitle, 800, 600)
$hListOrder = GUICtrlCreateListView("", 10, 100, 300, 475, Default, 0x00000020)
_GUICtrlListView_AddColumn($hListOrder, "Produkt", 200)
_GUICtrlListView_AddColumn($hListOrder, "Anzahl", 75, 2)
$hListSource = GUICtrlCreateListView("", 490, 100, 300, 475, BitOR(0x0001, 0x0004))
_GUICtrlListView_AddColumn($hListSource, "Produkt", 275)
For $i = 1 To 50
_GUICtrlListView_AddItem($hListSource, "test" & $i)
Next
$hButtonAdd = GUICtrlCreateButton("<----", 375, 200, 50, Default)
$hButtonDel = GUICtrlCreateButton("---->", 375, 250, 50, Default)
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUISetState(@SW_SHOW, $hGUI)
while True
$msg = GUIGetMsg(True)
Switch $msg[0]
Case $GUI_EVENT_CLOSE
If $msg[1] = $hGUI Then
Exit
EndIf
Case $hButtonAdd
__Product_Add(__Listview_GetSelectedIndex($hListSource))
Case $hButtonDel
_GUICtrlListView_DeleteItemsSelected($hListOrder)
EndSwitch
If _IsPressed('0D') And TimerDiff($hTimerENTERLock) > 250 Then
$hTimerENTERLock = TimerInit()
If $bEditing Then
Send("{TAB}")
Else
$iListIndex = __Listview_GetSelectedIndex($hListSource)
If $iListIndex <> -1 Then
$sItemText = __Product_Add($iListIndex)
__Listview_DeselectAll($hListSource)
GUICtrlSetState($hListOrder, 256)
_GUICtrlListView_SetItemSelected($hListOrder, __Listview_GetIndex($hListOrder, $sItemText), True, True)
__Input_Select()
Else
__Input_Select()
EndIf
EndIf
EndIf
WEnd
Func __Product_Add($iListIndex)
Local $sItemText = _GUICtrlListView_GetItemText($hListSource, $iListIndex)
Local $iItem = _GUICtrlListView_AddItem($hListOrder, $sItemText)
_GUICtrlListView_AddSubItem($hListOrder, $iItem, "0", 1)
Return $sItemText
EndFunc
Func __Input_Select()
$iItemHit = __Listview_GetSelectedIndex($hListOrder)
If $iItemHit <> -1 Then
$Item = $iItemHit
$SubItem = 1
Local $iSubItemText = _GUICtrlListView_GetItemText($hListOrder, $Item, $SubItem)
Local $iLen = _GUICtrlListView_GetStringWidth($hListOrder, $iSubItemText)
Local $aRect = _GUICtrlListView_GetSubItemRect($hListOrder, $Item, $SubItem)
$hEdit = _GUICtrlEdit_Create($hGUI, "", 10 + $aRect[0] + 6, 100 + $aRect[1], $iLen + 10, 17, BitOR($WS_CHILD, $WS_VISIBLE, $ES_CENTER, $ES_AUTOHSCROLL))
$bEditing = True
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, $iLen + 10, 17, $hBrush)
Sleep(125)
EndIf
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
#forceref $hWnd, $iMsg, $wParam
Local $aHitTest
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $hWndListViewSource, $tInfo, $hWndEdit
$hWndListView = $hListOrder
$hWndListViewSource = $hListSource
$hWndEdit = $hEdit
If Not IsHWnd($hListOrder) Then $hWndListView = GUICtrlGetHandle($hListOrder)
If Not IsHWnd($hListSource) Then $hWndListViewSource = GUICtrlGetHandle($hListSource)
If Not IsHWnd($hEdit) Then $hWndEdit = GUICtrlGetHandle($hEdit)
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
;$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $aHit = _GUICtrlListView_SubItemHitTest($hWndListView)
If ($aHit[0] <> -1) And ($aHit[1] > 0) Then
$Item = $aHit[0]
$SubItem = $aHit[1]
Local $iSubItemText = _GUICtrlListView_GetItemText($hWndListView, $Item, $SubItem)
Local $iLen = _GUICtrlListView_GetStringWidth($hWndListView, $iSubItemText)
Local $aRect = _GUICtrlListView_GetSubItemRect($hWndListView, $Item, $SubItem)
$hEdit = _GUICtrlEdit_Create($hGUI, "", 10 + $aRect[0] + 6 + ($aHit[10] ? 50 : 0), 100 + $aRect[1], $iLen + 10, 17, BitOR($WS_CHILD, $WS_VISIBLE, $ES_CENTER, $ES_AUTOHSCROLL))
If $aHit[10] Then
$bDecraseCount = True
Else
$bDecraseCount = False
EndIf
$bEditing = True
_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
Case $hWndListViewSource
Switch $iCode
Case $NM_DBLCLK;dbl click
$iListIndex = __Listview_GetSelectedIndex($hListSource)
If $iListIndex <> -1 Then
$sItemText = __Product_Add($iListIndex)
__Listview_DeselectAll($hListSource)
GUICtrlSetState($hListOrder, 256)
_GUICtrlListView_SetItemSelected($hListOrder, __Listview_GetIndex($hListOrder, $sItemText), True, True)
__Input_Select()
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
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)
DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
EndFunc ;==>FrameRect
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $iCode = BitShift($wParam, 16)
Switch $lParam
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
Local $iText = _GUICtrlEdit_GetText($hEdit)
_GUICtrlListView_SetItemText($hListOrder, $Item, Int(_GUICtrlListView_GetItemText($hListOrder, $Item, 1) + $iText), 1)
$bEditing = False
_WinAPI_DeleteObject($hBrush)
_WinAPI_ReleaseDC($hEdit, $hDC)
_WinAPI_DestroyWindow($hEdit)
GUICtrlSetState($hListOrder, 256)
_GUICtrlListView_SetItemSelected($hListOrder, $Item, True, True)
$Item = -1
$SubItem = 0
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func __Listview_Add($hListView, $sData, $sSubData = "")
Local $iIndex
If Not __Listview_Exist($hListView, $sData) Then
$iIndex = _GUICtrlListView_InsertItem($hListView, $sData)
If $sSubData <> "" Then _GUICtrlListView_AddSubItem($hListView, $iIndex, $sSubData, 1)
Return True
Else
If $sSubData <> "" Then Return __Listview_Update($hListView, $sData, $sSubData)
Return False
EndIf
EndFunc
Func __Listview_Remove($hListView, $iIndex_sName)
If Not IsInt($iIndex_sName) Then $iIndex_sName = __Listview_GetIndex($hListView, $iIndex_sName)
_GUICtrlListView_DeleteItem($hListView, $iIndex_sName)
EndFunc
Func __Listview_Update($hListView, $iIndex_sName, $sData)
If Not IsInt($iIndex_sName) Then $iIndex_sName = __Listview_GetIndex($hListView, $iIndex_sName)
_GUICtrlListView_SetItemText($hListView, $iIndex_sName, $sData, 1)
EndFunc
Func __Listview_GetPreview($hListView, $tmpProdukte)
;If $bDebug Then _ArrayDisplay($tmpProdukte, "Vorschau")
If IsArray($tmpProdukte) Then
For $i = 0 To UBound($tmpProdukte) - 1
__Listview_Add($hListView, $tmpProdukte[$i][0], $tmpProdukte[$i][1])
Next
EndIf
EndFunc
Func __Listview_GetIndex($hListView, $sData)
For $i = 0 To _GUICtrlListView_GetItemCount($hListView)
If _GUICtrlListView_GetItemText($hListView, $i) == $sData Then Return $i
Next
Return -1
EndFunc
Func __Listview_DeselectAll($hListView)
For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
_GUICtrlListView_SetItemSelected($hListView, $i, False)
Next
Return True
EndFunc
Func __Listview_GetSelectedIndex($hListView)
For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
If _GUICtrlListView_GetItemSelected($hListView, $i) Then Return $i
Next
Return -1
EndFunc
Func __Listview_Exist($hListView, $sData)
For $i = 0 To _GUICtrlListView_GetItemCount($hListView) - 1
If _GUICtrlListView_GetItemText($hListView, $i) == $sData Then Return True
Next
Return False
EndFunc
Func __Listview_MoveItem($ItemIndex, $StepWidth, $hLV)
If ($ItemIndex + $StepWidth) < 0 Or _
($ItemIndex + $StepWidth) > _GUICtrlListView_GetItemCount($hLV)-1 Then
SetError(1)
Return 0
EndIf
Local $txtProduct = _GUICtrlListView_GetItemText($hLV, $ItemIndex)
Local $txtCount = _GUICtrlListView_GetItemText($hLV, $ItemIndex, 1)
_GUICtrlListView_SetItemText($hLV, $ItemIndex, _GUICtrlListView_GetItemText($hLV, $ItemIndex + $StepWidth))
_GUICtrlListView_SetItemText($hLV, $ItemIndex, _GUICtrlListView_GetItemText($hLV, $ItemIndex + $StepWidth, 1), 1)
_GUICtrlListView_SetItemText($hLV, $ItemIndex + $StepWidth, $txtProduct)
_GUICtrlListView_SetItemText($hLV, $ItemIndex + $StepWidth, $txtCount, 1)
_GUICtrlListView_SetItemSelected($hLV, $ItemIndex + $StepWidth, True, True)
Return -1
EndFunc ;==>_MoveLVItem
Alles anzeigen