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

Получаю AV при установке обработчика у THumb


xenon54

Вопрос

Всем привет!

У TrackBar есть внутренний контрол TThumb. Доступ к нему через свойство исчезает при переходе из TCustomTrack в TTrackBar. Добавил это свойство к TTrackBar. Получил доступ к нему все ок.

Вообще доступ к нему мне нужен для двух вещей:

1. Узнавать стоит ли сейчас палец на нем ( IsPressed )

2. Поставить обработчик события OnMouseUp;

Так вот с первым все хорошо, а вот со вторым получаю AV. Причем AV возникает именно тогда когда устанавливается обработчик событий.

TrackBar1.Thumb.OnMouseUp := form1.ThumbMouseUp;

Глушу это дело через Except и все отлично работает. Т.е. вылетает AV, но при этом обработчик устанавливается.

Собственно вопрос: WTF!?

С чего вдруг AV? И почему тогда отрабатывает строка по установке обработчика события.

TrackBar лежит на панели у которой в момент установки обработчика высота равно нулю.

Случайно наткнулся на такую вещь: Если сделать высоту у этой панели хотя бы "0,001", то AV не вылетает О_о.

Такое ощущение что если у этой панели высота равна 0, то объект внутри нее вообще не создан =\

Попахивает вообще какими-то чудесами...

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

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

  • 0

Прикрепил. Только там через Дополнительный View (iPhone 4"). В мастере почему-то вообще игнорируется когда я выставляю height  в 0. В проекте показывает что 0, а когда запускаю приложение на телефоне, то панель имеет дефолтную высоту.

test.zip

Ссылка на комментарий
  • 0
  • Администраторы

Любопытно, выглядит, как какая-то ошибка в ARC.

 

Интересно, что такой код работает:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(TrackBar1.Thumb) then
    TrackBar1.Thumb.OnMouseUp := ThumbMouseUp;
end;

Попробую найти пример, где проблема в ARC.

А так, Thumb берется из стиля, так что предварительно перед обращением к нему, нужно проверять его наличие у трек бара.

Ссылка на комментарий
  • 0
  • Администраторы

Все, я понял, в чем у вас ошибка.

  1. Thumb берется из стиля.
  2. У вас панель находится за пределами экрана iPhone
  3. По умолчанию, контролы, не попадающие в область видимости сцены или с нулевым размером по одной из осей, освобождают свой стиль.
  4. Поэтому у TrackBar нету стиля и Thumb.
  5. Вы к нему обращаетесь и получаете AV.
Ссылка на комментарий
  • 0
  • Администраторы
  1. Вешать обработчик на в событии TTrackBar.OnApplyStyleLookup, когда стиль загружен с доп проверкой на существование Thumb.
  2. Видимо когда вы вешаете обработчик на nil объект вы записываете адрес обработчика в память. А потом в эту память загружается Thumb адрес остается. Но стоит отметить, что такое совпадение возможно, но мало вероятно.
Ссылка на комментарий
  • 0

Большое спасибо за ответы.

 

P.S.: И все таки терзает вопрос "зачем у конечного trackbar'a убрали доступ к объекту(свойству) Thumb". Хотя конечно это нужно спрашивать у разработчика компонента, так что вопрос практически риторический...

Изменено пользователем xenon54
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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