Здравствуйте, уважаемые подписчики! В этом выпуске кроме основной темы появится новая рубрика "Полезные мелочи". В ней я хочу рассказать о каких-то простых особенностях Delphi, которые могут упростить жизнь программисту.
Перетаскивание изображения мышью
Сегодня я покажу пример того, как реализовать "перетаскивание" изображения мышью, то есть сделать так, чтобы пользователь хватался за какую-нибудь точку изображения, не умещающегося в окне, и мог сдвинуть это изображение. Подобное реализовано во многих программах, например, в Adobe Photoshop.
Для начала нужно создать или загрузить какое-то изображение. Здесь я просто вывожу 30 надписей "text" под разными углами, размерами, цветами... В переменной p хранится координата точки изображения, отображающейся в левом верхнем углу окна. При нажатии на клавишу мыши меняется курсор и захватывается мышь, а в переменную po кладется координата точки, за которую пользователь "схватил" изображение. При движении мыши нужно копировать новые части изображения на форму. При этом нужно проверять, не утащил ли пользователь изображение слишком далеко. Для этого я использую процедуру CorrectPos. При отпускании мыши курсор восстанавливается и освобождается, а переменное p присваивается новое значение.
var
bm: TBitmap;
p: TPoint = (x: 0; y: 0);
po: TPoint;
moving: boolean = false;
procedure TForm1.FormCreate(Sender: TObject);
var
lf: TLogFont;
i: integer;
begin
bm := TBitmap.Create;
bm.Width := 500;
bm.Height := 500;
with bm.Canvas do begin
Pen.Width := 10;
Pen.Color := clLime;
Rectangle(5, 5, bm.Width - 5, bm.Height - 5);
end;
FillChar(lf, SizeOf(lf), 0);
randomize;
lf.lfCharSet := RUSSIAN_CharSet;
lf.lfFaceName := 'Arial';
for i := 1 to 30 do beginwith lf do begin
lfWidth := 20 + random(50);
lfHeight := 20 + random(50);
lfEscapement := random(3600);
lfWeight := random(1000);
lfItalic := random(2);
lfUnderline := random(2);
lfStrikeOut := random(2);
end;
with bm.Canvas do begin
Font.Handle := CreateFontIndirect(lf);
Font.Color := RGB(random(256), random(256), random(256));
p.x := random(500);
p.y := random(500);
TextOut(p.x, p.y, 'text');
DeleteObject(Font.Handle);
end;
end;
Form1.ClientWidth := 100;
Form1.ClientHeight := 100;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.CopyRect(Bounds(0, 0, ClientWidth, ClientHeight),
bm.Canvas, Bounds(p.x, p.y, ClientWidth, ClientHeight));
end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moving := true;
SetCapture(Form1.Handle);
Screen.Cursor := crSizeAll;
po := Point(X, Y);
end;
procedure CorrectPos(var np: TPoint);
beginif np.x < 0 then np.x := 0
else if np.x > bm.Width - Form1.ClientWidth
then if bm.Width > Form1.ClientWidth
then np.x := bm.Width - Form1.ClientWidth
else np.x := 0;
if np.y < 0 then np.y := 0
else if np.y > bm.Height - Form1.ClientHeight
then if bm.Height > Form1.ClientHeight
then np.y := bm.Height - Form1.ClientHeight
else np.y := 0;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
np: TPoint;
beginif not moving then Exit;
np := Point(p.x + po.x - X, p.y + po.y - Y);
CorrectPos(np);
Canvas.CopyRect(Bounds(0, 0, ClientWidth,
ClientHeight), bm.Canvas, Bounds(np.x, np.y,
ClientWidth, ClientHeight));
end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moving := false;
ReleaseCapture;
Screen.Cursor := crDefault;
inc(p.x, po.x - X);
inc(p.y, po.y - Y);
end;
Полезные мелочи
Чтобы в Delphi выделить колонку текста (это нужно, например, для изменения отступа сразу у большого количества строк), нужно при выделении нажать клавишу Alt. Пример:
1. В редакторе Delphi нажмите клавишу Alt, и, не опуская ее, попробуйте выделить мышью кусок текста. После начала выделения можно отпустить Alt. Получится выделенный прямоугольник.
2. Теперь скопируйте этот текст и вставьте в какое-нибудь новое место. Delphi раздвинет текст в этом месте, и вставит скопированный текст, сохранив отступы.
3. Нажмите клавишу Alt и выделите кусок текста при помощи клавиатуры. После начала выделения можно отпустить Alt. В дальнейшем этот режим останется таким и Alt нажимать больше не нужно. Чтобы выйти из этого режима, выделите кусок текста мышью без Alt.