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 !!!



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

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

    NuraLi 06 Jul 2013 в 00:00 #
    ne sluwaite, zaidite na youtube tam xorow pokazan drag&drop na delphi
    Данил 17 Nov 2012 в 00:00 #
    Андрей а как подмправить ту позицию картинки?
    Боб 01 Oct 2012 в 00:00 #
    если надо перетащить элемент то создаем процедуру onMouseDown для элемента, за коротый будем таскать, и пишем туда вот это:

    releasecapture;
    <перемещ_компонент>.perform(wm_syscommand, $f012, 0);
    Усан 23 May 2012 в 00:00 #
    procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
    State: TDragState; var Accept: Boolean);
    begin
    Accept:= (Source is TImage) ; // ????????? ????????? ????????? Image
    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    //??????? ScreenToClient ???????????? ???????? ?????????? ????????? ????? ?? ?????? ? ?????????? ??????? ???????
    Image1.Left:= Mouse.CursorPos.X+ScreenToClient(Form1.FDesignSize).X;
    Image1.Top:= Mouse.CursorPos.Y+ScreenToClient(Form1.FDesignSize).Y;
    end;

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

    procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    Timer1.Enabled:=false;
    end;
    Усан 23 May 2012 в 00:00 #
    Хотяяяя по сути хватит и этого:

    В событии формы OnDragOver пишите
    begin
    Accept:= (Source is TImage) ; // Разрешаем принимать компонент Image
    end;

    Добавьте таймер, кликните по нему дважды (Timer1Timer) пропишите:
    //Функция ScreenToClient переделывает экранные координаты указанной точки на экране в координаты рабочей области
    Image1.Left:= Mouse.CursorPos.X+ScreenToClient(Form1.FDesignSize).X;
    Image1.Top:= Mouse.CursorPos.Y+ScreenToClient(Form1.FDesignSize).Y;


    В событии Image1 OnMouseDown пишите
    Image1.BeginDrag(True);
    Timer1.Enabled:=true;


    В событии Image1 OnMouseUp пишите
    Timer1.Enabled:=false;

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