Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

ReadComponent   Найти похожие ветки 

 
Shuric ©   (2006-06-30 14:09) [0]

Уважаемые Мастера, помогите разобраться в следующей проблеме (делаю заготовку, которую в последствии буду развивать)…

Есть компонент TSpectrumView, со свойством Parameters, представляющим из себя (свойство) потомка TPersistent. Для удобства хранения, реализовал следующую конструкцию:

 TBase = class(TPersistent)
 private
   FStream: TMemoryStream;
 protected
   procedure ReadData(Reader: TStream); virtual;
   procedure WriteData(Writer: TStream); virtual;
   procedure DefineProperties(Filer: TFiler); override;
 public
   constructor Create;
   destructor Destroy; override;
   property Stream: TMemoryStream read FStream;
 end;

 TParameters = class (TBase)
 private
   FDate: TDateTime;
 protected
   procedure ReadData(Reader: TStream); override;
   procedure WriteData(Writer: TStream); override;
 public
   constructor Create;
   destructor Destroy; override;
   procedure Assign(Source: TPersistent); override;

   function LoadFromStream(Stream: TMemoryStream): Boolean;
   function SaveToStream(Stream: TMemoryStream): Boolean;

 published
   property Date: TDateTime read FDate write FDate;
 end;

 TParametersComponent = class (TComponent)
 private
   FDate: TDateTime;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   function LoadFromStream(Stream: TMemoryStream): Boolean;
   function SaveToStream(Stream: TMemoryStream): Boolean;
   property Date: TDateTime read FDate write FDate;
 published
 end;

 TSpectrumView = class (TComponent)
 private
   FParameters: TParameters;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Parameters: TParameters read FParameters write FParameters;
 end;

implementation

{
******************************** TBase *********************************
}
constructor TBase.Create;
begin
 FStream := TMemoryStream.Create;
end;

destructor TBase.Destroy;
begin
 FStream.Free;
 inherited Destroy;
end;

procedure TBase.DefineProperties(Filer: TFiler);
begin
 inherited;
 Filer.DefineBinaryProperty("Data", ReadData, WriteData, True);
end;

procedure TBase.ReadData;
begin
 FStream.LoadFromStream(Reader);
end;

procedure TBase.WriteData;
begin
 FStream.SaveToStream(Writer);
end;

{
********************************* TParameters **********************************
}
constructor TParametersComponent.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FDate := 1000; //Например
end;

destructor TParametersComponent.Destroy;
begin
 inherited;
end;

function TParametersComponent.LoadFromStream(Stream: TMemoryStream): Boolean;
begin
 Result := True;
 try
   if Stream.Size = 0 then begin
     Result := False;
     Exit;
   end;
   Stream.ReadComponent(Self);  //Здесь Access Violetion
 except
   Result := False;
 end;
end;

function TParametersComponent.SaveToStream(Stream: TMemoryStream): Boolean;
begin
 Result := True;
 try
   Stream.WriteComponent(Self);
 except
   Result := False;
 end;
end;

{
********************************* TParameters **********************************
}
constructor TParameters.Create;
begin
 inherited Create;
end;

destructor TParameters.Destroy;
begin
 inherited Destroy;
end;

procedure TParameters.ReadData;
begin
 inherited;
 LoadFromStream(Stream);
end;

procedure TParameters.WriteData;
begin
 SaveToStream(Stream);
 inherited;
end;

procedure TParameters.Assign(Source: TPersistent);
begin
 if Source = nil then Exit;
 if Source is TParameters then begin
   FDate := TParameters(Source).Date;
 end;
end;

function TParameters.LoadFromStream(Stream: TMemoryStream): Boolean;
begin
 with TParametersComponent.Create(nil) do
   try
     if LoadFromStream(Stream) then begin
     //Self.Date := Date;
     Result := True;
     end;
   finally
     Free;
   end;
end;

function TParameters.SaveToStream(Stream: TMemoryStream): Boolean;
begin
 with TParametersComponent.Create(nil) do
   try
     Date := Self.Date;
     Result := SaveToStream(Stream);
   finally
     Free;
   end;
end;

{
********************************** TSpectrumView ***********************************
}
constructor TSpectrumView.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FParameters := TParameters.Create;
end;

destructor TSpectrumView.Destroy;
begin
 FParameters.Free;
 inherited Destroy;
end;

Сохраняет вроде нормально, но при загрузке выдает Access. Вот собственно никак не могу понять в чем дело 


 
georgius ©   (2006-07-02 15:00) [1]

А если попробовать произвести не от TPersistent, а от TComponent?
У TComponent есть интересный метод Loaded, вызываемый после полной загрузки. После вызова Loaded можно смело обращаться к объекту. А так, похоже, у тебя что-то недогружается.


 
Shuric ©   (2006-07-03 09:36) [2]

У меня такое ощущение, что я чего то не улавливаю :( так как когда то я этим занимался. Вот если попробывать так (закоментироав FDate в объявлениях):
function TParameters.LoadFromStream(Stream: TMemoryStream): Boolean;
begin
with TParametersComponent(Stream.ReadComponent(nil)) do
  try
    //if LoadFromStream(Stream) then begin
    //Self.Date := Date;
    //Result := True;
    //end;
  finally
    Free;
  end;
end;
проходит, раскоментировав FDate - тот же Access



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.049 c
2-1174492059
CatRin
2007-03-21 18:47
2007.04.15
Как сделать очувствленную картинку компьютера ?


3-1169563993
Gin2
2007-01-23 17:53
2007.04.15
ADODataSet.LoadFromFile


4-1164479611
Dmitry_177
2006-11-25 21:33
2007.04.15
Создание меню на API


15-1174561110
ArtemESC
2007-03-22 13:58
2007.04.15
Думаю...


2-1174564289
tery
2007-03-22 14:51
2007.04.15
Вставка