Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Как сохранить/считать свойства потомка 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.042 c
14-1129327473
TStas
2005-10-15 02:04
2005.11.06
Спасибо Джо, Керку и все остальным


14-1129122903
Антоний
2005-10-12 17:15
2005.11.06
Для печати проспектов


4-1125565143
mikka
2005-09-01 12:59
2005.11.06
Как определить HANDLE гл.формы и ее дочерних форм?


1-1129726945
Dush
2005-10-19 17:02
2005.11.06
Excel и Stringgrid


6-1121775131
SlyFox
2005-07-19 16:12
2005.11.06
Простенький SMTP-сервер