А OnDragDrop будет выглядеть так:
Code: |
var s: string; begin if Source = ListBox1 then begin ListBox2.Items.Add(ListBox1.Items[ListBox1.ItemIndex]); ListBox1.Items.Delete(ListBox1.ItemIndex); //удаляем перенесенный элемент end else //внутренняя перестановка begin s := ListBox2.Items[ListBox2.ItemIndex]; ListBox2.Items.Delete(ListBox2.ItemIndex); ListBox2.Items.Insert(ListBox2.ItemAtPos(Point(X, Y), False), s); //находим, в какую позицию переносить и вставляем end; end; |
Научимся переносить текст в Memo, вставляя его в нужное место. Поскольку я выбрал в качестве источника любой из ListBox, подключим в Инспекторе Объектов для OnDragOver уже написанный ранее обработчик ListBox2DragOver, а в OnDragDrop напишем
Code: |
if not CheckBox1.Checked then // при включении добавляется в конец текста begin Memo1.SelStart := LoWord(Memo1.Perform(EM_CHARFROMPOS, 0, MakeLParam(X,Y))); // устанавливаем позицию вставки согласно координатам мыши Memo1.SelText := TListBox(Source).Items[TListBox(Source).ItemIndex]; end else memo1.lines.add(TListBox(Source).Items[TListBox(Source).ItemIndex]); |
Замечу, что для RichEdit EM_CHARFROMPOS работает несколько иначе, что продемонстрировано в следующем примере. Перенос из Memo реализован с помощью правой кнопки мыши, для того, чтобы не изменять стандартное поведение Memo, и поскольку нажатие левой кнопки снимает выделение. Для Memo1 установлено DragMode = dmManual, а перетаскивание инициируется в OnMouseDown
Code: |
if (Button = mbRight) and (Memo1.SelLength > 0) then Memo1.BeginDrag(True); |
Обработчик RichEdit1DragOver очевиден, а в RichEdit1DragDrop пишем
Code: |
var p: tpoint; begin if not CheckBox1.Checked then begin p := point(x, y); RichEdit1.SelStart := RichEdit1.Perform(EM_CHARFROMPOS, 0, Integer(@P)); RichEdit1.SelText := Memo1.SelText; end else RichEdit1.Lines.Add(Memo1.SelText); end; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!