675 lines
17 KiB
ObjectPascal
675 lines
17 KiB
ObjectPascal
(*
|
|
this file is a part of audio components suite.
|
|
see the license file for more details.
|
|
you can contact me at mail@z0m3ie.de
|
|
|
|
$Log: acs_file.pas,v $
|
|
Revision 1.11 2006/08/03 17:31:09 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.10 2006/07/09 16:40:34 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.9 2006/07/07 15:51:19 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.8 2006/07/04 17:12:45 z0m3ie
|
|
ACS 2.4 alt wiederhergestellt (unterschiedliche Sampleformate ...)
|
|
|
|
Revision 1.3 2006/01/01 18:46:40 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.2 2005/12/26 17:31:38 z0m3ie
|
|
fixed some problems in acs_dsfiles
|
|
fixed some problems in acs_vorbis
|
|
reworked all buffers
|
|
|
|
Revision 1.1 2005/12/19 18:34:35 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.10 2005/12/18 17:01:54 z0m3ie
|
|
delphi compatibility
|
|
|
|
Revision 1.9 2005/12/04 16:54:33 z0m3ie
|
|
All classes are renamed, Style TACS... than T... to avoid conflicts with other components (eg TMixer is TACSMixer now)
|
|
|
|
Revision 1.8 2005/10/05 20:26:36 z0m3ie
|
|
Linux changes
|
|
|
|
Revision 1.7 2005/10/02 16:51:46 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.6 2005/09/15 20:59:38 z0m3ie
|
|
start translate the documentation in the source for pasdoc
|
|
|
|
Revision 1.5 2005/09/13 21:54:11 z0m3ie
|
|
acs is localizeable now (ACS_Strings)
|
|
|
|
Revision 1.4 2005/09/13 20:14:25 z0m3ie
|
|
driver handling classes (basic audio class)
|
|
|
|
Revision 1.3 2005/09/13 04:37:30 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.2 2005/09/13 04:04:50 z0m3ie
|
|
First release without Components for Fileformats
|
|
only TFileIn and TFileOut are Visible
|
|
*)
|
|
|
|
{
|
|
@abstract(this unit introduces the base classes for acs)
|
|
@author(Christian Ulrich (2005))
|
|
|
|
this unit introduces basic fileformat support
|
|
}
|
|
|
|
unit acs_file;
|
|
|
|
{$ifdef fpc}
|
|
{$mode delphi}
|
|
{$endif}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, ACS_Classes, Dialogs, SysUtils, ACS_Strings;
|
|
|
|
type
|
|
TACSFileInClass = class of TACSCustomFileIn;
|
|
TACSFileOutClass = class of TACSCustomFileOut;
|
|
|
|
TACSFileCapTyp = (fcLoad,fcSave);
|
|
TACSFileCapTyps = set of TACSFileCapTyp;
|
|
|
|
{ TACSFileFormat }
|
|
|
|
TACSFormatClass = class of TComponent;
|
|
|
|
TACSFileFormat = class
|
|
public
|
|
FileClass : TACSFormatClass;
|
|
Extension : String;
|
|
Description : String;
|
|
end;
|
|
|
|
{ To this List all Filefomats must be added,
|
|
use initialization section of your format units to add your format to acs
|
|
so the user must only add your unit to the uses clausle to have support for
|
|
your fileformat.
|
|
}
|
|
|
|
{ tacsfileformatslist }
|
|
|
|
tacsfileformatslist = class (tlist)
|
|
public
|
|
destructor Destroy; override;
|
|
procedure Add(const Ext, Desc: String; AClass: TACSFormatClass);
|
|
function FindExt(ext : string;Typs : TACSFileCapTyps) : TACSFormatClass;
|
|
function FindFromFileName(const fileName : String;Typs : TACSFileCapTyps) : TACSFormatClass;
|
|
procedure Remove(AClass: TACSFormatClass);
|
|
procedure BuildFilterStrings(var descriptions: String;Typs : TACSFileCapTyps);
|
|
end;
|
|
|
|
{ This class is an wrapper for all fileformats
|
|
}
|
|
|
|
{ TFileIn }
|
|
|
|
TACSFileIn = CLASS(TACSCustomFileIn)
|
|
private
|
|
FEndSample: Integer;
|
|
FFileName: string;
|
|
FInput : TACSCustomFileIn;
|
|
FDialog : TOpenDialog;
|
|
FLoop: Boolean;
|
|
FStartSample: Integer;
|
|
FTotalSamples: Integer;
|
|
function GetBPS : Integer; override;
|
|
function GetCh : Integer; override;
|
|
function GetSR : Integer; override;
|
|
function GetTime : Integer;
|
|
function GetValid : Boolean;
|
|
function GetTotalTime : real; override;
|
|
procedure Reset; override;
|
|
procedure SetFileName(const AValue : String);
|
|
function GetSize : Integer;
|
|
function GetPosition : Integer;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy;override;
|
|
procedure Open;
|
|
|
|
procedure Flush; override;
|
|
procedure Init; override;
|
|
function Seek(SampleNum : Integer) : Boolean; override;
|
|
function GetData(Buffer : Pointer; BufferSize : Integer): Integer;override;
|
|
function SetStartTime(Minutes, Seconds : Integer) : Boolean;
|
|
function SetEndTime(Minutes, Seconds : Integer) : Boolean;
|
|
procedure Jump(Offs : real);
|
|
property Time : Integer read GetTime;
|
|
property TotalSamples : Integer read FTotalSamples;
|
|
property Valid : Boolean read GetValid;
|
|
property Size : Integer read GetSize;
|
|
property Position : Integer read GetPosition;
|
|
published
|
|
property EndSample : Integer read FEndSample write FEndSample;
|
|
property FileName : string read FFileName write SetFileName;
|
|
property Loop : Boolean read FLoop write FLoop;
|
|
property StartSample : Integer read FStartSample write FStartSample;
|
|
end;
|
|
|
|
|
|
{ This class is an wrapper for all fileformats
|
|
}
|
|
|
|
{ TFileOut }
|
|
|
|
TACSFileOut = class(TComponent)
|
|
private
|
|
FBufferSize: Integer;
|
|
FFileMode: TACSFileOutputMode;
|
|
FFileName: string;
|
|
FOnDone: TACSOutputDoneEvent;
|
|
FOnProgress: TACSOutputProgressEvent;
|
|
FOnThreadException: TACSThreadExceptionEvent;
|
|
FOutput : TACSCustomFileOut;
|
|
FDialog : TSaveDialog;
|
|
FInput : TACSCustomInput;
|
|
{$IFDEF LINUX}
|
|
FAccessMask : Integer;
|
|
{$ENDIF}
|
|
function GetDelay: Integer;
|
|
function GetPriority: TTPriority;
|
|
function GetProgress: real;
|
|
function GetStatus: TACSOutputStatus;
|
|
function GetTE: Integer;
|
|
procedure SetDelay(const AValue: Integer);
|
|
procedure SetPriority(const AValue: TTPriority);
|
|
|
|
procedure ThreadException(Sender : TComponent;E : Exception);
|
|
procedure OutputDone(Sender : TComponent);
|
|
procedure OutputProgress(Sender : TComponent);
|
|
protected
|
|
FBaseChannel: Integer;
|
|
procedure SetInput(vInput : TACSCustomInput);
|
|
procedure Done;
|
|
function DoOutput(Abort : Boolean):Boolean;
|
|
procedure Prepare;
|
|
procedure SetFileMode(aMode : TACSFileOutputMode); virtual;
|
|
procedure SetFileName(const AValue: string);
|
|
public
|
|
destructor Destroy;override;
|
|
procedure Open;
|
|
property Buffersize : Integer read FBufferSize write FBufferSize;
|
|
procedure Pause;virtual;
|
|
procedure Resume;virtual;
|
|
procedure Run;
|
|
procedure Stop;
|
|
property Delay : Integer read GetDelay write SetDelay;
|
|
property ThreadPriority : TTPriority read GetPriority write SetPriority;
|
|
property Progress : real read GetProgress;
|
|
property Status : TACSOutputStatus read GetStatus;
|
|
property TimeElapsed : Integer read GetTE;
|
|
{$IFDEF LINUX}
|
|
property AccessMask : Integer read FAccessMask write FAccessMask;
|
|
{$ENDIF}
|
|
published
|
|
property FileMode : TACSFileOutputMode read FFileMode write SetFileMode;
|
|
property FileName : string read FFileName write SetFileName;
|
|
property Input : TACSCustomInput read FInput write SetInput;
|
|
property OnDone : TACSOutputDoneEvent read FOnDone write FOndone;
|
|
property OnProgress : TACSOutputProgressEvent read FOnProgress write FOnProgress;
|
|
property OnThreadException : TACSThreadExceptionEvent read FOnThreadException write FOnThreadException;
|
|
end;
|
|
|
|
var
|
|
FileFormats : TACSFileFormatsList;
|
|
|
|
implementation
|
|
|
|
{ TFileIn }
|
|
|
|
function TACSFileIn.GetBPS: Integer;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.BitsPerSample;
|
|
end;
|
|
|
|
function TACSFileIn.GetCh: Integer;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.Channels;
|
|
end;
|
|
|
|
function TACSFileIn.GetSR: Integer;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.SampleRate;
|
|
end;
|
|
|
|
function TACSFileIn.GetTime: Integer;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.Time;
|
|
end;
|
|
|
|
function TACSFileIn.GetValid: Boolean;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.Valid;
|
|
end;
|
|
|
|
function TACSFileIn.GetTotalTime: real;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
exit;
|
|
Result := FInput.TotalTime;
|
|
end;
|
|
|
|
procedure TACSFileIn.Reset;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FInput.Reset;
|
|
end;
|
|
|
|
procedure TACSFileIn.SetFileName(const AValue: string);
|
|
begin
|
|
FFileName := AValue;
|
|
if Assigned(FInput) then
|
|
FInput.Free;
|
|
FInput := nil;
|
|
if AValue = '' then
|
|
exit;
|
|
FInput := TACSFileInClass(FileFormats.FindFromFileName(AValue,[fcLoad])).Create(nil);
|
|
if Assigned(FInput) then
|
|
FInput.FileName := FFilename;
|
|
end;
|
|
|
|
function TACSFileIn.GetSize: Integer;
|
|
begin
|
|
Result := 1;
|
|
if Assigned(FInput) then
|
|
Result := FInput.Size;
|
|
end;
|
|
|
|
function TACSFileIn.GetPosition: Integer;
|
|
begin
|
|
Result := 0;
|
|
if Assigned(FInput) then
|
|
Result := FInput.Position;
|
|
end;
|
|
|
|
constructor TACSFileIn.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
end;
|
|
|
|
destructor TACSFileIn.Destroy;
|
|
begin
|
|
if Assigned(FInput) then
|
|
FInput.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TACSFileIn.Open;
|
|
var
|
|
desc : string;
|
|
begin
|
|
FDialog := TOpenDialog.Create(nil);
|
|
FileFormats.BuildFilterStrings(desc,[fcLoad]);
|
|
FDialog.Filter := desc;
|
|
if FDialog.Execute then
|
|
begin
|
|
if Assigned(FInput) then
|
|
FInput.Free;
|
|
FInput := TACSFileInClass(FileFormats.FindFromFileName(FDialog.FileName,[fcLoad])).Create(nil);
|
|
FFileName := FDialog.FileName;
|
|
if Assigned(FInput) then
|
|
FInput.FileName := FFilename;
|
|
end;
|
|
FDialog.Free;
|
|
end;
|
|
|
|
procedure TACSFileIn.Flush;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FInput.Flush;
|
|
end;
|
|
|
|
procedure TACSFileIn.Init;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FInput.Init;
|
|
end;
|
|
|
|
function TACSFileIn.Seek(SampleNum : Integer): Boolean;
|
|
begin
|
|
if not Assigned(Finput) then
|
|
EACSException.Create(strnoFileOpened);
|
|
FInput.Seek(SampleNum);
|
|
end;
|
|
|
|
function TACSFileIn.GetData(Buffer: Pointer; BufferSize: Integer): Integer;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result:=FInput.GetData(Buffer, BufferSize);
|
|
end;
|
|
|
|
function TACSFileIn.SetStartTime(Minutes, Seconds: Integer): Boolean;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.SetStartTime(Minutes,Seconds);
|
|
end;
|
|
|
|
function TACSFileIn.SetEndTime(Minutes, Seconds: Integer): Boolean;
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FInput.SetEndTime(Minutes,Seconds);
|
|
end;
|
|
|
|
procedure TACSFileIn.Jump(Offs: real);
|
|
begin
|
|
if not Assigned(FInput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FInput.Jump(Offs);
|
|
end;
|
|
|
|
{ TACSFileOut }
|
|
|
|
procedure TACSFileOut.SetFileName(const AValue: string);
|
|
begin
|
|
if FFileName=AValue then exit;
|
|
if Assigned(FOutput) then
|
|
FOutput.Free;
|
|
FOutput := nil;
|
|
FOutput := TACSFileOutClass(FileFormats.FindFromFileName(AValue,[fcSave])).Create(nil);
|
|
if Assigned(FOutput) then
|
|
begin
|
|
FOutput.FileName:=AValue;
|
|
foutput.FileMode := FFileMode; //GAK:20060731
|
|
FOutput.Input := FInput;
|
|
FOutput.OnDone := OutputDone;
|
|
FOutput.OnProgress := OutputProgress;
|
|
Foutput.OnThreadException := ThreadException;
|
|
ffilename := avalue;//GAK:20060731
|
|
end;
|
|
end;
|
|
|
|
procedure TACSFileOut.Done;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Done;
|
|
end;
|
|
|
|
function TACSFileOut.DoOutput(Abort: Boolean): Boolean;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FOutput.DoOutput(Abort);
|
|
end;
|
|
|
|
procedure TACSFileOut.Prepare;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Prepare;
|
|
end;
|
|
|
|
function TACSFileOut.GetDelay: Integer;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
result := FOutput.Delay;
|
|
end;
|
|
|
|
function TACSFileOut.GetPriority: TTPriority;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FOutput.ThreadPriority;
|
|
end;
|
|
|
|
function TACSFileOut.GetProgress: real;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FOutput.Progress;
|
|
end;
|
|
|
|
function TACSFileOut.GetStatus: TACSOutputStatus;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FOutput.Status;
|
|
end;
|
|
|
|
function TACSFileOut.GetTE: Integer;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
Result := FOutput.TimeElapsed;
|
|
end;
|
|
|
|
procedure TACSFileOut.SetDelay(const AValue: Integer);
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Delay := AValue;
|
|
end;
|
|
|
|
procedure TACSFileOut.SetPriority(const AValue: TTPriority);
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.ThreadPriority := AValue;
|
|
end;
|
|
|
|
procedure TACSFileOut.ThreadException(Sender : TComponent;E: Exception);
|
|
begin
|
|
if Assigned(OnThreadException) then
|
|
OnThreadException(Sender,E);
|
|
end;
|
|
|
|
procedure TACSFileOut.OutputDone(Sender: TComponent);
|
|
begin
|
|
if Assigned(OnDone) then
|
|
OnDone(Sender);
|
|
end;
|
|
|
|
procedure TACSFileOut.OutputProgress(Sender: TComponent);
|
|
begin
|
|
if Assigned(OnProgress) then
|
|
OnProgress(Sender);
|
|
end;
|
|
|
|
procedure TACSFileOut.SetInput(vInput: TACSCustomInput);
|
|
begin
|
|
FInput := vInput;
|
|
if Assigned(FOutput) then
|
|
FOutput.Input := FInput;
|
|
end;
|
|
|
|
procedure TACSFileOut.SetFileMode(aMode: TACSFileOutputMode);
|
|
begin
|
|
//GAK:20060731 changed whole of this method, as it was stopping component loading/creating
|
|
if amode <> ffilemode then
|
|
begin
|
|
FFileMode := amode;
|
|
if Assigned(FOutput) then FOutput.FileMode := aMode;
|
|
end;
|
|
end;
|
|
|
|
procedure TACSFileOut.Open;
|
|
var
|
|
desc : string;
|
|
|
|
begin
|
|
FDialog := TSaveDialog.Create(nil);
|
|
FileFormats.BuildFilterStrings(desc,[fcSave]);
|
|
FDialog.Filter := desc;
|
|
if FDialog.Execute then
|
|
begin
|
|
FOutput := TACSFileOutClass(FileFormats.FindFromFileName(FDialog.FileName,[fcSave])).Create(nil);
|
|
FileName := FDialog.FileName;
|
|
foutput.FileMode := ffilemode;
|
|
FOutput.Input := FInput;
|
|
FInput := FInput;
|
|
FOutput.OnDone := OutputDone;
|
|
FOutput.OnProgress := OutputProgress;
|
|
Foutput.OnThreadException := ThreadException;
|
|
end;
|
|
FDialog.Free;
|
|
end;
|
|
|
|
procedure TACSFileOut.Pause;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Pause;
|
|
end;
|
|
|
|
procedure TACSFileOut.Resume;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Resume;
|
|
end;
|
|
|
|
procedure TACSFileOut.Run;
|
|
begin
|
|
if not Assigned(FOutput) then
|
|
raise EACSException.Create(strNoFileOpened);
|
|
FOutput.Run;
|
|
end;
|
|
|
|
procedure TACSFileOut.Stop;
|
|
begin
|
|
if Assigned(FOutput) then
|
|
FOutput.Stop;
|
|
end;
|
|
|
|
destructor TACSFileOut.Destroy;
|
|
begin
|
|
if Assigned(FOutput) then
|
|
FOutput.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
{ TACSFileFormatsList }
|
|
|
|
destructor tacsfileformatslist.Destroy;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i:= 0 to Count-1 do
|
|
TACSFileFormat(Items[i]).Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TACSFileFormatsList.Add(const Ext, Desc: String;AClass: TACSFormatClass);
|
|
var
|
|
newRec : TACSFileFormat;
|
|
begin
|
|
newRec:=TACSFileFormat.Create;
|
|
with newRec do
|
|
begin
|
|
Extension:=LowerCase(Ext);
|
|
FileClass:=AClass;
|
|
Description:=Desc;
|
|
end;
|
|
inherited Add(newRec);
|
|
end;
|
|
|
|
function TACSFileFormatsList.FindExt(ext: string;Typs : TACSFileCapTyps): TACSFormatClass;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
ext:=LowerCase(ext);
|
|
for i:=Count-1 downto 0 do
|
|
with TACSFileFormat(Items[I]) do
|
|
begin
|
|
if ((fcLoad in Typs) and (TACSFileFormat(Items[I]).FileClass.InheritsFrom(TACSCustomFileIn))) or ((fcSave in Typs) and (TACSFileFormat(Items[I]).FileClass.InheritsFrom(TACSCustomFileOut))) then
|
|
if Extension=ext then
|
|
begin
|
|
Result:=TACSFileFormat(Items[I]).FileClass;
|
|
Exit;
|
|
end;
|
|
end;
|
|
Result:=nil;
|
|
end;
|
|
|
|
function TACSFileFormatsList.FindFromFileName(const fileName: String;Typs : TACSFileCapTyps): TACSFormatClass;
|
|
var
|
|
ext : String;
|
|
begin
|
|
ext:=ExtractFileExt(Filename);
|
|
System.Delete(ext, 1, 1);
|
|
Result:=FindExt(ext,Typs);
|
|
if not Assigned(Result) then
|
|
raise EACSException.CreateFmt(strUnknownExtension, [ext]);
|
|
end;
|
|
|
|
procedure TACSFileFormatsList.Remove(AClass: TACSFormatClass);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i:=Count-1 downto 0 do begin
|
|
if TACSFileFormat(Items[i]).FileClass.InheritsFrom(AClass) then
|
|
begin
|
|
TACSFileFormat(Items[i]).Free;
|
|
Delete(i);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TACSFileFormatsList.BuildFilterStrings(var descriptions : String;Typs : TACSFileCapTyps);
|
|
var
|
|
k, i : Integer;
|
|
p : TACSFileFormat;
|
|
filters : string;
|
|
begin
|
|
descriptions:='';
|
|
filters := '';
|
|
k:=0;
|
|
for i:=0 to Count-1 do
|
|
begin
|
|
p:=TACSFileFormat(Items[i]);
|
|
if ((fcLoad in Typs) and (p.FileClass.InheritsFrom(TACSCustomFileIn))) or ((fcSave in Typs) and (p.FileClass.InheritsFrom(TACSCustomFileOut))) then
|
|
with p do
|
|
begin
|
|
if k<>0 then
|
|
begin
|
|
descriptions:=descriptions+'|';
|
|
filters := filters+';';
|
|
end;
|
|
descriptions:=descriptions+Description+' (*.'+Extension+')|'+'*.'+Extension;
|
|
filters := filters+'*.'+Extension;
|
|
Inc(k);
|
|
end;
|
|
end;
|
|
descriptions := strAllFormats+'|'+filters+'|'+descriptions;
|
|
end;
|
|
|
|
initialization
|
|
|
|
FileFormats := TACSFileFormatsList.Create;
|
|
|
|
finalization
|
|
|
|
FileFormats.Free;
|
|
|
|
end.
|
|
|