Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TTrackBar [D6, WinXP]


anod ©   (2002-07-28 16:32:00) 

Здраствуйте, у меня такой вопрос:
На форме лежит TTrackBar, проигрывается музыка. Как мне реализвать прокрутку песни? Событие onChange не подходит, так как в OnTimer ему присваевывается нужная позиция, вызывая тем самым это событие. Подкинте идейку.


Юрий Зотов   (2002-07-28 19:10:00) [1]

Ну, слава Богу, все разобрались. Всегда бы так...


TTCustomDelphiMaster   (2002-07-28 18:56:00) [2]


> TTCustomDelphiMaster © (28.07.02 18:10)
> Юрий Зотов © (28.07.02 17:05)
> Не должно работать, т.к. событие будет обрабатываться после
> выхода из onTimer.


Да... что-то я не то ляпнул. Прошу написанное считать "бредом сивой кобылы".


anod   (2002-07-28 18:22:00) [3]

Извините, и то и тот способ работает - все дело в коде

Gauge.Position:=Trunc( BASS_ChannelBytes2Seconds(stream,pos));

BASS_ChannelSetPosition(stream, Gauge.Position);


TTCustomDelphiMaster   (2002-07-28 18:10:00) [4]

Юрий Зотов © (28.07.02 17:05)
Не должно работать, т.к. событие будет обрабатываться после выхода из onTimer.


> anod © (28.07.02 17:45)
> 2Юрий Зотов
> Ваш пример не заработал:


Попробуй так
procedure TForm1.Timer1Timer(Sender: TObject);
begin
pos:=BASS_ChannelGetPosition(stream);
Gauge.OnChange := nil;
try
Gauge.Position:=Trunc(BASS_ChannelBytes2Seconds(stream,pos));
finally
Application.ProcessMessages;
Gauge.OnChange := gaugeChange;
end;
end;
может что нибудь получиться.


> 2TTCustomDelphiMaster
> А когда влаг должен выключатся???


В последней строчке procedure TForm1.gaugeChange(Sender: TObject);


Юрий Зотов   (2002-07-28 17:57:00) [5]

Этот пример может не работать только в том случае, если не работает ВАШ код или не назначены обработчики событий. Других вариантов нет.

И если он не работает, то не заработает и способ с флагом.


anod   (2002-07-28 17:45:00) [6]

2Юрий Зотов
Ваш пример не заработал:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
pos:=BASS_ChannelGetPosition(stream);
Gauge.OnChange := nil;
try
Gauge.Position:=Trunc(BASS_ChannelBytes2Seconds(stream,pos));
finally
Gauge.OnChange := gaugeChange;
end;
end;

procedure TForm1.gaugeChange(Sender: TObject);
begin
BASS_ChannelSetPosition(stream, Gauge.Position);
end;


2TTCustomDelphiMaster
А когда влаг должен выключатся???


anod   (2002-07-28 17:36:00) [7]

Спасибо, попробую.


Юрий Зотов   (2002-07-28 17:05:00) [8]

Именно событие OnChange как раз для этого и подходит. А чтобы не было рекурсии, сделайте так:

procedure Timer1OnTimer(Sender: TObject);
begin
TrackBar1.OnChange := nil;
try
TrackBar1.Position := MediaPlayer1.Position
finally
TrackBar1.OnChange := TrackBar1Change
end
end;

procedure TrackBar1Change(Sender: TObject);
begin
MediaPlayer1.Position := TrackBar1.Position
end;


TTCustomDelphiMaster   (2002-07-28 16:58:00) [9]

Введите переменную - флаг.
При изменении позиции в OnTimer включайте флаг.
В обработчике onChange проверяйте если флаг включен значит изменение произошло от таймера, если нет - то по другим причинам. После этого флаг следует сбросить.


Наверх

Титульная страница Поиск, карта сайта Написать письмо