Delphi TrackBar при остановке

Я делаю простой музыкальный проигрыватель и использую TTrackBar в качестве прогресса в песне. Также я хочу сделать так, чтобы вы могли перетаскивать панель и перематывать песню вперед.

В настоящее время у меня есть событие OnChange со следующей строкой:

MediaPlayer1.position := TrackBar1.value... (with proper casting)

но что происходит, так это то, что он пропускает песню, когда я перетаскиваю, издавая прерывистый звук, когда он воспроизводит песню в определенных случайных точках по пути.

Чего я действительно хочу, так это того, что когда пользователь перестанет перетаскивать, песня должна измениться. Что это за событие? OnStopDrop даже не помогает.


person Jister13    schedule 06.06.2014    source источник


Ответы (1)


Уведомления о прокрутке поступают через WM_HSCROLL или WM_VSCROLL, в зависимости от ориентации трекбара. Эти поверхности в VCL управляются как CN_HSCROLL и CN_VSCROLL. Вам необходимо обрабатывать эти сообщения и игнорировать сообщения, для которых код прокрутки равен TB_THUMBTRACK, чтобы элемент управления не запускал событие OnChange, когда пользователь перетаскивает ползунок.

Например, вот элемент управления интерпозера, который делает то, что вам нужно:

type
  TTrackBar = class(Vcl.ComCtrls.TTrackBar)
  protected
    procedure CNHScroll(var Message: TWMHScroll); message CN_HSCROLL;
    procedure CNVScroll(var Message: TWMVScroll); message CN_VSCROLL;
  end;

implementation

procedure TTrackBar.CNHScroll(var Message: TWMHScroll);
begin
  if Message.ScrollCode = TB_THUMBTRACK then
    Message.Result := 0
  else
    inherited;
end;

procedure TTrackBar.CNVScroll(var Message: TWMVScroll);
begin
  if Message.ScrollCode = TB_THUMBTRACK then
    Message.Result := 0
  else
    inherited;
end;
person David Heffernan    schedule 06.06.2014
comment
При горизонтальном трекбаре TTrackBar.CNHScroll всегда вызывается ровно ДВАЖДЫ в else inherited. - person user1580348; 08.02.2019