Delphi Уроки: Drag&Drop, учимся перетаскивать картинку по форме

Опубиковано: 02.12.2008 г., автор: , просмотров: 43448

Delphi Уроки: Drag&Drop учимся перетаскивать картинку по форме

В этом уроке будем учиться с помощью мышки перетаскивать по форме компонент Image.

1. Создаем новый проект на форму кидаем компонент Image с закладки Additional. Сразу загрузите в image какую ни будь картинку!

2. Для начала давайте определимся с тем каким образом пользователь будет перемещать объект по форме. Я предлагаю сделать так: если нажата кнопка мышки и удерживается клавиша Ctrl то можем перетаскивать. Для этого на компоненте Image создаем обработчик событий OnMouseDown, в котором пропишем вот такую строку

if ssCtrl in Shift then Image1.BeginDrag(True) ;

Т.Е при нажатии кнопки мышки проверяем условие: если нажата клавиша CTRL то можем перетаскивать

Во время перетаскивания компонента Image над формой, а также при отпускании кнопки, у Формы возникает событие:
OnDragOver - В котором мы должны сказать форме примет ли она данный элемент(В нашем случае Image)

Итак, создадим на форме обработчик событий OnDragOver и в нем пропишем вот такую строку

Accept:= (Source is TImage) ; // Разрешаем принимать компонент Image

3. Теперь нам осталось лишь сообщить программе что нужно делать, когда пользователь отпустил кнопку т.е завершил перетаскивание. Для этих целей существует событие OnDragDrop В обработчик этого события передаются параметры Source (объект-источник) и X и Y координаты курсора. В общем создаем обработчик событий OnDragDrop на форме и между begin .. end пишем:

if Source is TImage then // Если перетаскиваем компонент Image то
begin
TImage(Source).Left := X; //Переместить компонент Image в координаты //курсора по X
TImage(Source).Top := Y; //Переместить компонент Image в координаты //курсора по Y
end;

Вот и все можите запускаться!!! Если кто не понял зачем нужна такая функция, приведу простой пример - это все ровно что использовать памятники из гранита и мрамора тут вроде тяжелые, но в тоже время без них не как не обойтись... тоже самое и в современной программе без перетаскивания (Drag&Drop) никуда !

P.S. Полный код примера:

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source is TImage then
begin
TImage(Source).Left := X;
TImage(Source).Top := Y;
end;
end;

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TImage) ;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then Image1.BeginDrag(True) ;
end;

До встречи DelphiExpert.ru !!!



Похожие материалы

Последние из рубрики

Андрей 04 Dec 2010 в 00:00 #
Можно и проще в обработчике событий MousDown того компонента нажимая на который будем перетаскивать форму прописать это :
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture; // освобождает захват мыши окном в текущем потоке и восстанавливает обычную обработку ввода данных от мыши
Perform(WM_SysCommand,$F012,0);

end;
Виталий 11 Nov 2010 в 00:00 #
Чтоб переместить и Label1 добавь в FormDragDrop
Label1.Left:=X;
Label1.Top := Y;
и надпись сама встанет на место картинки
Виталий 11 Nov 2010 в 00:00 #
А вообще -

implementation
var x0,y0:integer;
move:boolean;
{$R *.DFM}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button<>mbLeft then move:=false //если нажали не левой кнопкой, то перемещать не будем!
else begin
move:=true;
x0:=x; //запоминаем начальные координаты
y0:=y; //запоминаем начальные координаты
end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if move then begin
image1.Left:=image1.Left+x-x0; // Изменяем позицию левого края
image1.Top:=image1.Top+y-y0; // Изменяем позицию верхнего края
end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
move:=false;
end;
Александр 06 Jun 2010 в 00:00 #
что-то не работает у меня когда с таймером делаю... не могу понять, что :(
васек 07 Apr 2010 в 00:00 #
а как ваще картинку вставит???

ОтменитьДобавить комментарий