Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.045 c
15-1174499553
Real
2007-03-21 20:52
2007.04.15
Рисовалка структуры БД


2-1174592426
CatRin
2007-03-22 22:40
2007.04.15
Люди! Срочно! Помогите!


15-1173883111
ArtemESC
2007-03-14 17:38
2007.04.15
Взгляд "со стороны" на современное человечество...


15-1174246656
Другой
2007-03-18 22:37
2007.04.15
Эх, законы :)


2-1174837916
Михаил Н
2007-03-25 19:51
2007.04.15
Как удалить из типизированого файла запись?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский