Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.034 c
14-1129575786
Kolan
2005-10-17 23:03
2005.11.06
Как управлять питанием USB


3-1127887190
novikova
2005-09-28 09:59
2005.11.06
I/O Error 53 - что это?


14-1129121709
Сергей Орлик
2005-10-12 16:55
2005.11.06
Delphi 2006 or C++Builder 2006 or C#Builder 2006 = BDS 2006


14-1129642861
teddy
2005-10-18 17:41
2005.11.06
Старые письма на сервере и Бат


1-1129118677
Dust
2005-10-12 16:04
2005.11.06
Inline функции





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