• 0
Zyablik3000

Как отловить изменение положения контрола

Вопросы

Здравствуйте!

Создаю компонент. Для компонента рассчитывается три точки TPointF в координатах родителя (одна по левому краю, одна в центре, одна по правому краю)ж

Есть код

MyComponent:=TMyComponent.Create(Self);
MyComponent.Position.X:=Random(1000);
MyComponent.Position.Y:=Random(1000);
MyComponent.Parent:=(Self);

Вопрос: можно ли отловить изменение Position чтобы там рассчитывать положение нужных мне трех точек.

Понятно что можно сделать какой-нибудь MyComponent.CalcPoints где рассчитывать положение точек  и вызывать после каждого изменения положения компонента в программе, но хочется делать расчеты внутри компонента.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 ответов на этот вопрос

  • 0
2 часа назад, Zyablik3000 сказал:

Здравствуйте!

Создаю компонент. Для компонента рассчитывается три точки TPointF в координатах родителя (одна по левому краю, одна в центре, одна по правому краю)ж

Есть код


MyComponent:=TMyComponent.Create(Self);
MyComponent.Position.X:=Random(1000);
MyComponent.Position.Y:=Random(1000);
MyComponent.Parent:=(Self);

Вопрос: можно ли отловить изменение Position чтобы там рассчитывать положение нужных мне трех точек.

Понятно что можно сделать какой-нибудь MyComponent.CalcPoints где рассчитывать положение точек  и вызывать после каждого изменения положения компонента в программе, но хочется делать расчеты внутри компонента.

 

в компоненте создать таймер в котором проверять/обрабатывать изменение положения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Таймер - самый очевидный вариант.

А если без таймера? Это же лишняя нагрузка. Планируется 200-300 компонентов на форме держать. А это 200-300 "лишних" таймеров.

Может есть какая-нибудь стандартная процедура похожая на DoResize?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

формально подходите к вопросу

кто создал компонент, тот и должен им распоряжаться

хранить ссылку на него, в зависимости от каких-то событий менять им position, color и все что угодно

если нужно создайте класс, который будет это делать. можно в качестве этого класса, если он "одноразовый", использовать сам класс формы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
9 минут назад, krapotkin сказал:

в зависимости от каких-то событий менять им position, color и все что угодно

Так мне и нужно событие изменения позиции (если оно существует). И в нем считать все что нужно.

Если, скажем я напишу

MyComponent.Height:=Random(1000);

то отработает

procedure Resize; override;

моего компонента. И тут можно отреагировать на измнение размера.

Вопрос в том, есть ли аналогичная процедура для реакции на

MyComponent.Position.X:=Random(1000);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Такого обработчика нет.

Можете написать аналогично обработчику OnResize в FMX.Controls.pas.

Для этого в тех методах, которые вызывают изменение положения контрола, нужно проставить соответствующие маркеры, чтобы менять значение свойства типа:

property OnChangePosition: TNotifyEvent read FOnChangePosition write FOnChangePosition;

 

Изменено пользователем Alex7wrt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

Можно перехватить событие изменения позиции. Только обязательно нужно сохранить предыдущий обработчик для его принудительного вызова.

Вот грубый пример  :

var
  SavePositionOnChange : TNotifyEvent;

procedure TForm2.FormShow(Sender: TObject);
begin
 SavePositionOnChange := Button4.Position.OnChange ;
 Button4.Position.OnChange := ButtonPositionChange;
end;

procedure TForm2.ButtonPositionChange(Sender: TObject);
begin
  {
  делаем что нужно ....
  }
 if Assigned(SavePositionOnChange) then
    SavePositionOnChange(Sender)
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо Alex7wrt и mmover.

Перехват события изменения положения отработал на ура👍

Можно было попробовать писать свой обработчик, но

29 минут назад, Alex7wrt сказал:

Для этого в тех методах, которые вызывают изменение положения контрола

знать бы еще все эти методы.

Но все равно спасибо за идею😁

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 часа назад, Ильдар сказал:

Для компонента рассчитывается три точки TPointF в координатах родителя

ну а координаты родителя-то кто меняет, сам??

значит есть и возможность все остальное приводить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Координаты родителя не меняются.

Родитель это TRectangle большого размера который лежит на TPresentedScrollBox. Как лист в MS Visio.

4 часа назад, krapotkin сказал:

значит есть и возможность все остальное приводить

Вы имеете введу приводить от координат формы через всю иерархию? А если вложенность больше?

Может быть я стараюсь сделать излишне универсально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Если это свой компонент, то перекройте метод TControl.DoAbsoluteChanged и не забудьте вызывать базовый метод через inherited;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Спасибо!!!

Да, это свой компонент.

Перекрыв TControl.DoAbsoluteChanged  желаемого эффекта не получил.

Помогло перекрытие
 

procedure TMyComponent.RecalcAbsolute;
begin
  inherited RecalcAbsolute;
  {
  мой код...
  }
end;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу