Contributor: ANDREA MOLINO This is a control for playing avi files. unit AVICtrl; interface { TAVIControl V 0.9b Programmed by Andrea Molino easytarg@mbox.vol.it } uses Windows, Messages, SysUtils, Classes, Graphics, Controls, CommCtrl; Type TAVIControlState = (acsClose, acsOpen, acsPlay); TAVIControlError = (acrOK, acrOpenFailed, acrPlayFailed, acsSeekFailed); TAVIControl = class(TWinControl) private FAVIState: TAVIControlState; FAVIName: String; FFrameFrom: SmallInt; FFrameTo: SmallInt; FFrameSeek: SmallInt; FAutoSize: Boolean; FAutoRepeat: Boolean; FLastOpStatus: TAVIControlError; FAux: String; Procedure SetAVIState(Val: TAVIControlState); Procedure SetAVIName(Val: String); Procedure SetFrameFrom(Val: SmallInt); Procedure SetFrameTo(Val: SmallInt); Procedure SetFrameSeek(Val: SmallInt); Procedure SetAutoSize(Val: Boolean); Procedure SetAutoRepeat(Val: Boolean); Function GetLastOpStatus: String; protected procedure CreateParams(var Params: TCreateParams); Override; procedure CreateWnd; Override; public Constructor Create(AOwner: TComponent); override; Destructor Destroy; override; Function Open(FileName: String): Boolean; Procedure Close; Function Play(FName: String; RepCount: SmallInt): Boolean; Function Seek(Frame: SmallInt): Boolean; Procedure Stop; published Property AVIState: TAVIControlState Read FAVIState Write SetAVIState Default acsClose; Property AVIName: String Read FAVIName Write SetAVIName; Property FrameFrom: SmallInt Read FFrameFrom Write SetFrameFrom Default 0; Property FrameTo: SmallInt Read FFrameTo Write SetFrameTo Default -1; Property FrameSeek: SmallInt Read FFrameSeek Write SetFrameSeek Default 0; Property AutoSize: Boolean Read FAutoSize Write SetAutoSize Default False; Property AutoRepeat: Boolean Read FAutoRepeat Write SetAutoRepeat Default True; Property ZStatus: String Read GetLastOpStatus Write FAux; property Align; property Enabled; property PopupMenu; property ShowHint; property Visible; property OnMouseDown; property OnMouseMove; property OnMouseUp; end; procedure Register; implementation Constructor TAVIControl.Create(AOwner: TComponent); Begin inherited Create(AOwner); ControlStyle := ControlStyle -[csSetCaption]; FAVIState := acsClose; FFrameFrom := 0; FFrameTo := -1; FAutoSize := False; FAutoRepeat := True; FLastOpStatus := acrOK; Width := 30; Height := 30; End; Destructor TAVIControl.Destroy; Begin Inherited Destroy; End; procedure TAVIControl.CreateParams(var Params: TCreateParams); begin {ACS_AUTOPLAY - Starts playing the animation as soon as the animation clip is opened. ACS_CENTER - Centers the animation in the animation control's window. ACS_TRANSPARENT - Draws the animation using a transparent background rather than the background color specified in the animation clip.} InitCommonControls; Inherited CreateParams(Params); CreateSubClass(Params, 'SysAnimate32'); With Params do Begin Style := Style Or ACS_TRANSPARENT; If Not FAutoSize Then Style := Style Or ACS_CENTER; End; end; procedure TAVIControl.CreateWnd; begin Inherited CreateWnd; If FAVIState = acsOpen Then Open(FAVIName); If FAVIState = acsPlay Then Begin Open(FAVIName); Play('', 0); End; end; Procedure TAVIControl.SetAVIState(Val: TAVIControlState); Begin If Val <> FAVIState Then Begin FAVIState := Val; Case FAVIState Of acsOpen : Begin Open(FAVIName) End; acsPlay : Begin Open(FAVIName); Play('', 0); End; acsClose: Close; End; End; End; Procedure TAVIControl.SetAVIName(Val: String); Var FTmpState: TAVIControlState; Begin If Val <> FAVIName Then Begin FAVIName := Val; FTmpState := FAVIState; Close; If FTmpState = acsOpen Then Open(FAVIName); If FTmpState = acsPlay Then Play('', 0); End; End; Procedure TAVIControl.SetFrameFrom(Val: SmallInt); Begin If Val <> FFrameFrom Then Begin FFrameFrom := Val; If FAVIState = acsPlay Then Play('', 0); End; End; Procedure TAVIControl.SetFrameTo(Val: SmallInt); Begin If Val <> FFrameTo Then Begin FFrameTo := Val; If FAVIState = acsPlay Then Play('', 0); End; End; Procedure TAVIControl.SetFrameSeek(Val: SmallInt); Begin If Val <> FFrameSeek Then Begin FFrameSeek := Val; Seek(FrameSeek); End; End; Procedure TAVIControl.SetAutoSize(Val: Boolean); Begin If Val <> FAutoSize Then Begin FAutoSize := Val; RecreateWnd; End; End; Procedure TAVIControl.SetAutoRepeat(Val: Boolean); Begin If Val <> FAutoRepeat Then Begin FAutoRepeat := Val; If FAVIState = acsPlay Then Play('', 0); End; End; Function TAVIControl.GetLastOpStatus: String; Begin Case FLastOpStatus Of acrOK : Result := 'OK'; acrOpenFailed: Result := 'Open Failed'; acrPlayFailed: Result := 'Play Failed'; End; End; Function TAVIControl.Open(FileName: String): Boolean; Var Res: LongInt; Begin FLastOpStatus := acrOK; If FAVIState <> acsClose Then Close; Res := SendMessage(Handle, ACM_OPEN, 0, LongInt(PChar(FileName))); FAVIName := FileName; If Res <> 0 Then FAVIState := acsOpen Else FLastOpStatus := acrOpenFailed; Result := (Res <> 0); End; Procedure TAVIControl.Close; Var Res: LongInt; Begin FLastOpStatus := acrOK; Res := SendMessage(Handle, ACM_OPEN, 0, 0); FAVIState := acsClose; Repaint; End; Function TAVIControl.Seek(Frame: SmallInt): Boolean; Var Res: LongInt; Begin FLastOpStatus := acrOK; If FAVIState = acsClose Then Open(FAVIName) Else If FAVIState = acsPlay Then Stop; If FAVIState <> acsClose Then Begin Res := SendMessage(Handle, ACM_PLAY, 1, MAKELONG(Frame, Frame)); If Res = 0 Then FLastOpStatus := acsSeekFailed; Result := (Res <> 0); End Else Result := False; End; Function TAVIControl.Play(FName: String; RepCount: SmallInt): Boolean; Var Res: LongInt; Rep: SmallInt; Begin FLastOpStatus := acrOK; If FName = '' Then Open(FAVIName) Else Open(FName); If FAVIState <> acsClose Then Begin If FAutoRepeat And (RepCount = 0) Then Rep := -1 Else If RepCount = 0 Then Rep := 1 Else Rep := RepCount; Res := SendMessage(Handle, ACM_PLAY, Rep, MAKELONG(FFrameFrom, FFrameTo)); If (Res <> 0) And FAutoRepeat Then FAVIState := acsPlay Else FLastOpStatus := acrPlayFailed; Result := (Res <> 0); End Else Result := False; End; Procedure TAVIControl.Stop; Var Res: LongInt; Begin FLastOpStatus := acrOK; If FAVIState <> acsClose Then Begin Res := SendMessage(Handle, ACM_PLAY, 0, MAKELONG(0, 0)); If FAVIState = acsPlay Then FAVIState := acsOpen; End; End; procedure Register; begin RegisterComponents('MyGold', [TAVIControl]); end; end.