Проектирование графического интерфейса пользователя______________265

void   fastcall TFormI::ListBoxlDragOver(TObject *Sender,

TObject *Source, int X, int Y, TDragState State, bool SAccept)
(

if(Sender != Source)
Accept = Source->ClassNameIs("TListBox") ;

else Accept = (false);

}

В нем сначала проверяется, не являются ли данный компонент (Sender) и пе-
ретаскиваемый объект (Source) одним и тем же объектом. Это сделано, чтобы избе-
жать перетаскивания информации внутри одного и того же списка. Если источник
и приемник являются одним и тем же объектом, то срабатывает else и параметр
Accept становится равным false, запрещая прием информации. Если же это раз-
ные объекты, то Accept делается равным true, если источником является какой-то
другой список (компонент класса TListBox), и равным false, если источник явля-
ется объектом любого другого типа. Таким образом компонент ListBoxl сообщает,
что готов принять информацию из любого другого списка.

Значение параметра Accept, задаваемое в обработчике события OnDragOver,
определяет вид курсора, перемещающегося при перетаскивании над данным компо-
нентом. Если в компоненте не описан обработчик события OnDragOver, то считается,
что данный компонент не может принять информацию перетаскиваемого объекта.

Процедура приема информации от перетаскиваемого объекта записывается в
обработчике события OnDragDrop принимающего компонента. Это событие насту-
пает, если после перетаскивания пользователь отпустил кнопку мыши над данным
компонентом. В обработчик этого события передаются параметры Source (объ-
ект-источник) и Х и Y координаты курсора. Если продолжить начатый выше при-
мер перетаскивания информации из одного списка в другой, то обработчик собы-
тия OnDragDrop может иметь вид:

void _fastcall TFormI::ListBoxlDragDrop(TObject *Sender,

TObject *Source, int X, int Y)
{

TListBox *S = (TListBox *)Source;

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

)

В этом обработчике первый оператор создает указатель S на объект класса
TListBox, и передает в него ссылку на объект Source, воспринимаемый как объект
TListBox. Это сделано просто для того, чтобы не повторять несколько раз в следую-
щем операторе приведение типа Source к указателю на объект класса TListBox. А
такое приведение типа необходимо по следующей причине. Параметр Source объ-
явлен как указатель на объект класса TObject. Но в этом классе отсутствуют свой-
ства Items и Itemlndex. Они имеются только в классе TListBox. Поэтому прежде,
чем обратиться к этим свойствам, надо произвести соответствующее приведение
типа Source. Подробнее это изложено в разделе 1.6.6.2 главы 1.

Второй оператор обработчика заносит методом Add выделенную строку спис-
ка-источника S в список-приемник Sender. В этом переносе информации из одного
списка в другой и заключается в нашем примере Drag&Drop.

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

void _fastcall TFormI::ListBoxIDragDrop(TObject *Sender,

TObject *Source, int X, int Y)
(
((TListBox*)Sender)->Items->Add(((TListBox *)Source)->

Items->Strings[((TListBox *)Source)->ltemlndex]);

)

После завершения или прерывания перетаскивания наступает событие
OnEndDrag, в обработчике которого можно предусмотреть какие-то дополнитель-