Переміщення timage за формою під час роботи програми - статті

Переміщення TImage за формою під час роботи програми

Багато, напевно, стикалися з проблемою переміщення Image'a за формою. Вирішити її можна трьома способами (може є і більше).

Тепер напишемо обробник OnMouseDown для нашої картинки:

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

У цій ділянці коду перевіряється якою кнопкою натиснули на картинку. Якщо лівої, то запам'ятовуємо координати, а якщо будь-який інший, то переміщати не можна.

Тепер напишемо обробник OnMouseMove для нашої картинки:

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

Ну і нарешті обробник OnMouseUp для нашої картинки буде таким:

procedure TForm1.Image1MouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
move: = false;
end;

Тут все дуже просто. Коли кнопка відпускається, то змінної move присвоюється значення false, щоб до наступного кліка по картинці її не можна було зрушити.

Цей спосіб досить простий, як для розуміння, так і для реалізації. Але такий же алгоритм переміщення можна реалізувати трохи красивіше. У деяких компонентів, в тому числі і Image, є така класна процедура SetBounds (Left, Top, Width, Height), яка може змінювати відразу всі чотири параметра. Таким чином подія OnMouseMove можна змінити так:

Але є ще один дуже цікавий вихід: по екрану можна переміщати не саму картинку, а тільки її рамку, коли користувач вибере місце для картинки і відпустить кнопку - вона туди переміститися. Для цього нам знадобиться ще одна глобальна змінна: rec: TRect, яка буде зберігати параметри картинки. Тепер злегка змінимо обробники подій для картинки. Таким чином все в цілому буде виглядати так:

procedure TForm1.Image1MouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Form1.Canvas.DrawFocusRect (rec);
with image1 dobegin
setbounds (rec.left + x-x0, rec.top + y-y0, width, height); // переміщаємо картинку
move: = false;
end;
end;

Оскільки DrawFocusRect малює рамку методом Xor, то при повторному виклику цієї функції з тими ж параметрами, рамка стирається.

Цей дуже красивий метод додасть у ваші програми багато цікавого. Так що користуйтеся.

Для вставки посилання на цю статтю на іншому сайті використовуйте наступний HTML-код:

Схожі статті