С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 282
Delphi 6-7

Как перемещать объект по форме?

31.01.2020, 18:54. Показов 6036. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно перемещать объекты по форме в Delphi 7?
Тоесть к примеру я нажал на кнопку и удерживая ее перемещаю объект по форме в любое ее место.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.01.2020, 18:54
Ответы с готовыми решениями:

Как программно создать объект на другой форме?
Добрый вечер! Есть код, который должен создать компонент Lbl на другой форме(form4,lbl на ней объявлен), но код выдает ошибку: ...

Как найти в форме по имени динамически созданный объект TfrxReport?
Всем привет! Создаю в форме в цикле несколько объектов TfrxReport, присваивая им имена из переменной name_rep. var fr:TfrxReport; ...

Как перемещать объект по глобальной оси
Есть вращающийся объект. Просто перемещать его через Translate по оси не получается: из-за вращения ось перемещения смещается и объект...

11
5 / 5 / 6
Регистрация: 11.04.2015
Сообщений: 69
31.01.2020, 19:26
"к примеру я нажал на кнопку и удерживая ее перемещаю объект по форме в любое ее место"
и что - таким способом объект не перемещается?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
31.01.2020, 19:40
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
var
  Form1: TForm1;
  f:boolean;
  mX,mY:integer;
implementation
 
{$R *.dfm}
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
f:=true;
mx:=X;
my:=Y;
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if f then {если можно двигать, то двигаем}
 begin
  Button1.Left:=Button1.Left-(mX-X);
  Button1.Top:=Button1.Top-(mY-Y);
 end;
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
f:=false
end;
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,306
31.01.2020, 20:24
Лучший ответ Сообщение было отмечено qwertehok как решение

Решение

Так норм?

3
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 282
01.02.2020, 09:09  [ТС]
Verevkin, шутка прикольная но не в тему

Добавлено через 2 минуты
Вот еще код
Delphi
1
2
3
4
5
6
procedure TForm2.sPanel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
sPanel1.Perform(WM_SYSCOMMAND,$F012,0);
end;
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,356
Записей в блоге: 3
01.02.2020, 10:31
Цитата Сообщение от arsenkorotkin Посмотреть сообщение
я нажал на кнопку и удерживая ее перемещаю объект по форме в любое ее место
Цитата Сообщение от arsenkorotkin Посмотреть сообщение
шутка прикольная но не в тему
А почему "не в тему", стесняюсь спросить? Ровно то, что озвучено в ТЗ...
0
Злостный нарушитель
 Аватар для Verevkin
10249 / 5676 / 1262
Регистрация: 12.03.2015
Сообщений: 26,306
01.02.2020, 12:04
Цитата Сообщение от arsenkorotkin Посмотреть сообщение
шутка прикольная но не в тему
Какая шутка? Там всё таскается, как ты и просил.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,168
01.02.2020, 12:12
Verevkin,
Картинка там матерная есть, а потому вложение удаляю. Впредь за такие шутки будем удалять тебя.
0
5 / 5 / 6
Регистрация: 11.04.2015
Сообщений: 69
01.02.2020, 20:39
вот динамическое создание объектов и передвижение их по форме
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit ReplaceObjects_;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
 
type
  TF = class(TForm)
    bCrtObject: TButton;
    Panel0: TPanel;
    procedure bCrtObjectClick(Sender: TObject);
    procedure Panel0MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Panel0MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Panel0MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
type TMove=record
     Press:Boolean;
     X,Y:Integer;
     end;
 
var
  F: TF;//главная и единственная форма
  mv:TMove;
  index:Byte;//индекс объекта
  pl:array[Byte] of TPanel;
 
implementation
 
{$R *.dfm}
 
procedure CrtPanel(Obj:TPanel;Left,Top,Height,Width:Integer);
begin
Obj:=TPanel.Create(F);
Obj.Parent:=F;
Obj.Name:='Panel'+IntToStr(Index);
Obj.Caption:='Panel'+IntToStr(Index);
Obj.Width:=Width;
Obj.Height:=Height;
Obj.ShowHint:=False;
 
Obj.Left:=Left;
Obj.Top:=Top;
Obj.Tag:=0;
Obj.Visible:=True;
Obj.OnMouseDown:=F.Panel0.OnMouseDown;
Obj.OnMouseMove:=F.Panel0.OnMouseMove;
Obj.OnMouseUp:=F.Panel0.OnMouseUp;
end;
 
{Procedure Destroy1(ComName:TClass);
var i:Integer;
begin
for i:=0 to F.ComponentCount-1 do
if(F.Components[i] is ComName=true)then (F.Components[i] as ComName).Free;
end;}
 
procedure Destroy2;    //Уничтожем все панели
var
flag:boolean;
i:integer;
begin
repeat
flag:=true;
 for i:=0 to F.ComponentCount-1 do
 begin
  if(F.Components[i] is TPanel)then
                      begin
                      F.Components[i].Free;
                      flag:=false;
                      break;
                      end;
 end;
until flag=true;
end;
 
 
procedure Move(Obj:TPanel;X,Y:Integer);
begin
if(mv.Press=True)then
                 begin
                      Obj.Left:=Obj.Left-(mv.X-X);
                      Obj.Top:=Obj.Top-(mv.Y-Y);
                 end;
end;
 
procedure TF.bCrtObjectClick(Sender: TObject);
begin
inc(index);
CrtPanel(pl[index],0,0,100,100);//создаём объект
end;
 
procedure TF.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Destroy1(TPanel);
Destroy2;
end;
 
procedure TF.Panel0MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
mv.Press:=true;
mv.X:=X;
mv.Y:=Y;
end;
 
procedure TF.Panel0MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
      Move((Sender as TPanel),X,Y);//двигаем объект
end;
 
procedure TF.Panel0MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
      mv.Press:=False;
end;
 
end.
вопрос к знатокам: почему Destroy1 вызывает вылет?
0
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,134
Записей в блоге: 3
01.02.2020, 20:51
Цитата Сообщение от Budetlyanin Посмотреть сообщение
почему Destroy1 вызывает вылет?
у отладчика спрашивали?
там у вас цикл - отладчик покажет на чем именно вылетает
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,356
Записей в блоге: 3
02.02.2020, 06:02
Цитата Сообщение от Budetlyanin Посмотреть сообщение
почему Destroy1 вызывает вылет?
Очень просто... Попробую объяснить на пальцах:
У Вас используется цикл for .. to .. do. Начинается он с нуля и заканчивается числом ComponentCount-1
Начинаем обход. Вот у нас нашелся компонент, подходящий под условие (if F.Components[i] is ComName then ...). Мы его благополучно удаляем и идем дальше. Но вот весь прикол в том, что компонентов на форме у нас стало на один меньше, а верхняя граница цикла-то осталась прежней, исходное число компонентов на форме... И как только цикл закончит перебирать оставшиеся компоненты - Вы получите AV, т.к. цикл еще не закончен и Вы пытаетесь обратиться к компоненту, которого уже нет.
Это очень распространенная ошибка, использовать прямой цикл for в списках, удаляя в теле цикла элементы этого списка. В таких случаях используется обратный цикл for. Вот так попробуйте - все должно сработать:
Delphi
1
for i := F.ComponentCount-1 downto 0 do
Добавлено через 16 минут
Ну и еще момент: не надо из внешней (по отношению к классу формы) процедуры лезть в класс формы. Если в Вашей внешней процедуре предполагается активное обращение к членам класса формы (читай, компонентам) - то либо делайте эту процедуру методом этого самого класса формы, либо передавайте эту форму в качестве параметра. Вот на примере Вашей процедуры Destroy1
Сама процедура (внешняя по отношению к классу формы)
Delphi
1
2
3
4
5
6
7
procedure Destroy1(Frm: TForm; X: TClass);
var i: integer;
begin
  with Frm do
    for i := ControlCount - 1 downto 0 do
      if Controls[i] is X then Controls[i].Free;
end;
пример вызова:
Delphi
1
2
3
4
procedure TForm1.Button1Click(Sender: TObject);
begin
  Destroy1(self, TPanel);
end;
2
0 / 0 / 0
Регистрация: 28.04.2017
Сообщений: 282
04.02.2020, 15:42  [ТС]
я наверное правильную тему создал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2020, 15:42
Помогаю со студенческими работами здесь

Как перемещать объект во время выполнения?
Как перемещать объект во время выполнения,и растягивать его? помогите!:wall::cry: Заранее всем огромноое спасибо! Всем огромное спасибо!...

Как перемещать label по форме
Как перемещеть label по форме используя Timer? label1.left=label1.left+1 не работает.

Как перемещать по слоям как в Photoshop? Чтобы один 2D объект перекрывал другой?
Здравствуйте друзья подскажите как перемещать объекты как в фотошопе? Что-бы один 2d объект перекрывал другой?

Как управлять/перемещать кнопкой на форме с клавиатуры?
Подскажите как сделать управление элементом на форме. Например управлять кнопкой с клавиатуры. Стрелка "Влево" кнопка смещается...

Как перемещать поле и его подпись по отдельности на форме
В таблице tblRule создал новое поле NumRule и разместил его на форме frmRule. Хотел расположить их в нужном мне месте, но подпись и поле...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru