Перейти к содержанию
  • Регистрация
  • 0
xenon54

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

Вопрос

Всем привет!

У 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

У TrackBara может не оказаться THumb'a? :D 

Это что за трекбар такой О_о

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


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

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

  1. Thumb берется из стиля.
  2. У вас панель находится за пределами экрана iPhone
  3. По умолчанию, контролы, не попадающие в область видимости сцены или с нулевым размером по одной из осей, освобождают свой стиль.
  4. Поэтому у TrackBar нету стиля и Thumb.
  5. Вы к нему обращаетесь и получаете AV.

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


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

Тогда 2 вопроса:

1. Почему в итоге обработчик устанавливается

2. Как делать правильно?

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


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

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


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

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

 

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

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

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


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

Я повысил видимость этому свойству для будущих версий.

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


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

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

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

×
×
  • Создать...