Форум: "Компоненты";
Текущий архив: 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.046 c