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

Как отслеживать состояние формы (а именно ее перемещение) в период работы программы?

21.02.2020, 12:56. Показов 4591. Ответов 17

Студворк — интернет-сервис помощи студентам
Как отслеживать состояние формы (а именно ее перемещение) в период работы программы? Т е в случае если пользователь переместит форму нужно чтобы запускалась процедура.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.02.2020, 12:56
Ответы с готовыми решениями:

Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще различаются серия Delphi XE, и Delphi 7?

Какие отличия Delphi 5, Delphi 6 и Delphi 7
Кто-нибудь юзал Delphi 6? Если да, то напишите, плиз, его отличия от 5-ой версии (плюсы и минусы) Кстати, никто не слышал ничего о Delphi...

ZipForge для Delphi Xe - интерфейс стал выглядеть как в Delphi 2007
Народ!!! Помоготи!!! Установил компонент ZipForge для Delphi Xe и после этого интерфейс моей программы стал таким, как будто я его в delphi...

17
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
21.02.2020, 13:40
пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type
  TVForm = class abstract(TForm)
  private
    procedure WMMove(var Msg: TWMMove); message WM_MOVE; // <--- обработчик сообщения
  protected
    procedure DoMove; virtual; // <--- диспетчеризация 
  published
    property OnMove: TNotifyEvent read FOnMove write FOnMove; // <--- событие
  end;
 
implementation
 
procedure TVForm.DoMove;
begin
  if Assigned(FOnMove)
    then FOnMove(Self);
end;
 
procedure TVForm.WMMove(var Msg: TWMMove);
begin
  DoMove();
end;
Остаётся только унаследовать нужный класс формы от этого класса и присвоить обработчик свойству OnMove.
2
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
21.02.2020, 15:23
Можно дать такое же имя TForm, тогда остаётся только подключить модуль с этим классом и новые события автоматом подхватятся.
0
Модератор
10423 / 5711 / 3402
Регистрация: 17.08.2012
Сообщений: 17,368
21.02.2020, 21:38
Я в чём-то ошибаюсь, или всё же нет? Насколько мне известно, событие формы OnCanResize отслеживает любые изменения размеров и положения формы. Не знаю, как в современных Delphi (не поставил пока за ненадобностью), но в Delphi 7 назначьте на OnCanResize:
Delphi
1
2
3
4
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  Label1.Caption := IntToStr(Form1.Left) + ' ' + IntToStr(Form1.Top)
end;
и протестируйте, пожалуйста. Мало ли, может, есть какие-то подводные камни, либо я чего-то всё-таки не так понимаю.

В Lazarus для отслеживания положения формы можно использовать событие формы OnChangeBounds. Пример:
Pascal
1
2
3
4
procedure TForm1.FormChangeBounds(Sender: TObject);
begin
  Label1.Caption := IntToStr(Form1.Left) + ' ' + IntToStr(Form1.Top)
end;
Не знаю, может быть, в современных Delphi есть событие OnChangeBounds. Если да, то уже есть нужное событие формы, и незачем изобретать, возможно, более эффективный, но велосипед.
0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
21.02.2020, 21:52
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Насколько мне известно, событие формы OnCanResize отслеживает любые изменения размеров и положения формы.
0
Модератор
10423 / 5711 / 3402
Регистрация: 17.08.2012
Сообщений: 17,368
21.02.2020, 22:43




В Delphi 7 работает. Похоже, Borland и Embarcadero по-разному трактуют изменение положения и размеров формы...

И всё же... В Delphi 10 есть событие формы OnChangeBounds?
0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
21.02.2020, 22:48
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
В Delphi 10 есть событие формы OnChangeBounds?
нет.
0
Модератор
10423 / 5711 / 3402
Регистрация: 17.08.2012
Сообщений: 17,368
21.02.2020, 23:15
Жаль.

Да, и ещё вот что... На фотке, которую Вы выложили, написано, что "Occurs when an attempt is made to resize the control", но нигде не написано, что "Does not occur when attempting to reposition the control".

Вы сами-то проверяли, срабатывает ли событие OnCanResize при перемещении формы?
0
21.02.2020, 23:17

Не по теме:

Цитата Сообщение от Cyborg Drone Посмотреть сообщение
OnCanResize
хм)) Любопытно)
Но это скорее какой-то побочный эффект. Надо поковырять исходники.
Только оно врёт при разворачивании/восстановлении.

0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
22.02.2020, 00:57
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Вы сами-то проверяли, срабатывает ли событие OnCanResize при перемещении формы?
нет. Но по уважительной причине.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,660
Записей в блоге: 21
22.02.2020, 04:36
перемещение не трогает Resize
проверял
делал аналогично ответу в #2
0
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
22.02.2020, 05:39
Всё же, OnCanResize возникает до перемещения и там считываются старые координаты. Для сравнения скрин формы, которая была перемещена (вывод Left и Top):
Миниатюры
Как отслеживать состояние формы (а именно ее перемещение) в период работы программы?  
0
Модератор
10423 / 5711 / 3402
Регистрация: 17.08.2012
Сообщений: 17,368
23.02.2020, 08:20
Короче, OnCanResize для отслеживания перемещения не подходит.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
24.02.2020, 11:40
Цитата Сообщение от Verevkin Посмотреть сообщение
пример:
А если создать соответствующее событие, можно и координаты отслеживать
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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TMoveEvent = procedure(Sender: TObject; const X,Y: integer) of object;
 
  TForm = class abstract(Vcl.Forms.TForm)
  strict private
    FOnMove: TMoveEvent;
  protected
    procedure WMMove(var msg: TWMMove); message WM_MOVE;
  public
    property OnMove: TMoveEvent read FOnMove write FOnMove;
  end;
 
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure CatchMoving(Sender: TObject; const X,Y: integer);
    procedure FormCreate(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
{ TForm }
 
procedure TForm.WMMove(var msg: TWMMove);
begin
  inherited;
  if Assigned(FOnMove) then FOnMove(Self,msg.XPos,msg.YPos);
end;
 
{ TForm1 }
 
procedure TForm1.CatchMoving(Sender: TObject; const X, Y: integer);
begin
  Label1.Caption:= Format('X: %d; Y: %d',[X,Y]);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  OnMove:= CatchMoving;
end;
 
end.
Кстати, не учитывается ширина границы формы. На картинке видно, что Х равен 0 только когда граница полностью скроется за экраном. Т.е. как бы учитывается позиция ClientWidth
Миниатюры
Как отслеживать состояние формы (а именно ее перемещение) в период работы программы?  
0
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
24.02.2020, 12:16
Думаю, передача координат лишнее. Всегда можно прочитать Left и Top формы.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
24.02.2020, 12:28
Цитата Сообщение от AzAtom Посмотреть сообщение
Думаю, передача координат лишнее. Всегда можно прочитать Left и Top формы.
не могу не согласиться. НО, как я уже заметил, Х и У не соответствуют Left и Top. Возможно, может понадобиться именно Х и У
Миниатюры
Как отслеживать состояние формы (а именно ее перемещение) в период работы программы?  
0
Модератор
4138 / 2351 / 809
Регистрация: 15.11.2015
Сообщений: 9,396
24.02.2020, 12:37
Ну не знаю даже. Координаты начала клиентской области итак прямо не доступны, не знаю, стоит ли их вытаскивать вот так, не получится ли разнобой?
0
Злостный нарушитель
 Аватар для Verevkin
10302 / 5725 / 1268
Регистрация: 12.03.2015
Сообщений: 26,508
24.02.2020, 13:22
Цитата Сообщение от DenNik Посмотреть сообщение
А если создать соответствующее событие, можно и координаты отслеживать
Нахрена? В обработчик передаётся Sender = Self, а это и есть сама форма. Из неё можно вытащить все свойства и даже вызвать методы, если надо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.02.2020, 13:22
Помогаю со студенческими работами здесь

Какова разница работы одного кода в Delphi 7 и в Delphi XE5?
Почему приложение состоящие из одинакового кода, но компилируемое в разных средах работает по разному? Есть клиент-серверное приложение,...

где найти delphi c компилятором? и с чего начинать программирование в delphi?
здравствуйте, вот начинаю изучать delphi с чего начинать лучше?

Почему функция работающая в Delphi 7 не работает в Delphi 2007 и в 2009 ??
Данный код работал нормально в D7: procedure TForm1.Button1Click(Sender: TObject); begin ShowWindow(Application.Handle, 0); end;...

Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi
Как в Delphi сделать Excel таблицу, не употребляя компонент TStringGrid и связать ее с Delphi?

У меня есть литература для изучения delphi 7. Могу ли я по ней изучить delphi 2010?
Всем привет. Очередной семестр в универе подходит к концу, а лабы по программированию сданы и мне нечем заняться =). Я хочу изучить delphi...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru