Перейти к содержанию
Fire Monkey от А до Я
  • 0

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


Zyablik3000

Вопрос

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

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

Есть код

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

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

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

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 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;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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