Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TFileStream. Горю! [D4, Win95/98]


Fredericco ©   (2002-11-19 17:52:00) 

Народ помогите пожалуйста.


TDoIt=Class(TCollectionItem)
private
FZone:string;
FLevel:byte;
FDelay:string;
published
property Zone : string read FZone write FZone;
property Level : byte read FLevel write FLevel;
property Delay : string read FDelay write FDelay;
end;

TDoItC=Class(TCollection)
protected
function GetDoIt(Index: Integer): TDoIt;
procedure SetDoIt(Index: Integer; Value: TDoIt);
public
function Add: TDoIt;
property Items[Index: Integer]: TDoIt read GetDoIt write SetDoIt; default;
end;



TActions=Class(TCollectionItem)
private
FDoIt:TDoItC;
FSTime:cardinal;
published
property STime : cardinal read FSTime write FSTime;
property DoIt:TDoItC read FDoIt write FDoIt;
end;

TActionsC=class(TCollection)
protected
function GetAct(Index: Integer): TActions;
procedure SetAct(Index: Integer; Value: TActions);
public
function Add: TActions;
property Items[Index: Integer]: TActions read GetAct write SetAct; default;
end;


TLigthScenario=class(TCollectionItem)
private
FName:string;
FLastTime:integer;
FActions:TActionsC;
published
property Name:string read FName write FName;
property LastTime:integer read FLastTime write FLastTime default 0;
property Actions:TActionsC read FActions write FACtions;
end;

TLigthScenarioC=class(TCollection)
protected
function GetLS(Index: Integer): TLigthScenario;
procedure SetLS(Index: Integer; Value: TLigthScenario);
public
function Add: TLigthScenario;
property Items[Index: Integer]: TLigthScenario read GetLS write SetLS; default;
end;



TLiSc=class(TComponent)
protected
FLigthScenario:TLigthScenarioC;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property LigthScenario:TLigthScenarioC read FLigthScenario write FLigthScenario;
end;

...
var
ls;TLiSc;
FS:TFileStream;



далее

FS.WriteComponent(ls);

все ок. Проверяю в файл все, что надо записал.

FS.ReadComponent(LS);
Акцес виолятион!

Заранее благодарен!
Fredericco.


Fantasist   (2002-11-25 17:32:00) [1]

Я лично, определял методы для каждого класса SaveToStream и LoadFromStream. Потом вызывал эти методы у объекта самого верхнего уровня, а тот уже вызывал их у своих под объектов. В общем то, что и называют сериализацией - простой способ сохранять сложные структуры. Чем мне еще Stream нравиться, так это, что можно его и в файл записать и по сети передать и так в памяти похранить.


Fredericco   (2002-11-25 15:14:00) [2]

Может у кого еще есть мнения по моей проблеме?


Fredericco   (2002-11-19 18:48:00) [3]

Спасибо!


KA_   (2002-11-19 18:47:00) [4]

Опять прошу прощения - не мой сегодня день!
http://www.delphikingdom.com/mastering/xml_ser01.htm


KA_   (2002-11-19 18:46:00) [5]

Очевидно да. НО! Можно приписать к компоненту метод SaveToFile, SaveToStream или Serialize. И в нем сохранять состояние объекта, то есть компонента. На королевстве делфи есть статья про сериализацию классов делфи и там по-моему (не помню точно) есть и исходники компоненты для сериализации в XML файле. Принцип один и тотже, пропустишь муть про всякие парсеры, и напишешь етот самй метод. Вот ссылка:
http://www.delphikingdom.com/mastering/xml_ser03.htm


Fredericco   (2002-11-19 18:39:00) [6]

Понятно. :-( Мне тут сказали, что FileStream не может сохранять более одного уровня. Правда?


KA_   (2002-11-19 18:38:00) [7]

Нет, не это. Тело TLigthScenarioC.Add, TLigthScenarioC.SetLS и GetLS.


Fredericco   (2002-11-19 18:33:00) [8]

ls:=TLiSc.Create(nil);
ls.LigthScenario.Add;
ls.LigthScenario[ls.LigthScenario.Count-1].Name:="Test Name";


KA_   (2002-11-19 18:30:00) [9]

Да сохранял пустой класс. Нужен исходник, сам я так быстро не наваяю всю имплементацию :) Ты уж извини.


Fredericco   (2002-11-19 18:18:00) [10]

Я не в обиде :-)
Опять ошибка. А ты пустой класс сохранял? Если да, то попробуй в него чего-нить записать а потом сохранить и открыть.


KA_   (2002-11-19 18:16:00) [11]

Я уж совсем сильно ПРОШУ ПРОЩЕНИЯ. Попробывал - получилось вот так:

ls := TLiSc(fs.ReadComponent(ls));

Перед этим ls должен бытьсоздан криэйтом.
Иначе заругается, что класс нот фаунд.


Fredericco   (2002-11-19 18:15:00) [12]

KA_ (19.11.02 18:08)
пишет что типы не совместимы TLiSc и TComponent


Fredericco   (2002-11-19 18:13:00) [13]

Сначала пишет что типы не совместимы TLiSc и TComponent.
Создал tmp:TComponent. tmp:=FS.ReadComponent(nil); Пишет что класс TLiSc не найден - ошибка. :-(


KA_   (2002-11-19 18:08:00) [14]

Прошу прощения

LS := FS.ReadComponent(LS);


KA_   (2002-11-19 18:06:00) [15]

Попробуй так

LS := FS.ReadComponent(nil);


Наверх

Титульная страница Поиск, карта сайта Написать письмо