При перетаскивании объекта из элемента
При перетаскивании объекта из элемента
TreeView или
ListView вместе с курсором мыши перемещается полупрозрачное изображение объекта. Этот замечательный визуальный признак существует до тех пор, пока изображение не выйдет за пределы элемента. В этот момент — раз! — изображение исчезает и не появляется до тех пор, пока мышь снова не вернется в исходный элемент или не попадет в другой элемент
ListView или
TreeView.
Почему это происходит? В число факторов, определяющих поведение элемента, входит свойство
ControlStyle. В Delphi версий 2 и 3 появился новый стандартный флаг
csDisplayDragImage. Если
csDisplayDragImage входит в
ControlStyle, перетаскиваемое изображение выводится над элементом. В противном случае оно исчезает до тех пор, пока курсор не доберется до более «дружественной» территории. К сожалению, для большинства элементов значение
ControlStyle, принятое по умолчанию, не включает флага
csDisplayDragImage. Следовательно, если вы хотите, чтобы изображение не пропадало при перемещении, придется настроить все формы вашего проекта и все элементы, находящиеся на них, чтобы в их свойстве
ControlStyle
присутствовал флаг
csDisplayDragImage.
В листинге 9.18 приведена процедура
EnableDisplayDragImage, исправляющая значение
ControlStyle самого элемента, его дочерних элементов, «внуков» и т. д.
Чтобы каждый элемент формы поддерживал отображение перетаскиваемого объекта, включите в обработчик
FormCreate формы следующую строку:
EnableDisplayDragImage( Self, True );
Если ваша программа создает элементы динамически, не забудьте вызвать
EnableDisplayDragImage
и для них.
Листинг 9.18. Модуль ENABDISP.PAS
unit EnabDisp;
interface uses Controls;
procedure EnableDisplayDragImage( Control: TControl; ChildrenToo: Boolean );
implementation
procedure EnableDisplayDragImage( Control: TControl; ChildrenToo: Boolean ); var Index: Integer; begin with Control do ControlStyle := ControlStyle + [ csDisplayDragImage ];
if ChildrenToo and ( Control is TWinControl ) then with TWinControl( Control ) do for Index := 0 to ControlCount - 1 do begin EnableDisplayDragImage( Controls[ Index ], ChildrenToo ); end; end;
end.
Содержание раздела