Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-46053
iNew
2002-10-28 07:18
2002.11.14
В Хелпе Delphi6 вкладка Указатель пустая, как это можно


1-45843
Gari
2002-11-05 10:40
2002.11.14
Структура Delphi


1-45947
Youri
2002-11-04 12:29
2002.11.14
Прерывание процедуры!!!


1-45934
Zuvom
2002-11-04 02:34
2002.11.14
Pchar


1-45883
AL2002
2002-11-05 17:43
2002.11.14
Как узнать количество поторяющихся строк в ListBox?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский