![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сохранить/считать свойства потомка TObject в строку? [D7]
Карелин Артем © (2005-10-17 09:50:00)Задача такая: есть обьект типа TPersistent, у него без проблем в Run-time определяю имена всех published свойств, нахожу свойства в виде потомков TObject, получаю значения этих свойств в виде переменных типа TObject. Теперь как мне осуществить преобразование этих объектных переменных в строку и наоборот с целью считывания/записи?
P.S. Тип свойств и название заранее неизвестен.
Карелин Артем (2005-10-17 11:32:00) [1]
> Lin7 © (17.10.05 11:10) [12]
Большое спасибо за ссылку. То, что требовалось.
Lin7 (2005-10-17 11:10:00) [2]Посмотри
http://www.megalib.com/books/478/1618.htm
Lin7 (2005-10-17 11:10:00) [3]Посмотри
http://www.megalib.com/books/478/1618.htm
Карелин Артем (2005-10-17 11:03:00) [4]
> REA (17.10.05 10:44) [7]
> jack128 © (17.10.05 10:49) [9]
Это то, что надо было. Спасибо!
Digitman (2005-10-17 10:51:00) [5]
> TReader.ReadComponent не подходит, потому как входной параметр
> имеет тип TComponent
почему не сделать свой класс наследником TComponent ?
> Запись самого себя в поток тоже не подходит по некоторым
> причинам
сомневаюсь, что причины столь уж серьезны ..
Борланд в классах TPersistent/TComponent сделал многое, что позволяет отказаться от изобретения велосипеда в пользу готовой streaming system, которая делает сохранение/восстановление объектов легким и вполне универсальным
jack128 (2005-10-17 10:49:00) [6]REA (17.10.05 10:44) [7]
Угу. Такой способ используется, например, в DBGrid (TColumnsWrapper + TDBGridColumns.SaveTo/LoadFromStream)
REA (2005-10-17 10:45:00) [7]Мне вообще то тоже не нравится этот моментик в стандартном варианте - чтобы записать Child объекты нужно и себя писать...
REA (2005-10-17 10:44:00) [8]Создай компонент, перегрузи функцию пренадлежности объектов к компоненту, используй WriteComponent, убей компонент. Мне кажется так будет проще, чем писать свой код записи.
Карелин Артем (2005-10-17 10:29:00) [9]Запись самого себя в поток тоже не подходит по некоторым причинам.
REA (2005-10-17 10:25:00) [10]А зачем?
Такое не пойдет?
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:00) [11]
> REA (17.10.05 10:25) [4]
> не подходит, потому как входной параметр имеет тип TComponent.
Карелин Артем (2005-10-17 10:09:00) [12]Понимаешь ли в чем дело...
Пишу класс, одна из задач которого заключается в автоматическом сохранении всехсвоих published свойств в тексте и считывании из него. Т.е. для сохранения свойства достаточно просто продекларировать его в published и все. Процедуры сохранения/считывания сами определяют, какие свойства есть у класса. Почти со всеми типами свойств этот механизм работает, осталось сделать преобразование TObject<->строка.
TReader.ReadComponent не подходит, потому как входной параметр имеет тип TComponent.
evvcom (2005-10-17 10:07:00) [13]Цель действительно неясна. Но, возможно, тебе помогут исходники TypInfo.pas
Digitman (2005-10-17 09:56:00) [14]
> преобразование этих объектных переменных в строку и наоборот
> с целью считывания/записи?
с этого места подробней ..