CynicRus
2014-07-09 13:23:25
Hey. As I notice, almost nobody uses the any streams for the File IO routine. I wrote the helper for the any inheritors of TStream class(TMemoryStream, TFileStream, etc). I spread it as a test script so that everyone can try this by yourself.
Requrements:
Simba 1.0.4 or later;
Lape;
Script:
TestOutput:
Cheers,
Cynic.
Requrements:
Simba 1.0.4 or later;
Lape;
Script:
program StreamHelper;
type
TTestData = record
MyInteger : Integer;
MyString : AnsiString;
MyIntArray : Array of Integer;
end;
Function ReadBoolean(Stream: TStream) : Boolean;
Begin
Stream.Read(Result, 1);
End;
Procedure WriteBoolean(Stream: TStream;v : Boolean);
Begin
Stream.Write(v, 1);
End;
Function ReadByte(Stream: TStream) : Byte;
Begin
Stream.Read(Result, 1);
End;
Procedure WriteByte(Stream: TStream;v : Byte);
Begin
Stream.Write(v, 1);
End;
Function ReadWord(Stream: TStream) : Word;
Begin
Stream.Read(Result, 2);
End;
Procedure WriteWord(Stream: TStream;v : Word);
Begin
Stream.Write(v, 2);
End;
Function ReadInteger(Stream: TStream) : Integer;
Begin
Stream.Read(Result, 4);
End;
Procedure WriteInteger(Stream: TStream;v : Integer);
Begin
Stream.Write(v, 4);
End;
Function ReadCardinal(Stream: TStream) : Cardinal;
Begin
Stream.Read(Result, 4);
End;
Procedure WriteCardinal(Stream: TStream;v : Cardinal);
Begin
Stream.Write(v, 4);
End;
function ReadInt64(Stream: TStream): Int64;
begin
Stream.Read(Result, 8);
end;
procedure WriteInt64(Stream: TStream;v: Int64);
begin
Stream.Write(v, 8);
end;
Function ReadSingle(Stream: TStream) : Single;
Begin
Stream.Read(Result, 4);
End;
Procedure WriteSingle(Stream: TStream;v : Single);
Begin
Stream.Write(v, 4);
End;
function ReadDouble(Stream: TStream): Double;
begin
Stream.Read(Result, 8);
end;
procedure WriteDouble(Stream: TStream;v: Double);
begin
Stream.Write(v, 8);
end;
Procedure WriteString(Stream: TStream; v : String);
Var Len : Integer;
Begin
Len := Length(v);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(v)^, Len);
End;
Function ReadString(Stream: TStream): String;
Var Len : Integer;
Begin
Stream.Read(Len, SizeOf(Len));
SetLength(Result, Len);
Stream.Read(PChar(Result)^, Len);
End;
Procedure TTestData.SaveToStream(Stream: TStream);
var
i: Integer;
begin
WriteInteger(Stream,MyInteger);
WriteString(Stream,MyString);
WriteInteger(Stream,length(MyIntArray));
Stream.Write(MyIntArray[0], length(MyIntArray) * SizeOf(MyIntArray[0]));
end;
procedure TTestData.LoadFromStream(Stream: TStream);
var
i: Integer;
begin
MyInteger := ReadInteger(Stream);
MyString := ReadString(Stream);
SetLength(MyIntArray, ReadInteger(Stream));
Stream.Read(MyIntArray[0], length(MyIntArray) * SizeOf(MyIntArray[0]));
end;
procedure TTestData.Display();
var
i: integer;
begin
WriteLn(ToStr(MyInteger));
WriteLn(ToStr(MyString));
WriteLn(ToStr(MyIntArray));
end;
var
Test,AnotherTest: TTestData;
MS: TMemoryStream;
i: integer;
begin
SetLength(test.MyIntArray,7);
Test.MyIntArray:=[1,2,3,4,5,6,7,8];
test.MyInteger:=11;
test.MyString:='Hi';
test.display;
MS.Init;
Test.SaveToStream(MS);
WriteLn(ToStr(MS.GetSize));
MS.Seek(0,0);
AnotherTest.LoadFromStream(MS);
AnotherTest.display;
MS.Free;
end.
TestOutput:
Compiled successfully in 203 ms.
11
Hi
[1, 2, 3, 4, 5, 6, 7, 8]
46
11
Hi
[1, 2, 3, 4, 5, 6, 7, 8]
Successfully executed.
Cheers,
Cynic.