sviat9440 Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Добрый день,столкнулся с такой задачей: можно ли перемещать элемент по форме, и чтобы за ним тянулась линия от точки старта? т.е. как мы перемещаем окно по рабочему столу, так и например: кнопку, по форме. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 отпечатки эти потому что не перерисовывается форма. Вам нужно рисовать в событие OnPaint у формы, а при событии MouseMove заставлять форму перерисовываться. по-моему RealignContent. Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 (изменено) Или Form1.Invalidate. Есть еще метод InvalidateRect Для перерисовки прямоугольного фрагмента формы. Изменено 4 мая, 2015 пользователем Alex7wrt Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 отпечатки эти потому что не перерисовывается форма. Вам нужно рисовать в событие OnPaint у формы, а при событии MouseMove заставлять форму перерисовываться. по-моему RealignContent. И как ее заставить? У меня эта команда подчеркивается Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 Или Form1.Invalidate. Есть еще метод InvalidateRect Для перерисовки прямоугольного фрагмента формы. Он что то там рисует в верхнем левом углу формы. Какие то линии в ту торону, куда я двигаю предмет. Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 А, я понял ошибку: я в стартовое значение вместо положения кнопки на форме, прописывал положение мышки на кнопке при клике Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 И как ее заставить? У меня эта команда подчеркивается Попробуйте Form1.Realign Цитата Ссылка на комментарий
0 xenon54 Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Вместо RealignContent Form1.Invalidate Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 Я заменил на: 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 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Я заменил на: 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 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 Все, разобрался! Спасибо. А как реализовать функцию, чтобы кнопку можно было перетянуть только в одно из трех мест? Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 Я заменил на: 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 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 (изменено) Можно так? 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; Изменено 4 мая, 2015 пользователем sviat Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 (изменено) Все, разобрался! Спасибо. А как реализовать функцию, чтобы кнопку можно было перетянуть только в одно из трех мест? Выше xenon54 писал об этом. xOffset:=TButton(Sender).Position.X + (TButton(Sender).Width / 2) ; yOffset:=TButton(Sender).Position.y + (TButton(Sender).Height / 2); Именно так Изменено 4 мая, 2015 пользователем Alex7wrt Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 Можно так? 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 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 (изменено) Можно так? 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; Или наоборот Все правильно. Изменено 4 мая, 2015 пользователем Alex7wrt Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 А если я передвину несколько кнопок, то линия сбросится. А как сделать чтобы у меня от каждой кнопки по одной линии отрисовывалось Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Создавать переменные для каждой кнопки Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 На форме сбрасывается линия. Можно ли отрисовывать линии на разных слоях? Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Гораздо проще для каждой кнопки объявить свою пару переменных, которые отвечают за координаты линии. Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 4 мая, 2015 Автор Поделиться Опубликовано 4 мая, 2015 А как? Я наверно чтото неправильно делаю, потому что у меня все равно сбрасывается. Цитата Ссылка на комментарий
0 xenon54 Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 Важно понять, что форма перерисовывается постоянно. То что вы рисуете на канве формы в методе OnPaint то остается ровно до тех пока в следующий раз не вызовится метод отрисовки формы, в котором вы уже не участвуете. Т.е. если вы хотите что бы линии оставались, то вы всегда должны участвовать в отрисовке. Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 4 мая, 2015 Поделиться Опубликовано 4 мая, 2015 (изменено) Я не целиком знаком с Вашей задумкой, но как вариант: Для каждой кнопки также объявить логическую переменную, которая будет отвечать за то, двигали ли уже этой кнопкой. В событии OnMouseMove присвоить логической переменной этой кнопки true и переменным, соответствующим этой кнопке координаты ее центра. В событии OnPaint формы для каждой кнопки проверять, если логическая переменная true, то рисуем линию по координатам соответствующей кнопки. Да, как заметил xenon54, ключевой момент - в OnPaint нужно все время отрисовывать то, что Вы хотите видеть. Изменено 4 мая, 2015 пользователем Alex7wrt Цитата Ссылка на комментарий
0 sviat9440 Опубликовано 5 мая, 2015 Автор Поделиться Опубликовано 5 мая, 2015 А можно простенький пример? я вроде и понимаю о чем вы, но на практике реализовать не могу. Цитата Ссылка на комментарий
0 Alex7wrt Опубликовано 5 мая, 2015 Поделиться Опубликовано 5 мая, 2015 (изменено) Сделал набросок. Надеюсь разберетесь. 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. Изменено 5 мая, 2015 пользователем Alex7wrt Цитата Ссылка на комментарий
0 xenon54 Опубликовано 5 мая, 2015 Поделиться Опубликовано 5 мая, 2015 "beginscene" в методе Paint, на сколько мне известно, не нужно. Alex7wrt 1 Цитата Ссылка на комментарий
Вопрос
sviat9440
Добрый день,столкнулся с такой задачей: можно ли перемещать элемент по форме, и чтобы за ним тянулась линия от точки старта? т.е. как мы перемещаем окно по рабочему столу, так и например: кнопку, по форме.
Ссылка на комментарий
Лучшие авторы в вопросе
7
1
21
35
Популярные дни
4 май
48
5 май
18
Лучшие авторы в вопросе
xenon54 7 постов
VladimirS 1 пост
Alex7wrt 21 постов
sviat9440 35 постов
Популярные дни
4 май 2015
48 постов
5 май 2015
18 постов
Популярные посты
xenon54
"beginscene" в методе Paint, на сколько мне известно, не нужно.
Изображения в теме
65 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.