home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Personal Computer World 1995 May
/
pcw-0595.bin
/
demos
/
databeck
/
wsounds
/
setup.dir
/
wswsrc.exe
/
DATAOBJ.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-12-02
|
31KB
|
1,037 lines
{ Unit Dataobj - for reading WAV file information }
Unit Dataobj;
Interface
Uses WObjects, WinDos, Wincrt, WinTypes, WinProcs, Strings, MMSystem, BWCC,
WaveUtil, StrTool;
TYPE
DirStr = Array[0..128] of Char;
DirStrP2 = Array[0..130] of Char;
WAVEDataType = RECORD
FileName : ARRAY[0..12] OF Char; { WAV file name }
PathName : DirStr; { Search path }
CreationDate : LongInt; { File date }
FileSize : LongInt; { File size }
FileComment : ARRAY[0..63] OF CHAR; { WAV comments }
DiskDrive : Char; { Drive letter }
DiskLabel : ARRAY[0..12] OF CHAR; { LW label }
SampRate : WORD;
Channels : BYTE;
Save2Wave : BYTE; {Flag, whether WAV file should be stored }
{0 = No, 1 = Yes, 2 = Yes, but not successful yet }
END;
WAVECriteria = RECORD
WName : ARRAY[0..12] OF Char; { WAV file name }
WLabl : Array[0..12] OF CHAR;
WPath : DirStr;
WDat : Byte;
WDay : Array[0..2] OF Char;
WMon : Array[0..2] OF Char;
WYear : Array[0..4] OF Char;
WCon0 : Byte;
WBase : ARRAY[0..63] OF CHAR; { WAV comments }
WCon1 : Byte;
WLim1 : ARRAY[0..63] OF CHAR; { WAV comments }
WCon2 : Byte;
WLim2 : ARRAY[0..63] OF CHAR; { WAV comments }
END;
PWaveData = ^TWaveData;
TWaveData = OBJECT(TObject)
WD : WAVEDataType; { A record containing all data record values }
CONSTRUCTOR Init(WData : WAVEDataType); { Initializes an object instance }
CONSTRUCTOR Load(VAR S : TStream); { Method for loading instance }
PROCEDURE Store(VAR S : TStream); { Method for saving instance }
Procedure GetData(VAR WDL : WaveDataType); { Method for reading data }
Procedure Write; virtual; { Method for displaying instance }
DESTRUCTOR Done; virtual; { Removes instance from memory }
END;
PWaveCollection = ^TWaveCollection;
TWaveCollection = OBJECT(TSortedCollection)
function Compare(Key1, Key2: Pointer): Integer; virtual; { Method for comparing two instances }
end;
CONST
RWaveData : TStreamRec = ( { Registration of type TWaveData }
ObjType : 1000;
VMTLink : Ofs(TypeOf(TWaveData)^);
Load : @TWaveData.Load;
Store : @TWaveData.Store
);
RWaveColl : TStreamRec = ( { Registration of type TWaveCollection }
ObjType : 1001;
VMTLink : Ofs(TypeOf(TWaveCollection)^);
Load : @TWaveCollection.Load;
Store : @TWaveCollection.Store
);
RPlayColl : TStreamRec = ( { Registration of type TWaveCollection }
ObjType : 1002;
VMTLink : Ofs(TypeOf(TCollection)^);
Load : @TCollection.Load;
Store : @TCollection.Store
);
WildCard = '*.*'; { Wildcard for all files }
ChooseWild = 'WAV'; { Wildcard for WAV files }
C2W_DontSave = 0; {Flags for comments in WAV files}
C2W_IsSaved = 1;
C2W_Save = 3;
PROCEDURE WD_RegisterStreamTypes;
PROCEDURE WD_ListAll(Data : PCollection);
PROCEDURE WD_InsertAll(Data : PCollection; List : PListBox);
PROCEDURE WD_CopyAll(DataSource, DataDest : PCollection);
PROCEDURE WD_KillDoubles(VAR GetBack:Integer);
PROCEDURE WD_SearchAll(HW : HWnd;DataSource, DataDest : PCollection; Criteria : WaveCriteria; VAR CurrCount : Integer);
FUNCTION WD_Search_NextOne(HW : HWnd;Num : Integer; Item : PWaveData; CRW : WaveCriteria) : Integer;
FUNCTION WD_SearchNext(HW:HWnd;Num : Integer; Item : PWaveData; CRW : WaveCriteria) : Integer;
PROCEDURE WD_TMP2DAT;
Procedure WD_Scan4WorkDir;
FUNCTION WD_NewShortPath(VAR RPath : DirStr; APath : DirStrP2; MaxLen : Integer) : PChar;
Function Exists(FileName : PChar):Boolean;
Procedure WD_NewShortHelp(APath : DirStrP2; MaxLen : Integer);
VAR
WAVECollect : PWaveCollection; { Variable for Database instance }
WaveSelectColl : PWaveCollection; { Variable for Select data instance }
WaveTakeColl : PWaveCollection; { Variable for final selected files }
WavePlayColl : PCollection; { Variable for Play data instance }
WaveDummyColl : PWAVECollection;
WaveStream : PBufStream; { Variable for file stream }
WAVEDummy : WaveDataType; { Dummy variable for filling data records }
WaveDCrit : WaveCriteria;
RootPath : Array[0..fsPathName] of Char;
RootDir : Array[0..fsDirectory] of Char;
RootFile : Array[0..fsFileName] of Char;
RootExt : Array[0..fsExtension] of Char;
WF_TMP : Array[0..145] of Char;
WF_DAT : Array[0..145] of Char;
WF_CAS : Array[0..145] of Char;
WF_EVE : Array[0..145] of Char;
DBChanged : Boolean; { Flag, whether database has been changed }
ShortHelp : DirStrP2;
ShortMain : DirStrP2;
IMPLEMENTATION
VAR
GlobDum : DirStr;
{---------------------------------------------------------------------------------------------}
{ TWaveData }
CONSTRUCTOR TWaveData.Init(WData : WAVEDataType);
BEGIN
WD := WData;
END;
CONSTRUCTOR TWaveData.Load(VAR S : TStream);
BEGIN
S.Read(WD,SizeOf(WD));
END;
PROCEDURE TWaveData.Store(VAR S : TStream);
BEGIN
S.Write(WD,SizeOf(WD));
END;
PROCEDURE TWaveData.GetData(VAR WDL : WaveDataType);
BEGIN
WDL := WD;
END;
PROCEDURE TWaveData.Write;
BEGIN
WriteLn('--------------------------------------------------');
WriteLn(' Name : ',WD.FileName,', Size : ',WD.FileSize);
WriteLn(' Disk : ', WD.DiskLabel,' -> ',WD.DiskDrive, ':',WD.PathName);
WriteLn(' Comm : ', WD.FileComment);
END;
DESTRUCTOR TWaveData.Done;
BEGIN
END;
{----------------------------------------------------------------------------------------------}
function TWaveCollection.Compare(Key1, Key2: Pointer): Integer;
{ Compare criteria is file name }
VAR
PWD1, PWD2 : WaveDataType;
Check : Integer;
begin
PWaveData(Key1)^.GetData(PWD1);
PWaveData(Key2)^.GetData(PWD2);
IF (StrPas(pwd1.FileName) < StrPas(pwd2.FileName)) THEN Check := -1 Else
IF (StrPas(pwd1.FileName) > StrPas(pwd2.FileName)) THEN Check := 1 Else
Check := 0;
IF (Check = 0) THEN BEGIN
IF (StrPas(pwd1.PathName) < StrPas(pwd2.PathName)) THEN Check := -1 Else
IF (StrPas(pwd1.PathName) > StrPas(pwd2.PathName)) THEN Check := 1 Else
Check := 0;
END;
IF (Check = 0) THEN BEGIN
IF (StrPas(pwd1.DiskLabel) < StrPas(pwd2.DiskLabel)) THEN Check := -1 Else
IF (StrPas(pwd1.DiskLabel) > StrPas(pwd2.DiskLabel)) THEN Check := 1 Else
Check := 0;
END;
IF (Check = 0) THEN BEGIN
IF ((pwd1.DiskDrive) < (pwd2.DiskDrive)) THEN Check := -1 Else
IF ((pwd1.DiskDrive) > (pwd2.DiskDrive)) THEN Check := 1 Else
Check := 0;
END;
IF (Check = 0) THEN BEGIN
IF ((pwd1.FileSize) < (pwd2.FileSize)) THEN Check := -1 Else
IF ((pwd1.FileSize) > (pwd2.FileSize)) THEN Check := 1 Else
Check := 0;
END;
IF (Check = 0) THEN BEGIN
IF ((pwd1.CreationDate) < (pwd2.CreationDate)) THEN Check := -1 Else
IF ((pwd1.CreationDate) > (pwd2.CreationDate)) THEN Check := 1 Else
Check := 0;
END;
Compare := Check;
{Compare := StrComp(PWD1.FileName,PWD1.FileName);}
end;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_RegisterStreamTypes;
{
*** Input : None
*** Output : None
*** Remarks : Registers data stream types
}
BEGIN
RegisterType (RWaveData);
RegisterType (RWaveColl);
RegisterType (RPlayColl);
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_ListAll(Data : PCollection);
{
*** Input : Pointer to collection
*** Output : None
*** Remarks : Displays all collection elements on the screen
}
PROCEDURE List_One(Item : PWaveData); FAR;
BEGIN
Item^.Write;
END;
BEGIN
Data^.ForEach(@List_One);
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_InsertAll(Data : PCollection; List : PListBox);
{
*** Input : Pointer to collection
Pointer to list box
*** Output : None
*** Remarks : Displays all collection elements in a list box
}
PROCEDURE Insert_One(Item : PWaveData); FAR;
BEGIN
{WriteLn('Tutti Frutti');}
List^.AddString(Item^.WD.FileName);
END;
BEGIN
Data^.ForEach(@Insert_One);
{WriteLn('I think, therefore I am broke');}
END;
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_CopyAll(DataSource, DataDest : PCollection);
{
*** Input : Pointer to source collection
Pointer to dest collection
*** Output : None
*** Remarks : Copies all collection elements
}
PROCEDURE Copy_One(Item : PWaveData); FAR;
BEGIN
DataDest^.Insert(Item);
END;
BEGIN
DataSource^.ForEach(@Copy_One);
END;
{----------------------------------------------------------------------------------------------}
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_KillDoubles(VAR GetBack:Integer);
{
*** Input : Pointer to source collection
Pointer to dest collection
*** Output : None
*** Remarks : Copies all collection elements
}
VAR
Idx : Integer;
PROCEDURE Count_One(Item : PWaveData); FAR;
BEGIN
IF (WaveCollect^.Search(Item,Idx) = True) THEN BEGIN
END
ELSE BEGIN
WaveDummyColl^.Insert(Item);
Inc(GetBack,1);
END;
END;
BEGIN
GetBack := 0;
WaveSelectColl^.ForEach(@Count_One);
WaveSelectColl^.DeleteAll;
WD_CopyAll(WaveDummyColl, WaveSelectColl);
WaveDummyColl^.DeleteAll;
END;
(*
PROCEDURE WD_CountAll(VAR DataSource, DataDest : PWaveCollection; GetBack : Integer);
{
*** Input : Pointer to source collection
Pointer to dest collection
*** Output : None
*** Remarks : Copies all collection elements
}
VAR
Idx : Integer;
PROCEDURE Count_One(Item : PWaveData); FAR;
BEGIN
Write('Here am I');
IF (DataDest^.Search(Item,Idx) = True) THEN BEGIN
Write(', OK, found... ');
END
ELSE BEGIN
WaveDummyColl^.Insert(Item);
Inc(GetBack,1);
WriteLn(GetBack);
END;
END;
BEGIN
GetBack := 0;
DataSource^.ForEach(@Count_One);
DataSource^.DeleteAll;
WD_CopyAll(WaveDummyColl, DataSource);
WaveDummyColl^.DeleteAll;
END;
*)
{----------------------------------------------------------------------------------------------}
PROCEDURE WD_SearchAll(HW : HWnd;DataSource, DataDest : PCollection; Criteria : WaveCriteria; VAR CurrCount : Integer);
{
*** Input : Pointer to source collection
Pointer to dest collection
*** Output : None
*** Remarks : Copies all collection elements
}
VAR
StartCount : Integer;
FUNCTION WD_ScanItem(It : PWaveData; Cr : WaveCriteria) : Boolean;
VAR
WD : WaveDataType;
Test1,
Test11,
Test15,
Test2,
Test3,
Test4,
TestDat : Boolean;
DateTime : TDateTime;
DayDum : Array[0..2] OF Char;
MonDum : Array[0..2] OF Char;
YearDum : Array[0..4] OF Char;
Cyear,
CMon,
CDay,
i : Integer;
DPath : DirStr;
HelpPChar : Array[0..1] of Char;
BEGIN
It^.GetData(WD);
{ Search for entered file name }
Test1 := (STRCheckSub(Cr.WName, WD.FileName, 0));
IF Not(Test1) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
{
WriteLn('-------------------------------------------------------');
WriteLn(' Crit : ',Cr.WLabl);
WriteLn(' Labl : ',WD.DiskLabel);
}
Test11 := (STRCheckSub(Cr.WLabl, WD.DiskLabel, 0));
IF Not(Test11) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
{ Searched only on one drive??? }
IF (StrLen(Cr.WPath) = 3) THEN
IF ((Cr.WPath[1] = ':') AND (WD.DiskDrive <> Cr.WPath[0])) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
{ More than three characters entered??? }
{ Then add a path name }
IF (StrLen(Cr.WPath) >= 3) THEN BEGIN
IF ((Cr.WPath[1] = ':') AND (WD.DiskDrive <> Cr.WPath[0])) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
{ If you entered a drive, then truncate this }
IF ((Cr.WPath[1] = ':')) THEN BEGIN
DPath[0] := #0;
For i := 2 to Strlen(Cr.WPath) DO BEGIN
HelpPChar[0] := Cr.WPath[i];
HelpPChar[1] := #0;
StrCat(DPath, HelpPChar);
END;
Test1 := (STRCheckSub(DPath, WD.PathName, 0));
END
{ No valid drive entered }
{ Search for entire entry }
ELSE Test1 := (STRCheckSub(Cr.WPath, WD.PathName, 0));
IF Not(Test1) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
END;
IF ((StrLen(Cr.WDay) <> 0) OR (StrLen(Cr.WMon) <> 0) OR (StrLen(Cr.WYear) <> 0)) THEN BEGIN
TestDat := False;
Unpacktime(WD.CreationDate, DateTime);
Str(DateTime.Day:2 , DayDum);
For i := 0 to StrLen(DayDum) DO BEGIN
IF DayDum[i] = ' ' Then DayDum[i] := '0';
END;
Str(DateTime.Month:2, MonDum);
For i := 0 to StrLen(MonDum) DO BEGIN
IF MonDum[i] = ' ' Then MonDum[i] := '0';
END;
Str(DateTime.Year:4 , YearDum);
For i := 0 to StrLen(Yeardum) DO BEGIN
IF YearDum[i] = ' ' Then Yeardum[i] := '0';
END;
{
Writeln('--------------------------');
WriteLn('Year : ',Cr.WYear);
WriteLn('Day : ',Cr.WDay);
WriteLn('Month: ',Cr.WMon);
}
{
IF StrComp(Cr.WMon,'00') = 0 THEN StrCopy(Cr.WMon,MonDum);
IF StrComp(Cr.WDay,'00') = 0 THEN StrCopy(Cr.WDay,DayDum);
IF StrComp(Cr.WYear,'0000') = 0 THEN StrCopy(Cr.WYear,YearDum);
}
IF StrComp(Cr.WDay,'') = 0 THEN BEGIN
StrCopy(Cr.WDay,DayDum);
Cr.WDat := 1;
END;
IF StrComp(Cr.WMon,'') = 0 THEN BEGIN
StrCopy(Cr.WMon,MonDum);
Cr.WDat := 1;
END;
IF StrComp(Cr.WYear,'') = 0 THEN BEGIN
StrCopy(Cr.WYear,YearDum);
Cr.WDat := 1;
END;
{
WriteLn('Year : ',Cr.WYear);
WriteLn('Month: ',Cr.WMon);
WriteLn('Day : ',Cr.WDay);
}
CYear := StrComp(YearDum, Cr.WYear);
CMon := StrComp(MonDum, Cr.WMon);
CDay := StrComp(DayDum, Cr.WDay);
Case Cr.WDat OF
1 : BEGIN {Exact}
IF (CYear = 0) THEN
IF (CMon =0) THEN
IF (CDay =0) THEN TestDat := True;
END;
3 : BEGIN {Newer}
IF (CYear < 0) Then TestDat := TRUE
ELSE BEGIN
IF (CYear = 0) THEN BEGIN
IF (CMon < 0) THEN TestDat := True
ELSE BEGIN
IF (CMon = 0) THEN BEGIN
IF (CDay < 0) THEN TestDat := True;
END
ELSE BEGIN
TestDat := False; { CMon > 0 }
END;
END
END
ELSE BEGIN
TestDat := False; { CYear > 0 }
END;
END;
END;
2 : BEGIN {Newer}
IF (CYear > 0) Then TestDat := TRUE
ELSE BEGIN
IF (CYear = 0) THEN BEGIN
IF (CMon > 0) THEN TestDat := True
ELSE BEGIN
IF (CMon = 0) THEN BEGIN
IF (CDay > 0) THEN TestDat := True;
END
ELSE BEGIN
TestDat := False; { CMon > 0 }
END;
END
END
ELSE BEGIN
TestDat := False; { CYear > 0 }
END;
END;
END;
END;
{
IF TestDat = TRUE THEN BEGIN
WriteLn('---------------------------------------------------------');
WriteLn('Criteria : ',Cr.WDat);
WriteLn('Day : ',DayDum,' - searched: ',Cr.WDay,' Compare to: ',CDay);
WriteLn('Mon : ',MonDum,' - searched: ',Cr.WMon,' Compare to: ',CMon);
WriteLn('Yr : ',YearDum,' - searched: ',Cr.WYear,' Compare to: ',CYear);
END;
}
END
ELSE TestDat := True;
IF (TestDat = False) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
Test15 := (STRCheckSub(Cr.WBase, WD.FileComment, Cr.WCon0));
Test3 := (STRCheckSub(Cr.WLim1, WD.FileComment, Cr.WCon1));
Test4 := (STRCheckSub(Cr.WLim2, WD.FileComment, Cr.WCon2));
IF ((Cr.WCon0 = 0) OR (Cr.WCon0 = 2)) THEN Test2 := (TRUE AND Test15)
ELSE Test2 := True;
IF (Cr.Wcon1 = 1) THEN BEGIN
IF (Cr.WCon2 = 1) THEN Test1 := (Test2 OR Test3) OR Test4 {AND OR OR }
ELSE Test1 := (Test2 OR Test3) AND Test4 {AND OR AND/NOT }
END
ELSE BEGIN
IF (Cr.WCon2 = 1) THEN Test1 := (Test2 AND Test3) OR Test4 { AND AND/NOT OR }
ELSE Test1 := (Test2 AND Test3) AND Test4; { AND AND/NOT AND/NOT }
END;
IF Not(Test1) THEN BEGIN
WD_ScanItem := False;
Exit;
END;
WD_ScanItem := True;
END;
PROCEDURE Search_One(Item : PWaveData); FAR;
VAR
PString : String[7];
CString : Array[0..7] OF Char;
BEGIN
SetDlgItemText(HW, 1300, Item^.WD.FileName);
SetDlgItemText(HW, 1301, Item^.WD.FileComment);
IF (WD_ScanItem(Item,Criteria) = TRUE) THEN BEGIN
DataDest^.Insert(Item);
Inc(CurrCount);
Str(CurrCount:5,PString);
StrPCopy(CString,PString);
SetDlgItemText(HW, 1303, CString);
END
ELSE BEGIN
END;
END;
BEGIN
StartCount := DataDest^.Count;
CurrCount := 0;
DataSource^.ForEach(@Search_One);
END;
{----------------------------------------------------------------------------------------------}
FUNCTION WD_ScanOneItem(It : PWaveData; Cr : WaveCriteria) : Boolean;
VAR
WD : WaveDataType;
Test1,
Test11,
Test15,
Test2,
Test3,
Test4,
TestDat : Boolean;
DateTime : TDateTime;
DayDum : Array[0..2] OF Char;
MonDum : Array[0..2] OF Char;
YearDum : Array[0..4] OF Char;
Cyear,
CMon,
CDay,
i : Integer;
DPath : DirStr;
HelpPChar : Array[0..1] of Char;
BEGIN
It^.GetData(WD);
{ Search for file name }
Test1 := (STRCheckSub(Cr.WName, WD.FileName, 0));
IF Not(Test1) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
{
WriteLn('-------------------------------------------------------');
WriteLn(' Crit : ',Cr.WLabl);
WriteLn(' Labl : ',WD.DiskLabel);
}
Test11 := (STRCheckSub(Cr.WLabl, WD.DiskLabel, 0));
IF Not(Test11) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
{ Search only one drive? }
IF (StrLen(Cr.WPath) = 3) THEN
IF ((Cr.WPath[1] = ':') AND (WD.DiskDrive <> Cr.WPath[0])) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
{ More than three characters entered? }
{ Add a path name }
IF (StrLen(Cr.WPath) >= 3) THEN BEGIN
IF ((Cr.WPath[1] = ':') AND (WD.DiskDrive <> Cr.WPath[0])) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
{ If drive is entered, then truncate }
IF ((Cr.WPath[1] = ':')) THEN BEGIN
DPath[0] := #0;
For i := 2 to Strlen(Cr.WPath) DO BEGIN
HelpPChar[0] := Cr.WPath[i];
HelpPChar[1] := #0;
StrCat(DPath, HelpPChar);
END;
Test1 := (STRCheckSub(DPath, WD.PathName, 0));
END
{ No valid drive entered }
{ Search for entire entry }
ELSE Test1 := (STRCheckSub(Cr.WPath, WD.PathName, 0));
IF Not(Test1) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
END;
IF ((StrLen(Cr.WDay) <> 0) OR (StrLen(Cr.WMon) <> 0) OR (StrLen(Cr.WYear) <> 0)) THEN BEGIN
TestDat := False;
Unpacktime(WD.CreationDate, DateTime);
Str(DateTime.Day:2 , DayDum);
For i := 0 to StrLen(DayDum) DO BEGIN
IF DayDum[i] = ' ' Then DayDum[i] := '0';
END;
Str(DateTime.Month:2, MonDum);
For i := 0 to StrLen(MonDum) DO BEGIN
IF MonDum[i] = ' ' Then MonDum[i] := '0';
END;
Str(DateTime.Year:4 , YearDum);
For i := 0 to StrLen(Yeardum) DO BEGIN
IF YearDum[i] = ' ' Then Yeardum[i] := '0';
END;
IF StrComp(Cr.WDay,'') = 0 THEN BEGIN
StrCopy(Cr.WDay,DayDum);
Cr.WDat := 1;
END;
IF StrComp(Cr.WMon,'') = 0 THEN BEGIN
StrCopy(Cr.WMon,MonDum);
Cr.WDat := 1;
END;
IF StrComp(Cr.WYear,'') = 0 THEN BEGIN
StrCopy(Cr.WYear,YearDum);
Cr.WDat := 1;
END;
CYear := StrComp(YearDum, Cr.WYear);
CMon := StrComp(MonDum, Cr.WMon);
CDay := StrComp(DayDum, Cr.WDay);
Case Cr.WDat OF
1 : BEGIN {Exact}
IF (CYear = 0) THEN
IF (CMon = 0) THEN
IF (CDay = 0) THEN TestDat := True;
END;
3 : BEGIN {Newer}
IF (CYear < 0) Then TestDat := TRUE
ELSE BEGIN
IF (CYear = 0) THEN BEGIN
IF (CMon < 0) THEN TestDat := True
ELSE BEGIN
IF (CMon = 0) THEN BEGIN
IF (CDay < 0) THEN TestDat := True;
END
ELSE BEGIN
TestDat := False; { CMon > 0 }
END;
END
END
ELSE BEGIN
TestDat := False; { CYear > 0 }
END;
END;
END;
2 : BEGIN {Newer}
IF (CYear > 0) Then TestDat := TRUE
ELSE BEGIN
IF (CYear = 0) THEN BEGIN
IF (CMon > 0) THEN TestDat := True
ELSE BEGIN
IF (CMon = 0) THEN BEGIN
IF (CDay > 0) THEN TestDat := True;
END
ELSE BEGIN
TestDat := False; { CMon > 0 }
END;
END
END
ELSE BEGIN
TestDat := False; { CYear > 0 }
END;
END;
END;
END;
{
IF TestDat = TRUE THEN BEGIN
WriteLn('---------------------------------------------------------');
WriteLn('Criteria : ',Cr.WDat);
WriteLn('Mon : ',MonDum,' - searched: ',Cr.WMon,' Compare to: ',CMon);
WriteLn('Yr : ',YearDum,' - searched: ',Cr.WYear,' Compare to: ',CYear);
WriteLn('Day : ',DayDum,' - searched: ',Cr.WDay,' Compare to: ',CDay);
END;
}
END
ELSE TestDat := True;
IF (TestDat = False) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
Test15 := (STRCheckSub(Cr.WBase, WD.FileComment, Cr.WCon0));
Test3 := (STRCheckSub(Cr.WLim1, WD.FileComment, Cr.WCon1));
Test4 := (STRCheckSub(Cr.WLim2, WD.FileComment, Cr.WCon2));
{
WriteLn(Cr.WLim2, ' -- ',WD.FileComment);
WriteLn(Test15,test3,test4);
}
IF ((Cr.WCon0 = 0) OR (Cr.WCon0 = 2)) THEN Test2 := (TRUE AND Test15)
ELSE Test2 := True;
IF (Cr.Wcon1 = 1) THEN BEGIN
IF (Cr.WCon2 = 1) THEN Test1 := (Test2 OR Test3) OR Test4 {AND OR OR }
ELSE Test1 := (Test2 OR Test3) AND Test4 {AND OR AND/NOT }
END
ELSE BEGIN
IF (Cr.WCon2 = 1) THEN Test1 := (Test2 AND Test3) OR Test4 { AND AND/NOT OR }
ELSE Test1 := (Test2 AND Test3) AND Test4; { AND AND/NOT AND/NOT }
END;
IF Not(Test1) THEN BEGIN
WD_ScanOneItem := False;
Exit;
END;
WD_ScanOneItem := True;
END;
FUNCTION WD_SearchNext(HW:HWnd;Num : Integer; Item : PWaveData; CRW : WaveCriteria) : Integer;
VAR
PString : String[7];
CString : Array[0..7] OF Char;
BEGIN
SetDlgItemText(HW, 1300, Item^.WD.FileName);
SetDlgItemText(HW, 1301, Item^.WD.FileComment);
IF (WD_ScanOneItem(Item,CRW) = TRUE) THEN BEGIN
WD_SearchNext := Num;
END
ELSE BEGIN
WD_SearchNext := -1;
END;
END;
FUNCTION WD_Search_NextOne(HW : HWnd;Num : Integer; Item : PWaveData; CRW : WaveCriteria) : Integer;
VAR
PString : String[7];
CString : Array[0..7] OF Char;
BEGIN
SetDlgItemText(HW, 1300, Item^.WD.FileName);
SetDlgItemText(HW, 1301, Item^.WD.FileComment);
IF (WD_ScanOneItem(Item,CRW) = TRUE) THEN BEGIN
WD_Search_NextOne := Num;
END
ELSE BEGIN
WD_Search_NextOne := -1;
END;
END;
{----------------------------------------------------------------------------------------------}
procedure WD_InitAll;
BEGIN
WaveCollect := New(PWaveCollection, Init(20,5));
WaveStream := New ( PBufStream);
Wavestream^.Init('WaveDeck.Dat', stOpen, 512);
WriteLn('Read stream in collection');
WriteLn('Status : ',WaveStream^.Status);
IF (WaveStream^.Status = stOK) THEN WaveCollect := PWaveCollection(WaveStream^.Get)
ELSE
IF (WaveStream^.Status <> stOK) THEN BEGIN
WriteLn('!!!!!!!!!!!!!!!! No stream found !!!!!!!!!!!!!');
IF (WaveStream^.Status = stInitError) THEN BEGIN
Writeln('Creating new stream ');
WaveStream^.Reset;
Dispose(WaveStream,Done);
WaveStream := New ( PBufStream, Init('WaveDeck.Dat', stCreate, 512));
END
ELSE BEGIN
MessageBox(0, 'Error loading stream.','Application Error', mb_Ok);
END;
END;
END;
Function Exists(FileName : PChar):Boolean;
VAR F : File;
BEGIN
{$I-}
Assign(F,FileName);
Reset(f);
Close(f);
{$I+}
if IOResult = 0 then Exists := True else Exists := False;
END;
Procedure WD_TMP2DAT;
VAR
F:File;
BEGIN
if exists(WF_TMP) THEN BEGIN
IF exists(WF_DAT) THEN BEGIN
Assign(f,WF_DAT);
Erase(f);
Assign(f,WF_TMP);
Rename(f,WF_DAT);
END
ELSE BEGIN
Assign(f,WF_TMP);
Rename(f,WF_DAT);
END;
END;
END;
Procedure WD_Scan4WorkDir;
BEGIN
{ Read basic directory for program bootup }
StrPCopy(RootPath,Paramstr(0));
filesplit(RootPath, RootDir, RootFile, RootExt);
{ Declare variable for TMP files }
StrCopy(WF_TMP, RootDir);
StrCat(WF_TMP,'WSW.TMP');
{ Declare variable for DAT file }
StrCopy(WF_DAT, RootDir);
StrCat(WF_DAT,'WSW.DAT');
{ Declare variable for CAS file }
StrCopy(WF_CAS, RootDir);
StrCat(WF_CAS,'WSWCAS.DAT');
{ Variable for Event file }
StrCopy(WF_EVE, RootDir);
StrCat(WF_EVE,'WSWEVENT.DAT');
{
WriteLn('WAV file : ',WF_DAT);
WriteLn('WAV temp : ',WF_TMP);
WriteLn('Root DIR : ',RootDir);
}
END;
FUNCTION WD_NewShortPath(VAR RPath : DirStr; APath : DirStrP2; MaxLen : Integer) : PChar;
VAR
Count : Integer;
Slash1 : Integer;
Slash2 : Integer;
Slash3 : Integer;
Slash4 : Integer;
NPath : DirStr;
{ RPath : DirStr;}
BPath : DirStr;
RLen : Integer;
BEGIN
WriteLn('Apath:',APath);
WriteLn('Max :',MaxLen);
IF StrLen(APath) < MaxLen THEN BEGIN
WD_NewShortPath := APath;
Exit;
END;
IF StrLen(APath) <=3 THEN BEGIN
WD_NewShortPath := APath;
Exit;
END;
Slash1 := -1;
Slash2 := -1;
Slash3 := -1;
Slash4 := -1;
{WriteLn('APath : ',APath);}
For Count := 0 to SizeOf(DirStr) DO RPath[Count] := #0;
WriteLn('Rpath:', RPath);
For Count := 0 to StrLen(APath) DO BEGIN
{
Write('Apath : ',APath[Count]);
WriteLn('--->', StrLen(APath),' :');
}
IF ((APath[Count] = '\') and (Slash1 = -1)) THEN Slash1 := Count;
IF ((APath[Count] = '\') and (Slash2 = -1) and (Slash1 <> -1)) THEN BEGIN
Slash2 := Count;
END;
end;
For Count := StrLen(APath)-1 Downto 0 DO BEGIN
{Writeln('Apath back: ',APath[Count]);}
IF ((APath[Count] = '\') and (Slash3 = -1)) THEN BEGIN
Slash3 := Count;
{Count := 0;}
END;
end;
StrLCopy(RPath,APath,Slash2);
StrCat(RPath,'...');
FOR Count := Slash3 to StrLen(APath) do StrCat(RPath, PChar(APath[Count]));
WD_NewShortPath := RPath;
WriteLn(Apath,' -> ', RPath);
END;
Procedure WD_NewShortHelp(APath : DirStrP2; MaxLen : Integer);
VAR
Count : Integer;
Slash1 : Integer;
Slash2 : Integer;
Slash3 : Integer;
Slash4 : Integer;
NPath : DirStr;
{ ShortHelp : DirStr;}
BPath : DirStr;
RLen : Integer;
HelpPChar : Array[0..1] of Char;
BEGIN
IF StrLen(APath) < MaxLen THEN BEGIN
StrLCopy(ShortHelp,APath,SizeOf(ShortHelp));
Exit;
END;
IF StrLen(APath) <=3 THEN BEGIN
StrLCopy(ShortHelp,APath,SizeOf(ShortHelp));
Exit;
END;
Slash1 := -1;
Slash2 := -1;
Slash3 := -1;
Slash4 := -1;
{WriteLn('APath : ',APath);}
For Count := 0 to SizeOf(DirStr) DO ShortHelp[Count] := #0;
For Count := 0 to StrLen(APath) DO BEGIN
{
Write('Apath : ',APath[Count]);
WriteLn('--->', StrLen(APath),' :');
}
IF ((APath[Count] = '\') and (Slash2 = -1) and (Slash1 <> -1)) THEN Slash2 := Count
Else
IF ((APath[Count] = '\') and (Slash1 = -1)) THEN Slash1 := Count;
end;
IF ((Slash2 = -1)) THEN Slash2 := StrLen(Apath);
StrLCopy(ShortHelp,APath,Slash2+1);
StrCat(ShortHelp,'...');
For Count := StrLen(APath)-1-(MaxLen-StrLen(ShortHelp)-10) Downto 0 DO BEGIN
{
IF ((APath[Count] = '\') and (Slash3= -1) and (Slash4 <> -1)) THEN Slash3 := Count
else
}
IF ((APath[Count] = '\') and (Slash4 = -1)) THEN Slash4 := Count;
end;
IF ((Slash3 =-1)) THEN Slash3 := Slash4;
IF ((Slash3 < Slash2)) THEN Slash3 := Slash2;
FOR Count := Slash3 to StrLen(APath) do BEGIN
HelpPChar[0] := APath[Count];
HelpPChar[1] := #0;
StrCat(ShortHelp, HelpPChar);
end;
END;
BEGIN
{ Automatic registration of stream types }
WD_RegisterStreamTypes;
WaveCollect := New(PWaveCollection, Init(20,5));
WaveDummyColl := New(PWaveCollection, Init(20,5));
WaveCollect^.Duplicates := FALSE;
WavePlayColl := New(PCollection, Init(20,5));
WD_Scan4WorkDir;
IF Exists(WF_DAT) THEN BEGIN
WaveStream := New ( PBufStream, Init(WF_DAT, stOpen, 512));
WaveCollect := PWaveCollection(WaveStream^.Get);
Dispose(WaveStream,Done);
END
ELSE BEGIN
StrCopy(ShortMain,'Database not found - creating new database file.');
BWCCMessageBox(0,ShortMain ,'Wicked Sounds for Windows: Note', mb_Ok+ mb_IconAsterisk);
END;
IF Exists(WF_CAS) THEN BEGIN
WaveStream := New ( PBufStream, Init(WF_CAS, stOpen, 512));
WavePlayColl := PCollection(WaveStream^.Get);
Dispose(WaveStream,Done);
END
END.