Перейти к содержанию
Fire Monkey от А до Я
  • 0

Можно ли перемещать элементы по форме


sviat9440

Вопрос

Добрый день,столкнулся с такой задачей: можно ли перемещать элемент по форме, и чтобы за ним тянулась линия от точки старта? т.е. как мы перемещаем окно по рабочему столу, так и например: кнопку, по форме.

Ссылка на комментарий
  • Ответы 65
  • Создана
  • Последний ответ

Лучшие авторы в вопросе

Популярные дни

Лучшие авторы в вопросе

Изображения в теме

Рекомендуемые сообщения

  • 0

отпечатки эти потому что не перерисовывается форма. Вам нужно рисовать в событие OnPaint у формы, а при событии MouseMove заставлять форму перерисовываться. по-моему RealignContent.

Ссылка на комментарий
  • 0

отпечатки эти потому что не перерисовывается форма. Вам нужно рисовать в событие OnPaint у формы, а при событии MouseMove заставлять форму перерисовываться. по-моему RealignContent.

И как ее заставить? У меня эта команда подчеркивается :blink:

Ссылка на комментарий
  • 0

Или Form1.Invalidate. Есть еще метод InvalidateRect Для перерисовки прямоугольного фрагмента формы.

Он что то там рисует в верхнем левом углу формы. Какие то линии в ту торону, куда я двигаю предмет.

Ссылка на комментарий
  • 0

 

Я заменил на: 

 

 

 
procedure TForm3.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  xOffset:=TButton(Sender).Position.X;
  yOffset:=TButton(Sender).Position.y;
end;

Как насчет того, чтобы для точности линнии вместо положения кнопки указывать положение ее центра?

Ссылка на комментарий
  • 0

 

 

Я заменил на: 

 

 

 
procedure TForm3.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Single);
begin
  xOffset:=TButton(Sender).Position.X;
  yOffset:=TButton(Sender).Position.y;
end;

Как насчет того, чтобы для точности линнии вместо положения кнопки указывать положение ее центра?

 

А как?

Ссылка на комментарий
  • 0

Можно так?

 

procedure TForm3.Button1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Single);
begin
  xOffset:=TButton(Sender).Position.X + (TButton(Sender).Width / 2) ;
  yOffset:=TButton(Sender).Position.y + (TButton(Sender).Height / 2);
end;
Изменено пользователем sviat
Ссылка на комментарий
  • 0

Все, разобрался! Спасибо.

 

А как реализовать функцию, чтобы кнопку можно было перетянуть только в одно из трех мест?

Выше xenon54 писал об этом.

  xOffset:=TButton(Sender).Position.X + (TButton(Sender).Width / 2) ;

  yOffset:=TButton(Sender).Position.y + (TButton(Sender).Height / 2);
 

Именно так

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

 

Можно так?

 

procedure TForm3.Button1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Single);
begin
  xOffset:=TButton(Sender).Position.X + (TButton(Sender).Width / 2) ;
  yOffset:=TButton(Sender).Position.y + (TButton(Sender).Height / 2);
end;

 

Или наоборот

Ссылка на комментарий
  • 0

 

 

Можно так?

 

procedure TForm3.Button1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Single);
begin
  xOffset:=TButton(Sender).Position.X + (TButton(Sender).Width / 2) ;
  yOffset:=TButton(Sender).Position.y + (TButton(Sender).Height / 2);
end;

 

Или наоборот

 

Все правильно.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Важно понять, что форма перерисовывается постоянно. То что вы рисуете на канве формы в методе OnPaint то остается ровно до тех пока в следующий раз не вызовится метод отрисовки формы, в котором вы уже не участвуете. Т.е. если вы хотите что бы линии оставались, то вы всегда должны участвовать в отрисовке.

Ссылка на комментарий
  • 0

Я не целиком знаком с Вашей задумкой, но как вариант:
Для каждой кнопки также объявить логическую переменную, которая будет отвечать за то, двигали ли уже этой кнопкой.

В событии OnMouseMove присвоить логической переменной этой кнопки true и переменным, соответствующим этой кнопке координаты ее центра.

В событии OnPaint формы для каждой кнопки проверять, если логическая переменная true, то рисуем линию по координатам соответствующей кнопки. 

 

Да, как заметил xenon54, ключевой момент - в OnPaint нужно все время отрисовывать то, что Вы хотите видеть.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Сделал набросок. Надеюсь разберетесь.
 

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Single);
    procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Single);
    procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buttons: array[1..10] of TButton;
  X1,Y1,X2,Y2: array[1..10] of single;
  xOffset,yOffset: single;

implementation

{$R *.fmx}

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var i: byte;
begin
  xOffset:=X;
  yOffset:=Y;
  for i:=1 to 10 do if (Buttons[i] as TControl)=Sender then begin
      X1[i]:=TButton(Sender).Position.X+X;
      Y1[i]:=TButton(Sender).Position.Y+Y;
      break;
  end;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Single);
var i: byte;
begin
  if (ssLeft in Shift) then
  with (Sender as TControl) do begin
      Position.Y := Position.Y+Y-yOffset;
      Position.X := Position.X+X-xOffset;
  end;

  for i:=1 to 10 do if Buttons[i]=Sender then begin
      X2[i]:=TButton(Sender).Position.X+TButton(Sender).Width/2;
      Y2[i]:=TButton(Sender).Position.Y+TButton(Sender).Height/2;
      break;
  end;
  form1.Invalidate;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i: byte;
begin
    randomize;
    for i:=1 to 10 do begin
        Buttons[i]:=TButton.Create(Form1);
        with Buttons[i] do begin
            Parent:=Form1;
            Width:=60;
            Height:=20;
            Text:='Button'+inttostr(i);
            Position.Point:=PointF(random(Form1.Width-Round(Width)),random(Form1.Height-Round(Height)));
            X1[i]:=Position.X+Width/2; X2[i]:=X1[i];
            Y1[i]:=Position.Y+Height/2; Y2[i]:=Y1[i];
            OnMouseDown:=Button1MouseDown;
            OnMouseMove:=Button1MouseMove;
        end;
    end;
    form1.Invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
var i: byte;
begin
  for i:=1 to 10 do Canvas.DrawLine(PointF(X1[i],Y1[i]),PointF(X2[i],Y2[i]),1);
end;

end.

Изменено пользователем Alex7wrt
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...