0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 129
1

Как в Pascal ABC сделать так, чтобы можно было двигать форму без границ (FormBorderStyle.None)?

03.07.2017, 11:06. Показов 3503. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пробовал использовать этот код:


Pascal
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
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  MainForm: System.Windows.Forms.Form;
  X, Y, cX, cY: integer;
  Down: boolean := False;
 
procedure MainForm_MouseDown(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := True; {Зажали кнопку}
  
  // Запоминаем координаты формы
  X := MainForm.Left;
  Y := MainForm.Top;
  
  // Запоминаем координаты курсора
  cX := System.Windows.Forms.Cursor.Position.X;
  cY := System.Windows.Forms.Cursor.Position.Y;
end;
 
procedure MainForm_MouseUp(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := False; {Отпустили кнопку}
end;
 
procedure MainForm_MouseMove(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  if Down then {Если кнопка нажата}
  begin
  // Двигаем форму относительно курсора
    MainForm.Left := System.Windows.Forms.Cursor.Position.X - cX + X;
    MainForm.Top := System.Windows.Forms.Cursor.Position.Y - cY + Y;
  end;
end;
 
begin
  
  MainForm := new Form;
  MainForm.StartPosition := FormStartPosition.CenterScreen;
  MainForm.FormBorderStyle := FormBorderStyle.None;
  MainForm.MouseDown += MainForm_MouseDown;
  MainForm.MouseUp += MainForm_MouseUp;
  MainForm.MouseMove += MainForm_MouseMove;
  
  Application.Run(MainForm);
end.




Но пишут ошибку: pas(49) : Нельзя обратиться к свойству Left через тип
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2017, 11:06
Ответы с готовыми решениями:

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

Можно ли сделать так, что сквозь форму можно было бы тыкать мышью по файлам?
Можно ли сделать так, что сквозь форму можно было бы тыкать мышью по файлам? Т.е. например, как в...

Можно как-то переделать код из Turbo Pascal чтобы он работал в pascal abc.net?
Сделайте пожалуйста, я просто не вникаю uses Graph, Crt; var grDriver: integer; grMode:...

Как можно растягивать и сжимать форму без границ FormBorderStyle=None
Можно ли сделать возможность растягивать (в том числе и разворачивать на весь экран) или сжимать...

5
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
03.07.2017, 11:20 2
Странно, но у меня нет такой ошибки и форма без рамок перемещается по экрану.

Добавлено через 2 минуты
Цитата Сообщение от Kostik654 Посмотреть сообщение
Но пишут ошибку: pas(49)
В коде строка 49 вообще пустая.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32580 / 21051 / 8131
Регистрация: 22.10.2011
Сообщений: 36,323
Записей в блоге: 8
03.07.2017, 11:38 3
Лучший ответ Сообщение было отмечено Kostik654 как решение

Решение

Да в принципе и импортировать две WinAPI-функции и использовать их - не такая уж и большая проблема:
Pascal
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
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  MainForm: System.Windows.Forms.Form;
 
function SendMessage(hWnd: System.IntPtr; Msg, wParam, lParam: integer): integer; external 'user32.dll';
function ReleaseCapture: boolean; external 'user32.dll';
 
procedure MainForm_MouseDown(sender: object; args: System.Windows.Forms.MouseEventArgs);
const
  WM_NCLBUTTONDOWN = $A1;
  HT_CAPTION = $2;
begin
  if args.Button = MouseButtons.Left then
  begin
    ReleaseCapture();
    SendMessage(MainForm.Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
  end;
end;
 
begin
  
  MainForm := new Form;
  MainForm.StartPosition := FormStartPosition.CenterScreen;
  MainForm.FormBorderStyle := FormBorderStyle.None;
  MainForm.MouseDown += MainForm_MouseDown;
  
  Application.Run(MainForm);
end.
1
0 / 0 / 1
Регистрация: 02.03.2017
Сообщений: 129
03.07.2017, 14:50  [ТС] 4
строки 18-19

Добавлено через 2 минуты
Ошибка Нельзя обратиться к свойству Handle через тип
0
Почетный модератор
64288 / 47587 / 32739
Регистрация: 18.05.2008
Сообщений: 115,182
03.07.2017, 15:00 5
Ну я пас, поскольку
Цитата Сообщение от Puporev Посмотреть сообщение
у меня нет такой ошибки и форма без рамок перемещается по экрану.
0
Alvin Seville
342 / 272 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
03.07.2017, 18:26 6
Лучший ответ Сообщение было отмечено Kostik654 как решение

Решение

Не по теме:

Но пишут ошибку: pas(49) : Нельзя обратиться к свойству Left через тип


У меня все отлично работает.

Добавлено через 25 минут
Можно и так:
Pascal
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
{
Решение основывается на том, что сначала мы найдем вектор AB от точки A (с координатами курсора) и до B (с координатами верхнего левого угла формы).
Дальше, задача состоит в том, что зная текущие координаты курсора угол формы сдвигать на вектор AB.
}
{$apptype windows}
{$reference 'System.Windows.Forms.dll'}
{$reference 'System.Drawing.dll'}
uses
  System.Windows.Forms,
  System.Drawing;
 
var
  MainForm: System.Windows.Forms.Form;
  X, Y, dX, dY: integer;
  Down: boolean := False;
 
procedure MainForm_MouseDown(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := True;
  
  X := MainForm.Left;
  Y := MainForm.Top;
  
  {Находим разницу координат курсора и угла окна:}
  dX := System.Windows.Forms.Cursor.Position.X - X; 
  dY := System.Windows.Forms.Cursor.Position.Y - Y;
end;
 
procedure MainForm_MouseUp(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  Down := False;
end;
 
procedure MainForm_MouseMove(sender: object; args: System.Windows.Forms.MouseEventArgs);
begin
  if Down then
  begin
    {По сути, нам надо просто сдвинуть координаты окна относительно текущих координат курсора на dX и dY.}
    MainForm.Left := System.Windows.Forms.Cursor.Position.X - dX;
    MainForm.Top := System.Windows.Forms.Cursor.Position.Y - dY;
  end;
end;
 
begin
  MainForm := new Form;
  MainForm.StartPosition := FormStartPosition.CenterScreen;
  MainForm.FormBorderStyle := FormBorderStyle.None;
  MainForm.MouseDown += MainForm_MouseDown;
  MainForm.MouseUp += MainForm_MouseUp;
  MainForm.MouseMove += MainForm_MouseMove;
  
  Application.Run(MainForm);
end.
Добавлено через 1 минуту
Так как разность координат курсора и координат верхнего левого угла формы всегда неотрицательна я отнимаю именно в таком порядке значения этих величин.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2017, 18:26
Помогаю со студенческими работами здесь

Как сделать так, чтобы можно было закрыть только текущую Форму?
Доброго времени суток. Я использую Windows Forms и язык C# для написания не большого проекта....

Как сделать чтоб нажимая на лабел можно было двигать форму по экрану с помощью DragDrop?
На форме есть Label1. Как сделать чтоб нажимая на лабел можно было двигать форму по экрану с...

Нарисовать заданные фигуры и сделать, чтобы их можно было двигать
нужно написать программу на делфи: с помощью DXDraw Нужно нарисовать такие штучки (только...

Можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву
подскажите можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву?...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru