让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控件的播放变得更没用同步时一样流畅。