Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> writecomponent 
:(
    Опции темы
Гость_guest
Дата 24.11.2004, 14:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











как вычислить размер получившегося сериализованного класса после writecomponent ???
  Вверх
Alex
Дата 25.11.2004, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Цитата
сериализованного класса

Что вы под этим понимаете?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Гость_guest
Дата 25.11.2004, 08:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Ну есть к примеру класс:
Код

TTest = class(TComponent)

Я его сериализую применяя:
Код

Stream.WriteComponent(TTest)

Так вот нужно чтобы Stream.Size <= MaxSize !!!! Соответственно, нужно знать как зависит Stream.Size от класса TTest, к примеру если так есть поля integer, string, collection ???

  Вверх
Jureth
Дата 25.11.2004, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 23.11.2004
Где: где-то в Западной Сибири

Репутация: нет
Всего: 3



попробуй Sizeof (TTest)
PM   Вверх
Гость_guest
Дата 25.11.2004, 12:10 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











не катит
Результат не правильный, и яркий пример тому тип string !!!!, а использовать string[размер] я не могу
  Вверх
Alex
Дата 25.11.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



длина строки вычисляется как Length(s)


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Гость_guest
Дата 25.11.2004, 14:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Да не в этом дело....
А к том что при сериализации добавляется имя property и его содержимое, да плюс символы управляющие какие-то
Вопрос в том как узнать какой получится размер потока ???
  Вверх
Alex
Дата 25.11.2004, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Вот выдержка из хелпа
Цитата
This example shows how to use the built-in component streaming support to convert any component into a string and convert that string back into a component.
Код

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): 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(nil);

   finally
     BinStream.Free;
   end;
 finally
   StrStream.Free;
 end;
end;



Если ты здесь не найдешь ответа на свой вопрос, то объясняй всю задачу, только по РУССКИ


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
p0s0l
Дата 25.11.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Запиши TTest в промежуточный поток (ms : TMemoryStream), у этого потока возьми размер (ms.Size)... Если он больше, чем нужно, то записывай в Stream только часть ms ( s.WriteBuffer(ms.memory^, MaxSize); )...
Или тоже не про то говорю ? smile


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_guest
Дата 25.11.2004, 15:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











p0s0l ты говоришь именно про то...
но вопрос не про то как прочитать нужный размер, а как этот размер вычислить заранее имея всего лишь класс !!!!???
Как происходит сериализация надо понять.... что пишется ???
  Вверх
p0s0l
Дата 25.11.2004, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Компонент в поток пишется так:
1.Вначале пишется сигнатура TPF0
2.Имя класса (строка)
3.Имя компонента (строка)
4.Иногда пишется префикс с флагом
5.Пишутся published свойства
6.Конец (два нулевых байта)

Строки пишутся так:
<длина строки (1 байт)> <сама строка>

Свойство пишется в том случае, если спецификатор stored этого свойства = True, и свойство либо не имеет default значение (директива nodefault), либо его значение отличается от default-значения...
Left и Top свойства пишутся всегда.
Своства пишутся в таком формате:
1.Имя свойства (строкой, т.е. еще размер имени вначале)
2.TValueType (1 байт)
3.Значение (разное кол-во байт)

Например, запись свойства Tag:
Если значение = 0 (default), то оно не пишется...
Иначе, пишется вначале имя свойства:
3TAG (здесь 3 - это не символ, а значение байта)
Далее пишется значение свойства:
1) Если значение <= 255, то пишется так:
$02 $xx ($02 = vaInt8, тип значения, $xx - значение)
2) Если значение > 255, но <= 65535, то:
$03 $xxxx ($03 = vaInt16)
3) И т.д.

Короче, подсчитать размер вручную, програмно - дело непростое... Вовсю юзать RTTI придётся...
И в итоге напишешь то же самое, что сделали Borland.
Не легче ли сохранить в поток и узнать размер ?

Если хочешь узнать подробнее - в Project Options вруби "Use debug DCU's" и пошагово в отладчике просмотри, что делается при записи компонента в поток...


--------------------
С уважением, г-н Посол.
PM   Вверх
Гость_guest
Дата 26.11.2004, 10:07 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Пасиб
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0779 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.