Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси? / 19 сообщений из 19, страница 1 из 1
03.09.2021, 10:39
    #40095025
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Приветствую, всезнающий ALL!
Я перемещаю панель на форме следующим образом:
на событие MouseDown прописываю:
ReleaseCapture;
myPanel.Perform(WM_SysCommand, $F012, 0);
И панель, замечательно таскается мышью за его "тело". :)
А есть ли возможность ограничить перемещение по одной оси, скажем по горизонтали? Что бы я могла таскать панельку только вверх - низ.
P.S.
Способ с запоминанием координат мыши на MouseDown и последующим изменением .top и .left панели прошу не предлагать.
Заранее благодарна за помощь! :)
...
Рейтинг: 0 / 0
03.09.2021, 11:36
    #40095054
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___Z> Способ с ... изменением .top и .left панели прошу не предлагать.

Почему?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.09.2021, 12:58
    #40095077
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___ZА есть ли возможность ограничить перемещение по одной оси, скажем по горизонтали?

https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-moving
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.09.2021, 16:04
    #40095153
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___Z,

Можно попробовать ClipCursor, но, если я не ошибаюсь, там какие-то заморочки, если мониторов больше одного.
...
Рейтинг: 0 / 0
03.09.2021, 17:56
    #40095181
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Гаджимурадов Рустам,
Там тачкрин. При нажатии на него событие MouseDown не наступает. Запомнить текущие координаты не получается.
...
Рейтинг: 0 / 0
03.09.2021, 17:59
    #40095183
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Dimitry Sibiryakov,
спасибо за участие, прочитала, но ничего толком не поняла ((
тем более, что насколько я понимаю, там будет двигаться только рамочка, а не сама панелька.
Если можно, прошу пример как это использовать.
...
Рейтинг: 0 / 0
03.09.2021, 18:09
    #40095186
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Polesov,
спасибо за участие, но не помогло... написала этот код, но панель как двигалась без ограничений так и продолжает двигаться
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfrmMain.MyPanelMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  r: TRect;
  pr: PRect;
begin
  r.Left := 100;
  r.Top := 100;
  r.Right := Screen.Width - 100;
  r.Bottom := Screen.Height - 100;
  pr := @r;
  ClipCursor(pr);
end;
...
Рейтинг: 0 / 0
03.09.2021, 18:13
    #40095187
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___Z
Polesov,
спасибо за участие, но не помогло... написала этот код, но панель как двигалась без ограничений так и продолжает двигаться
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TfrmMain.MyPanelMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  r: TRect;
  pr: PRect;
begin
  r.Left := 100;
  r.Top := 100;
  r.Right := Screen.Width - 100;
  r.Bottom := Screen.Height - 100;
  pr := @r;
  ClipCursor(pr);
end;




Irina___ZТам тачкрин. При нажатии на него событие MouseDown не наступает .
А в обработчик MyPanelMouseDown попадаем?
...
Рейтинг: 0 / 0
03.09.2021, 18:26
    #40095188
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Polesov,
Это я уже мышкой таскала панель. Мышь конечно MouseDown вызывает, но все равно код не ограничивает движение мыши. может из за того, что зажата ЛКМ
...
Рейтинг: 0 / 0
03.09.2021, 18:51
    #40095194
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___Z
Это я уже мышкой таскала панель.

Ну, тогда совет от Dimitry Sibiryakov:

Объявление:
Код: pascal
1.
2.
3.
4.
5.
type
  TMyForm = class(TForm)
  protected
    procedure WMMoving( var Msg : TMessage ); message WM_MOVING;
  end;



Реализация:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TMyForm.WMMoving( var Msg : TMessage );
var
  r : pRect;
  h : integer;
begin
  inherited;
  integer( r ) := Msg.lParam;
  h := r.Bottom - r.Top;
  r.Top := 100;
  r.Bottom := r.Top + h;
  Msg.Result := Ord( True );
end;
...
Рейтинг: 0 / 0
03.09.2021, 20:17
    #40095204
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Polesov,
Спасибо!
Этот код ограничивает перемещение формы по вертикали.
Но я не могу понять, как мне этот код адаптировать к панели? Мне надо что бы панель была ограничена в перемещении..
...
Рейтинг: 0 / 0
03.09.2021, 20:25
    #40095207
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Polesov
Код: pascal
1.
integer( r ) := Msg.lParam;

За такое можно и огрести
...
Рейтинг: 0 / 0
03.09.2021, 20:38
    #40095210
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
white_nigger
Polesov
Код: pascal
1.
integer( r ) := Msg.lParam;

За такое можно и огрести

Акамущаслихко? ))
...
Рейтинг: 0 / 0
03.09.2021, 20:39
    #40095211
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___Z
Но я не могу понять, как мне этот код адаптировать к панели?

Написать наследника?
...
Рейтинг: 0 / 0
03.09.2021, 21:52
    #40095221
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Без наследника:
Код: 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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
unit MovePanForm;

interface

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

type
  TMyPanel= class(ExtCtrls.TPanel)
  protected
    procedure WMMoving(var Msg: TMessage); message WM_MOVING;
  end;

  TPanel= class(TMyPanel);

  TForm1 = class(TForm)
    MyPanel: TPanel;
    procedure MyPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TMyPanel.WMMoving(var Msg: TMessage);
var
  pr: PRect;
  tl: TPoint;
  xmax, ymax: integer;
begin
  pr:=pointer(Msg.lParam);
  tl:=Parent.ScreenToClient(pr.TopLeft);

  xmax:=Parent.ClientWidth-Self.Width;
  if tl.x<0 then begin
    pr.Left:=pr.Left - tl.x;
    pr.Right:=pr.Right - tl.x;
  end
  else if tl.x>xmax then begin
    pr.Left:=pr.Left - (tl.x-xmax);
    pr.Right:=pr.Right - (tl.x-xmax);
  end;

  ymax:=Parent.ClientHeight-Self.Height;
  if tl.y<0 then begin
    pr.Top:=pr.Top - tl.y;
    pr.Bottom:=pr.Bottom - tl.y;
  end
  else if tl.y>ymax then begin
    pr.Top:=pr.Top - (tl.y-ymax);
    pr.Bottom:=pr.Bottom - (tl.y-ymax);
  end;

  inherited;
end;

procedure TForm1.MyPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  MyPanel.Perform(WM_SysCommand, $F012, 0);
end;

end.
...
Рейтинг: 0 / 0
03.09.2021, 22:10
    #40095223
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Irina___ZЭтот код ограничивает перемещение формы по вертикали.
Но я не могу понять, как мне этот код адаптировать к панели?

Разве обрабатывать сообщение, приходящее панели, вместо формы - не самоочевидно?..

Без наследника:
https://docwiki.embarcadero.com/Libraries/Sydney/en/Vcl.Controls.TControl.WindowProc
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.09.2021, 22:49
    #40095229
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Исправление для корректной работы, когда панель больше клиентской области родителя:

Код: 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.
procedure TMyPanel.WMMoving(var Msg: TMessage);
var
  pr: PRect;
  tl: TPoint;
  d: integer;
begin
  pr:=pointer(Msg.lParam);
  tl:=Parent.ScreenToClient(pr.TopLeft);

  d:=Parent.ClientWidth - Self.Width;
  if d>0 then begin
    d:=tl.x - d;
    if tl.x<0 then begin
      pr.Left:=pr.Left - tl.x;
      pr.Right:=pr.Right - tl.x;
    end
    else if d>0 then begin
      pr.Left:=pr.Left - d;
      pr.Right:=pr.Right - d;
    end;
  end;

  d:=Parent.ClientHeight - Self.Height;
  if d>0 then begin
    d:=tl.y - d;
    if tl.y<0 then begin
      pr.Top:=pr.Top - tl.y;
      pr.Bottom:=pr.Bottom - tl.y;
    end
    else if d>0 then begin
      pr.Top:=pr.Top - d;
      pr.Bottom:=pr.Bottom - d;
    end;
  end;

  inherited;
end;
...
Рейтинг: 0 / 0
04.09.2021, 16:05
    #40095272
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Aleksandr Sharahov,
Большое Вам спасибо!
Все получилось, правда только при управлении мышью.
С тачскрином, к сожалению, не работает.
...
Рейтинг: 0 / 0
04.09.2021, 16:07
    #40095273
Irina___Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
Большое спасибо всем, кто помог мне более-менее разобраться в сложном для меня вопросе. Удачи всем! ))
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси? / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]