Мне трудно найти решение для этого. Я разрабатываю приложение для моделирования, и мне нужно отображать графики через определенные промежутки времени. У меня TTrackBar
. Я хочу увеличивать его значения с задержкой в 500 мс между каждым шагом увеличения.
Я написал этот метод, который вызывается из процедуры FormShow(Sender: TObject)
PROCEDURE playTrackBar (t: Real);
VAR
v : REAL;
BEGIN
v := t;
while <CONDITION> do
BEGIN
v := v + 1;
if (v >= Form4.TrackBar1.Max) then
BEGIN
v := 0;
END;
Form4.TrackBar1.Value := v;
sleep(500);
END;
END;
Я искал такое событие, как trackbar.isClicked()
, которое возвращает логическое значение, чтобы я мог остановить цикл while, но не смог найти такую функцию. Когда я использовал значение true
в <CONDITION>
, приложение вылетало (возможно, из-за бесконечного цикла).
Нужна помощь в поиске того, каким должен быть <CONDITION>
. Приму, если будут предоставлены какие-либо другие возможные решения для достижения автоматического увеличения / автоматического воспроизведения полосы прокрутки.
Как будет воспроизводиться видео, если ваш код все время тратит на выполнение этого цикла?
Извините за непонятность. На самом деле я не занимаюсь проектированием видеоплеера. Я просто приводил пример, когда трекбар имеет автоматическое воспроизведение. Я разрабатываю приложение для моделирования, и мне нужно отображать графики на каждом интервале. (Добавил это в вопрос. Спасибо.)
Проблема остается. Как ваша программа будет реагировать на ввод, когда она проведет всю свою жизнь внутри этого цикла?
Дэвид хочет сказать: поместите этот код в поток. Ваш код не будет работать так, как вы ожидаете, в однопоточном приложении. Сон дает возможность другим потокам выполнять свою работу. Но если есть только один поток ...
Программа не должна распределять все ресурсы ЦП. Когда вы обновляете компонент GUI или хотите, чтобы пользователь вводил данные, у системы должно быть время отразить эти события. Вызов сна - неправильный способ сделать это.
Используйте событие TTimer для анимации трекбара.
Поместите TTimer
в свою форму и установите для Enabled
значение false. Добавьте событие OnTimer:
procedure TMyForm.OnTimer1(Sender: TObject);
var
trackPos : Integer;
begin
trackPos := TrackBar1.Value;
if trackPos >= TrackBar1.Max then begin // Time to stop animation
Timer1.Enabled := False; // Or move this line to another event
TrackBar1.Value := 0; // Reset the value to zero
Exit;
end;
TrackBar1.Value := trackPos + 1;
end;
В вашей форме Show
event установите интервал обновления и запустите таймер:
procedure TMyForm.FormShow(Sender: TObject);
begin
TrackBar1.Max := 200;
TrackBar1.Value := 0;
Timer1.Interval := 500;
Timer1.Enabled := True; // Start the animation
end;
Анимация останавливается, когда значение трекбара достигает максимального значения.
Если вы хотите остановить анимацию по событию (пользователь что-то нажимает), просто переместите настройку включения таймера в это событие.
Вроде работает скорее для
TTimer
, чем дляSleep