DragOver/DragDrop という 2 つのイベントをエディターに割り当てることで、なんとか目標を達成できると思います。
1/ DragOver イベントで有効性をテストし、 GetPositionOfMouseを呼び出してキャレットも移動します
Procedure TForm1.EditorDragOver(Sender,Source: TObject;X,Y: Integer; State: TDragState; Var Accept: Boolean);
Var
LCoord: TBufferCoord;
LMemo: TSynMemo;
Begin
LMemo := TSynMemo(Sender);
// In your case you would rather test something with your tree...
Accept := Clipboard.AsText <> '';
// "As you drag over the TSynEdit, the caret should mark the current drop position": OK
If LMemo.GetPositionOfMouse(LCoord) Then
LMemo.CaretXY := LCoord;
End;
2/ DragDrop イベントでエディター コマンドを使用して、選択をクリアし、文字を挿入します。
Procedure TForm1.EditorDragDrop(Sender, Source: TObject; X,Y: Integer);
Var
LMemo: TSynMemo;
Begin
LMemo := TSynMemo(Sender);
// "When the text is dropped, it should replace any text that is currently highlighted." : OK
If LMemo.SelAvail Then
LMemo.ExecuteCommand( ecDeleteChar , #0, Nil );
// Paste, same comment as previously, here it's just an example...
LMemo.ExecuteCommand( ecPaste, #0, Nil );
End;
これは、コンテキストに応じて少し調整する必要があります。