Drag&Drop - Text in einem Edit an Mauszeigerposition einfügen

    • Offizieller Beitrag

    Hi,
    nachdem ich nun eine Lösung habe, Text in ein Edit zu ziehen, ohne den alten Inhalt zu löschen, möchte ich auch die Möglichkeit haben, den Text an der aktuellen Mauszeigerposition einzufügen. So, wie man es aus anderen Anwendungen kennt, einfach ein Wort zwischen zwei andere ziehen.
    Meine momentane Lösung erfordert, dass ich vorab im Edit an die Zielposition klicke. Das gefällt mir aber nicht.
    Ich habe bis jetzt aber keinen Ansatz gefunden, wie ich aus der Cursorposition auf die Zeichenposition im Edit schließen kann.
    Vielleicht habt ihr ja eine Idee.
    Das ist meine bisherige Lösung:

    Spoiler anzeigen
    [autoit]

    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiEdit.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)
    Global $content, $sel

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

    $Form1 = GUICreate("Form1", 690, 222, 195, 115)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_down')
    GUISetOnEvent($GUI_EVENT_DROPPED, '_dropped')
    $ListView1 = GUICtrlCreateListView("Tabelle", 455, 8, 230, 189)
    GUICtrlSendMsg(-1, 0x101E, 0, $LVSCW_AUTOSIZE_USEHEADER )
    $LVTable = GUICtrlGetHandle($ListView1)
    $Edit1 = GUICtrlCreateEdit("Bla-Bla ", 8, 8, 441, 189)
    GUICtrlSetState($Edit1, $GUI_DROPACCEPTED)
    $hEdit = GUICtrlGetHandle($Edit1)
    For $i = 1 To 10
    _GUICtrlListView_AddItem($LVTable, 'Eintrag ' & StringRight('0' & $i, 2))
    Next
    GUISetState()

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

    While True
    Sleep(100)
    WEnd

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

    Func Form1Close()
    Exit
    EndFunc
    Func _down()
    $content = GUICtrlRead($Edit1)
    $sel = _GUICtrlEdit_GetSel($hEdit) ; Cursorposition im Edit
    EndFunc
    Func _dropped()
    Local $sLeft = '', $sRight = ''
    If @GUI_DropId <> $Edit1 Then Return
    If @GUI_DragId = $ListView1 Then _
    Local $strAppend = _GUICtrlListView_GetItemText($LVTable, _GUICtrlListView_GetSelectedIndices($LVTable))
    ; löscht alten Inhalt:
    ;~ _GUICtrlEdit_InsertText($hEdit, ' ' & $strAppend, $sel[0])

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

    ; fügt am Ende an:
    ;~ _GUICtrlEdit_AppendText($hEdit, $content & ' ' & $strAppend)

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

    ; fügt an Cursorposition ein, ich muß aber vorm Ziehen die Zielposition markieren:
    $sLeft = StringLeft($content, $sel[0])
    If $sel[0] < StringLen($content) Then $sRight = StringRight($content, StringLen($content)-$sel[0])
    $content = $sLeft & ' ' & $strAppend & ' ' & $sRight
    _GUICtrlEdit_AppendText($hEdit, $content)
    EndFunc

    [/autoit]
  • Hi,
    hab mich mal wieder daran probiert - aber leider ohne Erfolg.
    Dachte man könnte die Mauspos erfragen und dann dort einen Klick setzen.
    Doch leider verschwindet der alte Text in dem sofort, wenn man die Maus losläßt ?(