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

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

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

Можно попробовать ClipCursor, но, если я не ошибаюсь, там какие-то заморочки, если мониторов больше одного.
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095181
Irina___Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гаджимурадов Рустам,
Там тачкрин. При нажатии на него событие MouseDown не наступает. Запомнить текущие координаты не получается.
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095183
Irina___Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
спасибо за участие, прочитала, но ничего толком не поняла ((
тем более, что насколько я понимаю, там будет двигаться только рамочка, а не сама панелька.
Если можно, прошу пример как это использовать.
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095186
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;
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095187
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095188
Irina___Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Polesov,
Это я уже мышкой таскала панель. Мышь конечно MouseDown вызывает, но все равно код не ограничивает движение мыши. может из за того, что зажата ЛКМ
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095194
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095204
Irina___Z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Polesov,
Спасибо!
Этот код ограничивает перемещение формы по вертикали.
Но я не могу понять, как мне этот код адаптировать к панели? Мне надо что бы панель была ограничена в перемещении..
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095207
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov
Код: pascal
1.
integer( r ) := Msg.lParam;

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

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

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

Написать наследника?
...
Рейтинг: 0 / 0
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095221
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без наследника:
Код: 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
Perform(WM_SysCommand, $F012, 0) как ограничить перемещение по одной оси?
    #40095223
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Irina___ZЭтот код ограничивает перемещение формы по вертикали.
Но я не могу понять, как мне этот код адаптировать к панели?

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

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

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


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