Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизКак сохранить/считать свойства потомка TObject в строку? Найти похожие ветки
← →
Карелин Артем © (2005-10-17 09:50) [0]Задача такая: есть обьект типа TPersistent, у него без проблем в Run-time определяю имена всех published свойств, нахожу свойства в виде потомков TObject, получаю значения этих свойств в виде переменных типа TObject. Теперь как мне осуществить преобразование этих объектных переменных в строку и наоборот с целью считывания/записи?
P.S. Тип свойств и название заранее неизвестен.
← →
Digitman © (2005-10-17 09:56) [1]
> преобразование этих объектных переменных в строку и наоборот
> с целью считывания/записи?
с этого места подробней ..
← →
evvcom © (2005-10-17 10:07) [2]Цель действительно неясна. Но, возможно, тебе помогут исходники TypInfo.pas
← →
Карелин Артем © (2005-10-17 10:09) [3]Понимаешь ли в чем дело...
Пишу класс, одна из задач которого заключается в автоматическом сохранении всех своих published свойств в тексте и считывании из него. Т.е. для сохранения свойства достаточно просто продекларировать его в published и все. Процедуры сохранения/считывания сами определяют, какие свойства есть у класса. Почти со всеми типами свойств этот механизм работает, осталось сделать преобразование TObject<->строка.
TReader.ReadComponent не подходит, потому как входной параметр имеет тип TComponent.
← →
REA (2005-10-17 10:25) [4]А зачем?
Такое не пойдет?
Function ComponentToString(Component: TComponent): string;
var
BinStream: TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;
function StringToComponent(Value: string; Component: TComponent = Nil): TComponent;
var
StrStream: TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(Component);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
← →
Карелин Артем © (2005-10-17 10:25) [5]
> REA (17.10.05 10:25) [4]
> не подходит, потому как входной параметр имеет тип TComponent.
← →
Карелин Артем © (2005-10-17 10:29) [6]Запись самого себя в поток тоже не подходит по некоторым причинам.
← →
REA (2005-10-17 10:44) [7]Создай компонент, перегрузи функцию пренадлежности объектов к компоненту, используй WriteComponent, убей компонент. Мне кажется так будет проще, чем писать свой код записи.
← →
REA (2005-10-17 10:45) [8]Мне вообще то тоже не нравится этот моментик в стандартном варианте - чтобы записать Child объекты нужно и себя писать...
← →
jack128 © (2005-10-17 10:49) [9]REA (17.10.05 10:44) [7]
Угу. Такой способ используется, например, в DBGrid (TColumnsWrapper + TDBGridColumns.SaveTo/LoadFromStream)
← →
Digitman © (2005-10-17 10:51) [10]
> TReader.ReadComponent не подходит, потому как входной параметр
> имеет тип TComponent
почему не сделать свой класс наследником TComponent ?
> Запись самого себя в поток тоже не подходит по некоторым
> причинам
сомневаюсь, что причины столь уж серьезны ..
Борланд в классах TPersistent/TComponent сделал многое, что позволяет отказаться от изобретения велосипеда в пользу готовой streaming system, которая делает сохранение/восстановление объектов легким и вполне универсальным
← →
Карелин Артем © (2005-10-17 11:03) [11]
> REA (17.10.05 10:44) [7]
> jack128 © (17.10.05 10:49) [9]
Это то, что надо было. Спасибо!
← →
Lin7 © (2005-10-17 11:10) [12]Посмотри
http://www.megalib.com/books/478/1618.htm
← →
Lin7 © (2005-10-17 11:10) [13]Посмотри
http://www.megalib.com/books/478/1618.htm
← →
Карелин Артем © (2005-10-17 11:32) [14]
> Lin7 © (17.10.05 11:10) [12]
Большое спасибо за ссылку. То, что требовалось.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c