State: TDragState; var Accept: Boolean);
begin
if (Source <> Sender) then Accept:=Source is TListBox
else Accept:=false;
end; Здесь мы сравниваем является ли перетаскиваемых объект и его источник одним и тем же объектом, и если это не так, то дальше нам надо проверить является ли источник компонентом класса TListBox. Если это истина, то мы разрешаем прием информации. Теперь нам необходимо написать обработчик события OnDragDrop , который определяет процедуру приема информации. Он также будет одинаковым для всех компонент и написан соответственно в общем виде (чтобы его можно было применить в нашей программе сразу ко всем компонентам). Нам надо добавить в список перетаскиваемую строку. Поэтому код получился примерно такой: procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
(Sender as TListBox).Items.Add((Source as TListBox).Items[(Source as TListBox).ItemIndex]);
end; Здесь с помощью метода (Sender as TListBox).Items.Add в список Sender добавляется строка. Мы воспользовались операцией as , чтобы указать на класс TListBox, который в отличии от класса TComponent, обладает свойством Items. Не забудьте, что свойство dragMode , у всех списков должно быть равно dmAutomatic. Вот и готов простой пример обмена строк между несколькими списками ListBox. Теперь мы посмотрим, как нам в ручную запустить процесс перетаскивания. Установите для одного из списков свойство dragMode в dmManual, а теперь в обработчике события OnMouseDown, напишите следующее: procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and (ssAlt in Shift) then
ListBox1.BeginDrag(false);
end; Здесь мы начинаем перетаскивать объект если нажата левая кнопка мыши и удерживается клавша Alt. В этом примере в BeginDrag передано значение false, это говорит о том, что процесс перетаскивания начнется только после движения курсора мыши. Если передать true - то перетаскивание начнется немедленно. С таким же успехом можно организовать перетаскивание изображения и прием его, скажем, на панели. Вот обработчики событий OnDragDrop и OnDragOver для панели (TPanel) и картинки (TImage): procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
WITH Source AS TImage DO
BEGIN
Left := X;
Top := Y;
Parent:=Panel1; // или Form1 если надо принять на форме с именем Form1
END;
end;
procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Source IS TImage;
end; При этом надо в Image загрузить какое-нибудь изображение, задать свойство dragMode равным dmAutomatic.