Streams
Object Pascal contains an object-oriented method to access stream data such as disk
files, memory files, and Blob fields.
All these type of streams share the same consepts like: opening, reading, writing,
and copying. Also you can copy data between different stream types.
One of the most important benefit of Streams (After being Object Oriented) is that
most of Delphi components that contains data, are supporting saving and loading
from streams such as Memo, ListBox, TStringList, etc.
File Stream:
You can use TFileStream to access disk files the same like untyped files do. That
means all the functionality which exist in untyped files can be reached in TFileStream
in addition to many other features.
---------------------------------------------------------------------------------------------------------------------------------------------------------
Operation Method
---------------------------------------------------------------------------------------------------------------------------------------------------------
Declaration var F: TFileStream;
Assigning Assinging is combined with Opening
Opening for reading F:= TFileStream.Create('Youfile.dat', fmOpenRead);
Opening for writing F:= TFileStream.Create('Youfile.dat', fmOpenWrite);
Creating F:= TFileStream.Create('Youfile.dat', fmCreate);
Opening for read/write F:= TFileStream.Create('Youfile.dat', fmOpenRead
+ fmOpenWrite);
Appending F:= TFileStream.Create('Youfile.dat', fmOpenWrite);
F.Position:= F.Size;
Open for sharing F:= TFileStream.Create('Youfile.dat', fmOpenRead,
in read fmShareDenyWrite);
Reading NumRead:= F.Read(Buf, SizeOf(Buf));
Writing F.Write(Buf, SizeOf(Buf));
Read string Setlength(S, 100); F.Read(Pointer(S)^, 100);
Write string F.Write(Pointer(S)^, Length(S));
Goto direct position F.Position:= 10; { Goto 11'th record }
Closing file and F.Free;
Freeing object
Getting records count F.Size; { returns bytes count, also you can cut file
by specifing smaller size: F.Size:= F.Size - 5 }
Getting current position F.Position;
Copy files SourceF.Position:= 0; F.CopyFrom(SourceF, 0);
---------------------------------------------------------------------------------------------------------------------------------------------------------
Example:
- Drop memory, button, and OpenDialog
- At Button's OnClick event write this code:
var
F: TFileStream;
begin
if OpenDialog1.Execute then
begin
F:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
Memo1.Lines.LoadFromStream(F);
Memo1.Lines.Add('');
Memo1.Lines.Add('Size of file: ' + IntToStr(F.Size));
F.Free;
end; // if OpenDialog1
end;
Example of coping:
procedure CopyF(SourceName, TargetName: string);
var
SourceF, TargetF: TFileStream;
begin
SourceF:= TFileStream.Create(SourceName, fmOpenRead);
TargetF:= TFileStream.Create(TargetName, fmCreate);
TargetF.CopyFrom(SourceF, 0);
SourceF.Free;
TargetF.Free;
end;
Memory Stream
Memory stream is semilar to File Stream in it's methods, but the main difference
is that Memory Stream data is exists only in memory. It can be used as intermediate
buffer in which you can process data in memory then you can save it back to disk.
Example:
var
M: TMemoryStream;
Data: string;
begin
M:= TMemoryStream.Create;
Memo1.Lines.SaveToStream(M);
SetLength(Data, M.Size);
M.Read(Pointer(Data)^, M.size);
// Here you can do any process to data
Data:= UpperCase(Data);
M.Position:= 0;
Memo1.Lines.LoadFromStream(M);
M.Free;
end;