1026_____________________________________________Глава 15

Далее для одного из списков пишется обработчик события OnDragDrop вида:

void_fastcall TFormI::ListBoxIDragDrop(TObject *Sender,

TObject *Source, int X, int Y)
{

TListBox *S = (TListBox *)Source;

((TListBox*)Sender)->Items->Add(S->Items->Strings[S->ltemlndex]) ;

S->Items->Delete(S->ltemlndex);

)

Первые два оператора обработчика добавляют в список строку, выделенную в
списке-источнике. Если пишется не универсальный обработчик, а предназна-
ченный только для данного компонента, то первый оператор можно удалить, а
во втором ((TListBox*)Sender) и S заменить на имя компонента ListBoxl. Тре-
тий оператор удаляет перенесенную строку из источника (если требуется не
перенос, а только копирование строк из одного списка в другой, то этот опера-
тор не нужен).

Во всех остальных списках в событии OnDragDrop указывается этот же обра-
ботчик.

После этого, заполнив списки, можно запускать приложение. Пользователь
сможет перетаскивать строки между любыми имеющимися списками.

2. Если приведенный выше пример по каким-то соображениям желательно осу-
ществлять не в автоматическом режиме, а в режиме ручного управления (на-
пример, перетаскивание возможно только в каком-то конкретном режиме ра-
боты приложения), то отличия в реализации примера заключаются в следую-
щем.

Во всех списках задаются значения свойств DragMode. равные dmManual. Это
обеспечивает управление началом перетаскивания.

Затем в одном из списков задается обработчик события OnMouseDown вида:

void _fastcall TFormI::ListBox3MouseDown(TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)
(

if ((Button == mbLeft) && <проверка какого-нибудь условия>)
((TControl*)Sender)->BeginDrag(false,5);

}

В этом обработчике первое условие проверяет, что нажата именно левая кноп-
ка мыши, а в качестве второго можно задать какое-то условие, по которому на-
жатие кнопки мыши можно ассоциировать с началом перетаскивания (если
вы предусматриваете подобное условие). Затем методом BeginDrag начинается
перетаскивание. Поскольку в параметрах метода заданы значения false и 5, то
перетаскивание в действительности начнется только после сдвига мыши на 5
пикселей.

Во всех остальных списках в событии OnMouseDown указывается этот же об-
работчик.

Все остальные обработчики событий не отличаются от указанных в предыду-
щем примере.

3. Ряд примеров использования технологии перетаскивания Drag&Drop вы мо-
жете найти в главе 4 в разделе 4.4.

OnDragOver________________________________________

Событие относится ко времени, в течение которого пользователь перемещает
перетаскиваемый объект над компонентом