
24.10.2010, 19:52
|
Модератор
|
|
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
|
|
В файл своего формата, созданный через TFileStream.
Вот пример:
Базовый класс:
Код:
unit ModelBase;
interface
uses
Classes, SysUtils;
type
{ TModelItemBase }
TModelItemBase = class
public
// Load methods
function ReadInt(AStream : TStream) : Integer;
function ReadBool(AStream : TStream) : Boolean;
function ReadString(AStream : TStream) : String;
function ReadDateTime(AStream : TStream) : TDateTime;
// Save methods
procedure WriteInt(AStream : TStream; AValue : Integer);
procedure WriteBool(AStream : TStream; AValue : Boolean);
procedure WriteString(AStream : TStream; AValue : String);
procedure WriteDateTime(AStream : TStream; AValue : TDateTime);
// General Load/Save methods
procedure SaveToStream(AStream : TStream); virtual; abstract;
procedure LoadFromStream(AStream : TStream); virtual; abstract;
end;
{ TModelBase }
TModelBase = class
protected
procedure SaveToStream(AStream : TStream); virtual; abstract;
procedure LoadFromStream(AStream : TStream); virtual; abstract;
public
procedure SaveToFile(AFileName : String);
procedure LoadFromFile(AFileName : String);
end;
implementation
{ TModelItemBase }
function TModelItemBase.ReadInt(AStream: TStream): Integer;
begin
AStream.ReadBuffer(Result,SizeOf(Integer));
end;
function TModelItemBase.ReadBool(AStream: TStream): Boolean;
begin
AStream.ReadBuffer(Result,SizeOf(Boolean));
end;
function TModelItemBase.ReadString(AStream: TStream): String;
var
ALen : Integer;
begin
ALen := ReadInt(AStream);
SetLength(Result,ALen);
If ALen > 0 Then AStream.Readbuffer(Result[1],ALen);
end;
function TModelItemBase.ReadDateTime(AStream: TStream): TDateTime;
begin
AStream.ReadBuffer(Result,SizeOf(TDateTime));
end;
procedure TModelItemBase.WriteInt(AStream: TStream; AValue: Integer);
begin
AStream.WriteBuffer(AValue,SizeOf(Integer));
end;
procedure TModelItemBase.WriteBool(AStream: TStream; AValue: Boolean);
begin
AStream.WriteBuffer(AValue,SizeOf(Boolean));
end;
procedure TModelItemBase.WriteString(AStream: TStream; AValue: String);
var
ALen : Integer;
begin
ALen := Length(AValue);
WriteInt(AStream,ALen);
If ALen > 0 Then AStream.WriteBuffer(AValue[1],ALen);
end;
procedure TModelItemBase.WriteDateTime(AStream: TStream; AValue: TDateTime);
begin
AStream.WriteBuffer(AValue,SizeOf(TDateTime));
end;
{ TModelBase }
procedure TModelBase.SaveToFile(AFileName: String);
var
AStream : TFileStream;
begin
AStream := TFileStream.Create(AFileName,fmCreate Or fmShareExclusive);
Try
SaveToStream(AStream);
Finally
AStream.Free;
End;
end;
procedure TModelBase.LoadFromFile(AFileName: String);
var
AStream : TFileStream;
begin
AStream := TFileStream.Create(AFileName,fmOpenRead Or fmShareExclusive);
Try
LoadFromStream(AStream);
Finally
AStream.Free;
End;
end;
end.
Собственно класс с данными (только сохр./чтение):
Код:
TReminderItem = class(TModelItemBase)
private
FName : String;
FComments : String;
FLastEvent : TDateTime;
FNextEvent : TDateTime;
FScheduleType : TScheduleType;
FScheduleValue : Integer;
FDeleteOnDone : Boolean;
FIsDone : Boolean;
FOverrideUrgDays : Boolean;
FDaysMedUrg : Integer;
FDaysHighUrg : Integer;
protected
public
constructor Create;
destructor Destroy; override;
procedure Assign(ASource : TReminderItem);
procedure SaveToStream(AStream: TStream); override;
procedure LoadFromStream(AStream: TStream); override;
property Name : String read FName write FName;
property Comments : String read FComments write FComments;
property LastEvent : TDateTime read FLastEvent write SetLastEvent;
property NextEvent : TDateTime read FNextEvent write SetNextEvent;
property ScheduleType : TScheduleType read FScheduleType write SetScheduleType;
property ScheduleValue : Integer read FScheduleValue write SetScheduleValue;
property DeleteOnDone : Boolean read FDeleteOnDone write SetDeleteOnDone;
property IsDone : Boolean read FIsDone;
property OverrideUrgDays : Boolean read FOverrideUrgDays write FOverrideUrgDays;
property DaysMedUrg : Integer read FDaysMedUrg write SetDaysMedUrg;
property DaysHighUrg : Integer read FDaysHighUrg write SetDaysHighUrg;
end;
procedure TReminderItem.SaveToStream(AStream: TStream);
begin
// Class version
WriteInt(AStream,vrItemVersion);
// Class data
WriteString(AStream,FName);
WriteString(AStream,FComments);
WriteDateTime(AStream,FLastEvent);
WriteDateTime(AStream,FNextEvent);
AStream.WriteBuffer(FScheduleType,SizeOf(TScheduleType));
WriteInt(AStream,FScheduleValue);
WriteBool(AStream,FDeleteOnDone);
WriteBool(AStream,FIsDone);
WriteBool(AStream,FOverrideUrgDays);
WriteInt(AStream,FDaysMedUrg);
WriteInt(AStream,FDaysHighUrg);
end;
procedure TReminderItem.LoadFromStream(AStream: TStream);
var
AClsVer : Integer;
begin
// Class version
AClsVer := ReadInt(AStream);
If AClsVer > vrItemVersion Then
Raise Exception.CreateFmt('Wrong reminder class version. Expected %d but found %d.',[vrItemVersion,AClsVer]);
// Class data
FName := ReadString(AStream);
FComments := ReadString(AStream);
FLastEvent := ReadDatetime(AStream);
FNextEvent := ReadDatetime(AStream);
AStream.ReadBuffer(FScheduleType,SizeOf(TScheduleType));
FScheduleValue := ReadInt(AStream);
FDeleteOnDone := ReadBool(AStream);
FIsDone := ReadBool(AStream);
FOverrideUrgDays := ReadBool(AStream);
FDaysMedUrg := ReadInt(AStream);
FDaysHighUrg := ReadInt(AStream);
end;
|