Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > TTrackBar & SetTick


Автор: gAlexKo 6.4.2015, 17:15
Что-то странное. Может глюк 6 Билдера?

Кладу TrackBar на форму. Хочу сделать метку на значении 5. Не выходит!

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
TrackBar1->Max = 10;
TrackBar1->Min = 0;
TrackBar1->Position = 0;
TrackBar1->TickStyle = tsManual;
TrackBar1->SetTick(5);
}
//---------------------------------------------------------------------------

Автор: Romikgy 6.4.2015, 20:46
Код

{
TrackBar1->Max = 10;
TrackBar1->Min = 0;
TrackBar1->Position = 5;
}

Автор: gAlexKo 7.4.2015, 08:14
Цитата(Romikgy @ 6.4.2015,  20:46)
Код

{
TrackBar1->Max = 10;
TrackBar1->Min = 0;
TrackBar1->Position = 5;
}

И что это дает? Postion это значение ползунка. А нужно сделать шкалу из меток вдоль TrackBar используя функцию SetTick.

В твоем примере метка на значении 5 также не проставляется.

Пробовал проставлять метки используя свойство Frequency (получилось), но это немного не то, что мне надо. А вот с использованием функции SetTick прямо засада какая-то.  smile 

Автор: 586 7.4.2015, 10:12
Вроде нормально работает SetTick. Для наглядности изменяю другие свойства:
Код
TrackBar1->Min=0;
TrackBar1->Max=10;
TrackBar1->Frequency=5;
TrackBar1->SetTick(3);

Автор: gAlexKo 7.4.2015, 10:13
Мне удалось найти решение - это действительно недоработка Борланда, по крайней мере в части документации.

Итак, если нужно ставить метки в TTrackBar при помощи SetTick нужно делать одним из следующих вариантов:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
TrackBar1->Max = 10;
TrackBar1->Min = 0;
TrackBar1->Position = 0;
TrackBar1->TickStyle = tsManual;

//Первый вариант решения:
TrackBar1->HandleNeeded();
TrackBar1->SetTick(5);   //метка на по значению 5

// или второй вариант:
//SendMessage(TrackBar1->Handle, TBM_SETTIC, 0, 5);  //метка на по значению 5
}

Автор: 586 7.4.2015, 10:13
С++Builder6. В компоненте ничего дополнительно не менял.

Автор: gAlexKo 7.4.2015, 10:19
Цитата(586 @ 7.4.2015,  10:12)
Вроде нормально работает SetTick. Для наглядности изменяю другие свойства:
Код
TrackBar1->Min=0;
TrackBar1->Max=10;
TrackBar1->Frequency=5;
TrackBar1->SetTick(3);


Frequency и SetTick не используются вместе.
Frequency - это делать метки каждые N значений. Работает только когда TickStyle == tsAuto (что по умолчанию). 
SetTick(N) - это устанавливать метки на НУЖНОМ значении. Для этого нужно TickStyle == tsManual.

PS: Кстати то же самое в Delphi 2010.

Автор: 586 7.4.2015, 10:54
Цитата(gAlexKo @  7.4.2015,  11:19 Найти цитируемый пост)
Frequency - это делать метки каждые N значений. Работает только когда TickStyle == tsAuto (что по умолчанию). 

Опыты показывают что и при tsManual тоже.

Код
TrackBar1->Min=0;
TrackBar1->Max=10;
TrackBar1->Frequency = 1;
TrackBar1->TickStyle = tsManual;
TrackBar1->SetTick(2);
TrackBar1->SetTick(3);

TrackBar2->Min=0;
TrackBar2->Max=10;
TrackBar2->Frequency = 2;
TrackBar2->TickStyle = tsManual;
TrackBar2->SetTick(2);
TrackBar2->SetTick(3);

Автор: gAlexKo 7.4.2015, 12:53
Цитата(586 @ 7.4.2015,  10:54)
Цитата(gAlexKo @  7.4.2015,  11:19 Найти цитируемый пост)
Frequency - это делать метки каждые N значений. Работает только когда TickStyle == tsAuto (что по умолчанию). 

Опыты показывают что и при tsManual тоже.

Код
TrackBar1->Min=0;
TrackBar1->Max=10;
TrackBar1->Frequency = 1;
TrackBar1->TickStyle = tsManual;
TrackBar1->SetTick(2);
TrackBar1->SetTick(3);

TrackBar2->Min=0;
TrackBar2->Max=10;
TrackBar2->Frequency = 2;
TrackBar2->TickStyle = tsManual;
TrackBar2->SetTick(2);
TrackBar2->SetTick(3);

Я откомпилоировал твои два варианта - ни на одном из них у меня МЕТКИ (2 и 3) не появились (появились только две метки по краям бара). Даже не знаю как ты обошелся без функции NeedHandle() и почему у тебя их видно.

(CBuilder 6.0)

Как я понял проблема известная в делфийских кругах:
http://sohu.io/questions/927922/how-to-set-custom-ticks-on-a-ttrackbar-in-delphi-2010

Автор: 586 8.4.2015, 02:36
Сейчас я эту проблему обнаружил, когда скопировал свой код в конструктор формы. SetTick действительно не работает. Решение использовать HandleNeeded хорошее. Очень похоже на баг в SetTick - по-хорошему, HandleNeeded должен вызываться автоматически.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)