TShockWareFlash控件用Timer控件与TrackBar同步存在的问题(delphi)

来源:互联网 发布:linux系统下载中文版 编辑:程序博客网 时间:2024/06/06 19:17

让TrackBar与TShockWareFlash的播放同步,可以设置TrackBar的Max等于Flash控件的总帧数,然后用Timer进行同步,但这样会出现一个小问题,同步后,Flash的播放效果不佳,出现断断续续的情况。同步的实现,如:

//获取当前播放Flash的总帧数和当前播放的帧
      trckbrFlashProgress1.Min := 0;
      trckbrFlashProgress1.Max := shckwvflshTest.TotalFrames;//设为Flash的总帧数
      //让记时器开始
      tmrFlash.Enabled := True;//用Timer控件进行同步,开始计时

 

然后在Timer控件的OnTimer事件中进行同步,如下:

procedure TfrmTest.tmrFlashTimer(Sender: TObject);
begin

  //计时器每跳一次,让TrackBar移动到相应位置
  trckbrFlashProgress1.Position := shckwvflshTest.FrameNum;
end;

 

在拖动TrackBar控件进度时,Flash的播放也要跳到相应的位置,则在TrackBar的OnChange事件中这样写:

procedure TfrmTest.trckbrFlashProgress1Change(Sender: TObject);
var
  gotoFrame: Integer;
begin
  //Flash播放前进到相应帧
  gotoFrame := trckbrFlashProgress1.Position;
  shckwvflshTest.GotoFrame(gotoFrame);
  shckwvflshTest.Play();
end;

 

但是这样做之后,会出现一个问题,在Flash播放的时候,画面和声音都是不连续的,会出现断断续续的情况。主要原因还是在Timer的OnTimer事件中。产生此种情况的原因是,Timer跳一次,则TrackBar跳一次,而TrackBar的跳动,又会引起其OnChange事件的调用,此时Flash控件的当前帧也要变,而Flash播放的帧改变是在TrackBar改变之前的,在TrackBar位置改变后,又会让Flash控件改变播放位置,所以就造成了播放不连续的效果,会断断续续的播放。

 

解决的办法为:

在OnTimer事件中,不能直接改变TrackBar的进度位置,应该使用SendMessage函数改变其进度的位置,改写的OnTimer事件如下:

procedure TfrmOSTeacherMain.tmrStudyTrainFlashTimer(Sender: TObject);
begin
  SendMessage(trckbrFlashProgress1.Handle, WM_USER+5, 1,       shckwvflshTest.FrameNum);
end;

 

这样一来,问题就解决了,TShockWareFlash控件的播放变得更没用同步时一样流畅。

原创粉丝点击