Отправляет email-рассылки с помощью сервиса Sendsay

Советы по Delphi

  Все выпуски  

Советы по Delphi


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Здравствуйте, уважаемые подписчики! В этом выпуске кроме основной темы появится новая рубрика "Полезные мелочи". В ней я хочу рассказать о каких-то простых особенностях 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 begin
    with 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);
begin
  if 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;
begin
  if 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.


Все советы и замечания, пожалуйста, присылайте на delphi4all@narod.ru

Всего доброго,
Даниил Карапетян.






http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное