Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.06.2009, 14:24
Аватар для Ayas
Ayas Ayas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 3
Репутация: 10
По умолчанию Snap to Grid (перемещение объекта по сетке)

всем привет!
помогите пожалуйста реализовать код перемещения визуального объекта на форме по сетке

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TMouseAction = (maNone, maMove, maResize);
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private

    FMouseAction: TMouseAction;
    FGridX, FGridY: Integer;
    FSnapToGrid: Boolean;
    FMoveStart: TPoint;
    FComponent: record
      X, Y, Width, Height: Integer;
    end;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  with FComponent do
  begin
    X := 23;
    Y := 47;
    Width := 278;
    Height := 138;
  end;
  FMouseAction := maNone;
  FGridX := 10;
  FGridY := 10;
  FSnapToGrid := True;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FMoveStart := Point(X, Y);
  if (X >= FComponent.X) and (X <= FComponent.X + FComponent.Width) and
     (Y >= FComponent.Y) and (Y <= FComponent.Y + FComponent.Height) then
    FMouseAction := maMove;
  FormPaint(Sender);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  MX, MY, GX, GY: Integer;
begin
  if FMouseAction = maMove then
  begin
    MX := FComponent.X - FMoveStart.X + X;
    MY := FComponent.Y - FMoveStart.Y + Y;
    if FSnapToGrid then
    begin
      // перемещение по сетке
      GX := Round(MX / FGridX) * FGridX;
      GY := Round(MY / FGridY) * FGridY;
      if Abs(FComponent.X - MX) >= FGridX then
        FComponent.X := GX;
      if Abs(FComponent.Y - MY) >= FGridY then
        FComponent.Y := GY;
    end
    else
    begin
      FComponent.X := MX;
      FComponent.Y := MY;
    end;
  end;
  FMoveStart := Point(X, Y);
  Repaint;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FMouseAction := maNone;
end;

procedure TForm1.FormPaint(Sender: TObject);
var I, J: Integer;
begin
  I := 0;
  while I < Height do
  begin
    J := 0;
    while J < Width do
    begin
      Canvas.Pixels[J, I] := clBlack;
      Inc(J, FGridX);
    end;
    Inc(I, FGridY);
  end;
  Canvas.Rectangle(FComponent.X, FComponent.Y,
                   FComponent.X + FComponent.Width,
                   FComponent.Y + FComponent.Height);
end;

end.

проблема здесь:
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  MX, MY, GX, GY: Integer;
begin
  if FMouseAction = maMove then
  begin
    MX := FComponent.X - FMoveStart.X + X;
    MY := FComponent.Y - FMoveStart.Y + Y;
    if FSnapToGrid then
    begin
      // перемещение по сетке
      GX := Round(MX / FGridX) * FGridX;
      GY := Round(MY / FGridY) * FGridY;
      if Abs(FComponent.X - MX) >= FGridX then
        FComponent.X := GX;
      if Abs(FComponent.Y - MY) >= FGridY then
        FComponent.Y := GY;
    end
    else
    begin
      FComponent.X := MX;
      FComponent.Y := MY;
    end;
  end;
  FMoveStart := Point(X, Y);
  Repaint;
end;

этот код работает, но не так как надо, перемещение объекта происходит только при резком перемещении мыши, парюсь уже двое суток и ничто не могу придумать, гугл ничего существенного не находит, если кто сталкивался с такой проблемой или знает решение - помогите плиз!

заранее благодарен!
Ответить с цитированием
  #2  
Старый 17.06.2009, 19:04
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Так попробуйте.
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  MX, MY, GX, GY: Integer;
begin
  if FMouseAction = maMove then
  begin
    MX := FComponent.X - FMoveStart.X + X;
    MY := FComponent.Y - FMoveStart.Y + Y;
    if FSnapToGrid then
    begin
      // перемещение по сетке
      GX := Round(MX / FGridX) * FGridX;
      GY := Round(MY / FGridY) * FGridY;
      FMoveStart := Point(GX - FComponent.X + FMoveStart.X,
                          GY - FComponent.Y + FMoveStart.Y);
      FComponent.X := GX;
      FComponent.Y := GY;
    end
    else
    begin
      FComponent.X := MX;
      FComponent.Y := MY;
      FMoveStart := Point(X, Y);
    end;
  end;
  Repaint;
end;
Ответить с цитированием
  #3  
Старый 17.06.2009, 19:22
Аватар для Ayas
Ayas Ayas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 3
Репутация: 10
По умолчанию

это не помогает
Ответить с цитированием
  #4  
Старый 17.06.2009, 19:38
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Вы уверены? o_O Я же проверяю прежде чем советовать.
Или я не поняла, что требуется? У меня после внесенных изменений прямоугольник стал перемещаться без рывков мыши, в точности как в Delphi по форме во время дизайна...

P.S. Просто возьмите свой исходный код, который вы выложили выше и замените процедуру FormMouseMove на ту, что с моими исправлениями. Работает как надо, вроде...

Последний раз редактировалось Nyctos Kasignete, 17.06.2009 в 19:43.
Ответить с цитированием
  #5  
Старый 17.06.2009, 20:33
Аватар для Ayas
Ayas Ayas вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 3
Репутация: 10
По умолчанию

ой, сорри, сенк, просто предоставленый мной код для одной фигуры, в оригинальном их много и обрабатывается в цикле, запутался там, сенк, сенк, сенк
Ответить с цитированием
  #6  
Старый 26.08.2009, 10:11
mskvkin mskvkin вне форума
Новичок
 
Регистрация: 31.08.2008
Сообщения: 99
Репутация: 10
По умолчанию

а как сделать такое же перемещение для компонентов???
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025