An AVI player for Delphi
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