Процедура автоматического увеличения трекбара в delphi

Мне трудно найти решение для этого. Я разрабатываю приложение для моделирования, и мне нужно отображать графики через определенные промежутки времени. У меня 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>. Приму, если будут предоставлены какие-либо другие возможные решения для достижения автоматического увеличения / автоматического воспроизведения полосы прокрутки.

Вроде работает скорее для TTimer, чем для Sleep

MBo 10.09.2018 04:48

Как будет воспроизводиться видео, если ваш код все время тратит на выполнение этого цикла?

David Heffernan 10.09.2018 08:31

Извините за непонятность. На самом деле я не занимаюсь проектированием видеоплеера. Я просто приводил пример, когда трекбар имеет автоматическое воспроизведение. Я разрабатываю приложение для моделирования, и мне нужно отображать графики на каждом интервале. (Добавил это в вопрос. Спасибо.)

vinayawsm 10.09.2018 10:06

Проблема остается. Как ваша программа будет реагировать на ввод, когда она проведет всю свою жизнь внутри этого цикла?

David Heffernan 10.09.2018 11:58

Дэвид хочет сказать: поместите этот код в поток. Ваш код не будет работать так, как вы ожидаете, в однопоточном приложении. Сон дает возможность другим потокам выполнять свою работу. Но если есть только один поток ...

The Bitman 11.09.2018 12:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
204
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Программа не должна распределять все ресурсы ЦП. Когда вы обновляете компонент 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;

Анимация останавливается, когда значение трекбара достигает максимального значения.


Если вы хотите остановить анимацию по событию (пользователь что-то нажимает), просто переместите настройку включения таймера в это событие.

Другие вопросы по теме