Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Вниз

Как мне перевести свой тип в поток?   Найти похожие ветки 

 
begin...end ©   (2005-01-14 16:58) [40]

> [39] Dmitry_04   (14.01.05 16:57)

Понимание Вами этого факта меня радует.


 
Digitman ©   (2005-01-14 17:04) [41]

надо же ! и меня, кстать, тоже)
пора делать выводы ?


 
Dmitry_04   (2005-01-14 17:25) [42]

а если я сделаю так:

mstrm.Write(fmv, SizeOf(fmv));
mstrm.Write(tmv, SizeOf(tmv));
...
mstrm.Read(fmv, SizeOf(fmv));
mstrm.Read(tmv, SizeOf(tmv));


я правильно получу обратно из потока переменные fmv и tmv?


 
Александр Иванов ©   (2005-01-14 17:27) [43]

Dmitry_04   (14.01.05 17:25) [42]
А проверить слабо?


 
Dmitry_04   (2005-01-14 17:27) [44]

сейчас проверю :)


 
begin...end ©   (2005-01-14 17:42) [45]

> [42] Dmitry_04   (14.01.05 17:25)

После выполнения этого кода значения переменных fmv и tmv, действительно, не изменятся. Но только лишь потому, что из потока фактически ничего не прочитается.


 
GrayFace ©   (2005-01-14 17:51) [46]

> Dmitry_04
Почитай статью "Динамические структуры данных".


 
begin...end ©   (2005-01-14 18:22) [47]

> [42] Dmitry_04   (14.01.05 17:25)

Существует ещё такое понятие, как текущая позиция потока. После того, как Вы записываете в поток какую-то переменную с помощью метода Write, позиция (представьте, что это некий указатель внутри потока) смещается (увеличивается) на величину размера записанной переменной.

Например, сразу после создания потока эта позиция равна 0. После записи переменной fmv значение этой позиции увеличится на величину количества записанных байт, т.е. на SizeOf(fmv). Если теперь снова вызвать метод Write и записать в поток переменную tmv, то она запишется, начиная с текущей позиции, а сама позиция после этого увеличится на величину SizeOf(tmv). Узнать значение этой позиции мы можем в любой момент, прочитав свойство потока Position.

Итак, после записи двух переменных в поток (после выполнения первой части кода [42]) указатель внутри потока будет указывать на, извините за выражение, конец потока.

Далее Вы хотите прочитать эти переменные. Но после вызова метода Read чтение всегда начинается не с начала потока, а именно с текущей позиции. А поскольку текущая позиция в данный момент - это конец потока, то ничего и не прочитается.

Чтобы всё же прочитать эти переменные, перед чтением нужно сместиться в начало потока. Сделать это можно, например, присвоив свойству Position значение 0. Если теперь вызвать метод Read, то чтение начнётся именно с начала потока, и можно будет прочитать сначала переменную fmv, а потом - tmv, т.е. в том порядке, в котором Вы их и записывали.

Таким образом, всё, что нужно сделать - это просто добавить строку mstrm.Position := 0; вместо многоточия в [42]. Ну и читать-то уж желательно для проверки уже в другие переменные, а не в те же самые (а иначе как Вы узнаете, что содержимое переменных после чтения - это результат именно чтения, а не то же самое, что было там и до чтения?), или как-то обнулять их перед чтением.

Т.е. код будет такой:

type
 TMyVar = record
   ...
 end;

var
 mstrm: TMemoryStream;
 fmv1, tmv1, fmv2, tmv2: TMyVar;

begin
 mstrm := TMemoryStream.Create;
 try
   // Записываем что-нибудь в fmv1 и tmv1
   ...
   // Записываем fmv1 и tmv1 в поток
   mstrm.Write(fmv1, SizeOf(TMyVar));
   mstrm.Write(tmv1, SizeOf(TMyVar));
   // Сброс указателя
   mstrm.Position := 0;
   // Читаем содержимое потока в fmv2 и tmv2
   mstrm.Read(fmv2, SizeOf(TMyVar));
   mstrm.Read(tmv2, SizeOf(TMyVar));
   // Теперь нужно сравнить то, что записывали, с тем, что прочиталось,
   // т.е. fmv1 c fmv2, а tmv1 с tmv2. Т.к. в Вашем случае эти переменные
   // представляют собой записи, то оператор "=" не подойдёт. В таких
   // случаях для сравнения используют функцию CompareMem
   if CompareMem(@fmv1, @fmv2, SizeOf(TMyVar)) and CompareMem(@tmv1, @tmv2, SizeOf(TMyVar)) then
     ShowMessage("Всё записалось и прочиталось удачно!")
 finally
   mstrm.Free
 end
end.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.037 c
6-1099636036
_intruder
2004-11-05 09:27
2005.01.30
Отправка смс (МегаСлон, МТС, БиЛайн из программы Делфи


3-1103809388
Бульбаш
2004-12-23 16:43
2005.01.30
Обработка исключения Oracle


6-1100142838
Aleks_Grey
2004-11-11 06:13
2005.01.30
Вопрос - как достать информацию из сети?


3-1104132075
Russko
2004-12-27 10:21
2005.01.30
Кол-во записей в БАЗЕ INTERBASE


3-1104313235
korvin
2004-12-29 12:40
2005.01.30
Таблицы только на чтение или снова DeadLock ...





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