Содержание материала

 

Автор: Павел

 

Во время работы над одной программой предо мной встала задача организации перемещения нескольких изображений пользователем с помощью мыши. Я не крутой мастер DELPHI, и найденное мною решение не претендует на полноту, его недостатки я рассмотрю ниже, но я надеюсь, что опыт, приобретённый при решении будет полезен читателю.

 

Итак, задача. На форме размещены несколько изображений, загружаемых из внешних файлов (их имена 1.bmp, 2.bmp и т.д.).

 

Изображения должны быть перемещаемыми с помощью мыши.

 

Первое решение, пришедшее мне в голову - это решение "в лоб". Разместив на форме несколько Image, заставим их перемещаться вместе с мышью. Разместим на форме в нужных нам местах несколько (n) пустых Image, присвоим их свойству Tag значения от 1 до n - это пригодится при создании массива из них. Объявим следующие переменные:

Code:

implementation

 

var

Pic: array[1..n] of TImage; //Сюда мы занесём наши Image

x0, y0: integer; //Это будут координаты нажатия мыши

flag: boolean; //а это тоже полезная переменная - флажок

Для первого из наших Image создадим обработчики следующих событий

{Как вы уже догадались наша форма называется MainForm}

 

procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

if button <> mbLeft then

   flag := false

else

begin

   flag := true;

   x0 := x;

   y0 := y

end

end;

 

{ При нажатии левой клавиши мыши над нашим Image запомним координаты нажатия

и установим флажок. Это делается для того, чтобы Image перемещался только при

опущенной левой кнопке мыши}

 

procedure TMainForm.Image1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

flag := false

end;

 

{При отпускании кнопки мыши, не важно какой, сбросим флажок}

 

procedure TMainForm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if flag then

begin //Если флажок установлен, т.е. нажата левая копка мыши

   (Sender as TImage).Left := (Sender as TImage).Left + x - x0;

   (Sender as TImage).Top := (Sender as TImage).Top + y - y0

   //Наш Image начинает перемещаться

end;

end;

 

 

Обратите внимание, что перемещается не Image1, а Sender. Созданные нами процедуры будут применены для обработки перемещений всех изображений на форме. Для этого в процедуре создания формы запишем все Image на форме в массив Pic

Code:

procedure TMainForm.FormCreate(Sender: TObject);

var

i: byte;

begin

for i := 0 to MainForm.ComponentCount - 1 do

   if (MainForm.Components[i] is TImage) then

     Pic[MainForm.Components[i].Tag] := (MainForm.Components[i] as TImage);

{Здесь мы просматриваем компоненты формы и если рассматриваемый компонент

- TImage присваеваем его в массив Pic c индексом Tag}

for i := 1 to n do

begin

   Pic[i].Picture.LoadFromFile(IntToStr(i) + '.bmp'); //Загружаем изображение

   Pic[i].OnMouseDown := Image1MouseDown;

   Pic[i].OnMouseMove := Image1MouseMove;

   Pic[i].OnMouseUp := Image1MouseUp

   {Присваеваем нужные процедуры нужным событиям}

end

end;

 

{В принципе можно было бы обойтись одним циклом For, но, на мой взгляд

два цикла наглядней и проще для понимания}

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

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить