TAB Taste in Tabelle statt Klick

  • Guten Abend liebe AutoIt Community,

    ich bin neu hier und habe mal eine Frage, ich hab mein kleines Script bereits soweit Fertig wie ich es haben will, mir fehlt jetzt eigentlich nur noch das man mit der TAB Taste in der Tabelle sich bewegen kann und nicht nur mit einem klick auf die entsprechende Zeile. Weil dann kann man sehr schnell die Tabelle abarbeiten ohne immer erst auf das Feld klicken zu müssen, was vor allem bei Größen Datenmengen ein Vorteil ist.

    Hier mal ein kleiner Ausschnitt der meiner Meinung nach rellevanten Elemnte:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    hListView = _GUICtrlListView_Create($hGUI, "bla|bla|bla", 2, 2, 600, 300, BitOR($LVS_EDITLABELS, $LVS_REPORT))
    _GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_GRIDLINES)

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

    Global $hQuery, $aRow, $items, $i
    _SQLite_StartUp()
    $hDB = _SQLite_Open(".\\bla.db")
    _SQLite_Query($hDB, "SELECT * From Tabelle",$hQuery)

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

    $i=1
    While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK

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

    _GUICtrlListView_AddItem($hListView, $aRow[0])
    _GUICtrlListView_AddSubItem($hListView, $i - 1, $aRow[1], 1)
    _GUICtrlListView_AddSubItem($hListView, $i - 1, $aRow[2], 2)
    $i=$i+1

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

    WEnd

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

    Local $ilast=$i
    Local $ilast2=$i
    Local $ihinzu = GUICtrlCreateButton('Hinzufügen', $iWidth - 270, $iHeight - 28, 85, 25)
    Local $iGetArray = GUICtrlCreateButton('Speichern', $iWidth - 180, $iHeight - 28, 85, 25)
    Local $iBeenden = GUICtrlCreateButton('Beenden', $iWidth - 90, $iHeight - 28, 85, 25)

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

    _SQLite_Close($hDB)
    _SQLite_Shutdown()

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

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

    [/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 + 70, 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 + 80 , 17, $hBrush)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func _CreateListView($hGUI, ByRef $iListView) ; Thanks to AZJIO for this function.
    Local $aClientSize = WinGetClientSize($hGUI)
    $iListView = GUICtrlCreateListView('', 0, 0, $aClientSize[0], $aClientSize[1] - 30)
    GUICtrlSetResizing($iListView, $GUI_DOCKBORDERS)
    Sleep(250)

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

    Local $iColumns = Random(1, 5, 1)
    __ListViewFill($iListView, $iColumns, Random(25, 100, 1)) ; Fill the ListView with Random data.
    For $i = 0 To $iColumns
    _GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE)
    _GUICtrlListView_SetColumnWidth($iListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
    Next
    EndFunc ;==>_CreateListView

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

    Func __ListViewFill($hListView, $iColumns, $iRows) ; Required only for the Example.
    If Not IsHWnd($hListView) Then
    $hListView = GUICtrlGetHandle($hListView)
    EndIf
    Local $fIsCheckboxesStyle = (BitAND(_GUICtrlListView_GetExtendedListViewStyle($hListView), $LVS_EX_CHECKBOXES) = $LVS_EX_CHECKBOXES)

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

    _GUICtrlListView_BeginUpdate($hListView)
    For $i = 0 To $iColumns - 1
    _GUICtrlListView_InsertColumn($hListView, $i, 'Column ' & $i + 1, 50)
    _GUICtrlListView_SetColumnWidth($hListView, $i - 1, -2)
    Next
    For $i = 0 To $iRows - 1
    _GUICtrlListView_AddItem($hListView, 'Row ' & $i + 1 & ': Col 1', $i)
    If Random(0, 1, 1) And $fIsCheckboxesStyle Then
    _GUICtrlListView_SetItemChecked($hListView, $i)
    EndIf
    For $j = 1 To $iColumns
    _GUICtrlListView_AddSubItem($hListView, $i, 'Row ' & $i + 1 & ': Col ' & $j + 1, $j)
    Next
    Next
    _GUICtrlListView_EndUpdate($hListView)
    EndFunc

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

    ich hoffe ihr versteht mein Problem und könnt mir weiterhelfen.

    Mit freundlichen Grüßen

  • Ich nenn mal ein paar Stichpunkte:
    GuiSetAccelerators()
    -> da für TAB ne funktion festlegen
    Dann in der Funktion prüfen, ob die Listview den Fokus hat
    Dann in der Funktion die Spalte/Zeile auslesen
    _GUICtrlListView_GetSelectedIndices ( $hWnd [, $bArray = False] )
    _GUICtrlListView_GetSelectedColumn ( $hWnd )
    und dann die nächste markieren
    _GUICtrlListView_SetSelectedColumn ( $hWnd, $iCol )
    _GUICtrlListView_SetItemSelected ( $hWnd, $iIndex [, $bSelected = True [, $bFocused = False]] )
    dabei: _GUICtrlListView_GetColumnCount ( $hWnd ) und _GUICtrlListView_GetItemCount ( $hWnd ) für die grenzen der listview

  • Hab es jetzt mit HotKeySet("{TAB}", "TAB_C") gelöst.

    Jedesmal wenn TAB gedrückt wird wird die Funktion aufgerufen:

    Spoiler anzeigen
    [autoit]


    Func TAB_C()
    Local $Item, $SubItem
    $ddong = 1
    MouseClick("left")
    MouseClick("left")
    $ddong = 0
    EndFunc

    [/autoit]

    Da durch einen Doppelklick (egal wo) die Funktion ausgeführt wird, frag ich einfach nach ob TAB oder die richtige Maustaste betätigt wurden in dem ich einfach mit Variablen arbeite.

    [autoit]


    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    Local $tNMHDR, $hWndFrom, $iCode
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hListView
    Switch $iCode
    Case $NM_DBLCLK
    If ($ddong = 1) Then
    If ($aHit1 <> -1) And ($aHit2 = 0) Then
    $Item = $aHit1
    $SubItem = 0
    $aHit1= $aHit1
    $aHit2=1
    Local $aRect = _GUICtrlListView_GetItemRect($hListView, $Item, $SubItem)
    ElseIf ($aHit1 <> -1) And ($aHit2 > 0) Then
    $Item = $aHit1
    $SubItem = $aHit2
    If ($aHit2 = 3) Then
    $aHit1= $aHit1+1
    $aHit2=1
    ElseIf($aHit2 = 2) Then
    $aHit1= $aHit1
    $aHit2=3
    Else
    $aHit1= $aHit1
    $aHit2=2
    EndIf
    Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
    Else
    Return $GUI_RUNDEFMSG
    EndIf
    Local $iItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
    Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iItemText)
    $hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 3, $aRect[1], $iLen + 70, 17, $Style)
    _GUICtrlEdit_SetSel($hEdit, 0, -1)
    _WinAPI_SetFocus($hEdit)
    $hDC = _WinAPI_GetWindowDC($hEdit)
    $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
    FrameRect($hDC, 0, 0, $iLen + 70 , 17, $hBrush)
    $ddong = 0
    Else
    $ddong = 1
    Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
    If ($aHit[0] <> -1) And ($aHit[1] = 0) Then
    $Item = $aHit[0]
    $SubItem = 0
    $aHit1= $aHit[0]
    $aHit2=1
    Local $aRect = _GUICtrlListView_GetItemRect($hListView, $Item)
    ElseIf ($aHit[0] <> -1) And ($aHit[1] > 0) Then
    $Item = $aHit[0]
    $SubItem = $aHit[1]
    If ($aHit[1] = 3) Then
    $aHit1= $aHit[0]+1
    $aHit2=1
    ElseIf($aHit[1] = 2) Then
    $aHit1= $aHit[0]
    $aHit2=3
    Else
    $aHit1= $aHit[0]
    $aHit2=2
    EndIf
    Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
    Else
    Return $GUI_RUNDEFMSG
    EndIf
    Local $iItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
    Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iItemText)
    $hEdit = _GUICtrlEdit_Create($hGUI, $iItemText, $aRect[0] + 3, $aRect[1], $iLen + 70, 17, $Style)
    _GUICtrlEdit_SetSel($hEdit, 0, -1)
    _WinAPI_SetFocus($hEdit)
    $hDC = _WinAPI_GetWindowDC($hEdit)
    $hBrush = _WinAPI_CreateSolidBrush(0x0000FF)
    FrameRect($hDC, 0, 0, $iLen + 70 , 17, $hBrush)
    $ddong = 0
    ;Local $ffg
    ;MsgBox($MB_SYSTEMMODAL, "Information", "Selected Indices: " & _GUICtrlListView_GetSelectedIndices($hListView))
    ; _GUICtrlListView_SetSelectedColumn($hListView, $aHit[1])
    ;MsgBox($MB_SYSTEMMODAL, "Information", "Selected Column: " & _GUICtrlListView_GetSelectedColumn($hListView))
    EndIf
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Das war eigentlich das ganze Geheimnis, hat mich nur einige Stunden Zeit gekostet. xD

    Aber trotzdem danke für die Hilfe :)

    Kann geschlossen werden....

  • Moin.

    Entweder verstehe ich dein Problem nicht ganz richtig, oder ich hab mal folgendes Script, welches mir aber selber mal zugesendet wurde hier übers Forum, das Dir evtl. helfen könnte.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GUIConstants.au3>
    Opt("GUIOnEventMode", 1) ;0=disabled, 1=OnEvent mode enabled
    Global $Auslesen
    Global $Beenden
    Global $VORNAME
    Global $NACHNAME
    Global $STADT
    Global $CUST_SN
    Global $NAME1
    Global $NAME2
    Global $CITY
    Global $iFocus
    ; MAIN PROGRAM
    $handle1 = GUICreate("GUI", 580, 290, -1, -1) ; will create a dialog box that when displayed is centered
    GUISetBkColor(0xFFFAFA) ; Snow
    GUISetFont(20, 400, -1)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUICtrlCreateLabel("My GUI", 150, 20, 320, 100, 0x01)
    GUICtrlSetColor(-1, 0x4169E1); RoyalBlue
    GUISetFont(8, 400, -1)
    GUISetFont(12, 400, -1)
    GUICtrlCreateLabel("Vorname: ", 25, 100, 300, 25)
    $VORNAME = GUICtrlCreateInput("", 185, 100, 300, 25)
    GUICtrlCreateLabel("Nachname: ", 25, 140, 300, 25)
    $NACHNAME = GUICtrlCreateInput("", 185, 140, 300, 25)
    GUICtrlCreateLabel("Stadt: ", 25, 180, 300, 25)
    $STADT = GUICtrlCreateInput("", 185, 180, 300, 25)
    $Auslesen = GUICtrlCreateButton("Daten übernehmen", 180, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Auslesen")
    $Beenden = GUICtrlCreateButton("Beenden", 350, 240, 150, 30) ;480, 140, 40, 25
    GUICtrlSetOnEvent(-1, "Terminate")
    GUISetOnEvent($GUI_EVENT_CLOSE, "Terminate")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "Mausdown")
    $retdummy = GUICtrlCreateDummy(); Dummy für das Abfangen von Enter
    GUICtrlSetOnEvent(-1, "Enterkey")
    $Exit = GUICtrlCreateDummy();Dummy für die Taste ESC
    GUICtrlSetOnEvent(-1, "Terminate")
    Local $AccelKeys[2][2] = [["{ENTER}", $retdummy],["{ESC}", $Exit]]; Accelerators für Enter und ESC verknüpft mit den Dummycontrols
    GUISetAccelerators($AccelKeys)
    GUISetState()
    $iFocus = $VORNAME ;Standard
    GUICtrlSetState($iFocus, $GUI_FOCUS) ; setzt den Cursor in das erste Feld.
    While 1
    WEnd
    Func Auslesen()
    $NAME1 = GUICtrlRead($VORNAME)
    $NAME2 = GUICtrlRead($NACHNAME)
    $CITY = GUICtrlRead($STADT)
    MsgBox(0, "IHRE EINGABEN", "Vorname: " & $NAME1 & @CRLF & "Nachname: " & $NAME2 & @CRLF & "Stadt: " & $CITY)
    EndFunc ;==>Auslesen
    Func Mausdown() ; Feldauswahl mit re. Maustaste
    Local $pos = GUIGetCursorInfo($handle1)
    If IsArray($pos) Then
    Switch $pos[4]
    Case $VORNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $NACHNAME
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    Case $STADT
    GUICtrlSetState($pos[4], $GUI_FOCUS)
    EndSwitch
    EndIf
    EndFunc ;==>Mausdown
    Func Enterkey() ; Feldauswahl mit Entertaste
    Local $pos = ControlGetFocus($handle1)
    Switch $pos
    Case "Edit1"; !.Input
    GUICtrlSetState($NACHNAME, $GUI_FOCUS)
    Case "Edit2"; 2.Input
    GUICtrlSetState($STADT, $GUI_FOCUS)
    Case "Edit3";3. Inpout
    GUICtrlSetState($Auslesen, $GUI_FOCUS)
    Case "Button1"
    Auslesen()
    GUICtrlSetState($VORNAME, $GUI_FOCUS)
    EndSwitch
    EndFunc ;==>Enterkey
    Func Terminate()
    Exit
    EndFunc ;==>Terminate?

    [/autoit]

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr