Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
ВнизСохранение свойств в поток Найти похожие ветки
← →
klyonov (2002-11-03 10:53) [0]Здравствуйте. У меня такая проблема: как известно published-свойства сохраняются в поток автоматически при использовании WriteComponent, так как для них доступна RTTI-информация. Однако, когда я добавил еще и public-свойство и определил методы для сохранения его в поток и чтения из потока через DefineProperties, published-свойства сохраняться автоматически перестали. Мне интересно узнать отчего так произошло, в Help"е ни о чем подобном не говорится.
← →
Юрий Зотов (2002-11-03 10:59) [1]В DefineProperties вызвать inherited не забыли?
← →
klyonov (2002-11-03 14:11) [2]не забыл, все равно не сохраняются.
кстати, сохраняются перемещенные в published свойства родительского класса, а объявленные в этом классе не сохраняются.
← →
Юрий Зотов (2002-11-03 15:28) [3]Та-а-ак...
Вообще-то, самое время было бы привести хоть кусочек кода, но раз это такой большой секрет, то продолжим наши игры в "угадайку". Внимание, следующий вопрос.
В объявлении DefineProperties написать override не забыли?
← →
klyonov (2002-11-03 17:10) [4]да нет, код не секрет, вот кусок:
TCPS=class(TComponent)
private
FNodeList: array of TNode;
FNodeCount: Integer; // Вот это-то и не сохраняет
FIsChanged: Boolean; // И это
FFileName: TFileName; // И это
function GetNode(Index: Integer): TNode;
procedure ReadNodeList(AReader: TReader);
procedure SetNode(Index: Integer; ANode: TNode);
procedure WriteNodeList(AWriter: TWriter);
protected
procedure DefineProperties(AFiler: TFiler); override;
public
procedure AddNode(ANode: TNode);
constructor Create(AOwner: TComponent); override;
procedure DelNode(Index: Integer); overload;
procedure DelNode(AName: string); overload;
destructor Destroy; override;
function NodeByName(AName: string): TNode;
property NodeList[Index: Integer]: TNode read GetNode write SetNode;
published
property NodeCount: Integer read FNodeCount;
property isChanged: Boolean read FIsChanged write FIsChanged;
property FileName: TFileName read FFileName write FFileName;
end;
А вот и сохраняющие public-свойство методы:
procedure TCPS.ReadNodeList(AReader: TReader);
var i: Integer;
begin
SetLength(FNodeList, 0);
FNodeCount:=AReader.ReadInteger;
FFileName:=AReader.ReadString;
AReader.ReadListBegin;
i:=0;
while not AReader.EndOfList do
begin
SetLength(FNodeList, i+1);
FNodeList[i]:=AReader.ReadComponent(nil) as TNode;
inc(i);
end;
AReader.ReadListEnd;
end;
procedure TCPS.WriteNodeList(AWriter: TWriter);
var i: Integer;
begin
AWriter.WriteInteger(FNodeCount);
AWriter.WriteString(FFileName);
AWriter.WriteListBegin;
for i:=0 to FNodeCount-1 do
AWriter.WriteComponent(FNodeList[i]);
AWriter.WriteListEnd;
end;
Сейчас все это работает, только не понятно, почему свойства не сохраняются автоматически
← →
klyonov (2002-11-03 17:11) [5]Ой-ой-ой, самое главное забыл :)
Вот:
procedure TCPS.DefineProperties(AFiler: TFiler);
begin
AFiler.DefineProperty("NodeList", ReadNodeList, WriteNodeList, FNodeCount<>0);
inherited;
end;
← →
Сатир (2002-11-03 17:34) [6]а может надо написать соответствующие методы для чтения для первого, чтения и записи для второго и третьего соответствующих свойств(NodeCount, isChanged, FileName)?
← →
Юрий Зотов (2002-11-03 18:29) [7]> Сатир
Свойства стандартных типов должны сохраняться и без этого.
> klyonov
NodeCount и не должно сохраняться, оно read-only. Вообще, в published ему делать нечего, ему место явно в public. А сохранять его либо не надо вообще, либо именно ручками, как у Вас сейчас.
С остальным непонятно - вроде бы, должно сохраняться. Хотя одно подозрение все же есть. Попробуйте в DefineProperties СНАЧАЛА вызвать inherited, а уж потом добавлять свое. Если заработает - сообщите, ОК? Тут, похоже, есть тонкий момент, но надо сначала проверить.
И еще - если уж NodeCount пишется в поток, то зачем при чтении массива добавлять по одному элементу? Ведь каждый раз перераспределяется память, а это лишние операции. Как только считали NodeCount - сразу SetLength (1 раз), а потом просто заполняем уже готовый массив.
А если все же хочется добавляеть по одному элементу (до EndOfList), то зачем сохранять FNodeCount? Его можно использовать вместо i в цикле чтения и оно вычислится автоматически.
← →
klyonov (2002-11-04 01:40) [8]Не знал, что read-only не сохраняются, завтра проверю насчет inherited и напишу.
Вот еще 1 момент меня волнует: (из-за него я и стал читать по одному элементу, а FNodeCount забыл убрать) если при чтении объекта из потока, чтение проводится в уже созданный объект, например, с большим числом элементов массива, чем у читаемого, лишнюю память следует освобождать или нет (TNode у меня класс)? И еще 1 вопрос - в каком порядке читаются из потока свойства? В смысле, сначала которые были сохранены автоматом или нет?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c