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

Вниз

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

 
Dmitry_04   (2005-01-14 14:04) [0]

Как мне перевести свой тип в поток? Т.е. я создал свой тип:

type
 ...=record
   ...
 end;


Как мне его перевести в TMemoryStream и обратно?


 
begin...end ©   (2005-01-14 14:07) [1]

> Dmitry_04   (14.01.05 14:04)

TMemoryStream хранит данные, а не типы.

Если Вы имели в виду запись переменной указанного типа в TmemoryStream, то так:

type
 TMyType = record
   ...
 end;

var
 MyVar: TMyType;

begin
 ...
 MemoryStream.Write(MyVar, SizeOf(MyVar))
 ...
end.


 
Kerk ©   (2005-01-14 14:08) [2]

Наследуйся от TComponent для начала


 
Dmitry_04   (2005-01-14 14:11) [3]

Да... begin...end вы меня правильно поправили... т.е. переменную моего типа...


 
Kerk ©   (2005-01-14 14:13) [4]

Dmitry_04   (14.01.05 14:11) [3]
сорри думал отвечал про классы.. :)
[1] прав


 
Dmitry_04   (2005-01-14 14:13) [5]

а как обратно перевести из TMemoryStream в переменную моего типа?


 
Семен Сорокин ©   (2005-01-14 14:13) [6]


> Dmitry_04   (14.01.05 14:11) [3]
> Да... begin...end вы меня правильно поправили... т.е. переменную
> моего типа...

надеюсь про strings, dynamic arrays and pointers помним?


 
Семен Сорокин ©   (2005-01-14 14:14) [7]


> Dmitry_04   (14.01.05 14:13) [5]
> а как обратно перевести из TMemoryStream в переменную моего
> типа?

если записать -  write
то по логике, прочитать - ... (догадайтесь сами) :)


 
begin...end ©   (2005-01-14 14:15) [8]

> [5] Dmitry_04   (14.01.05 14:13)

У TStream и у его наследника TMemoryStream есть метод Read. Прочитать с его помощью можно в любую переменную (этот параметр там нетипизированный). Главное - следить за размером.


 
Dmitry_04   (2005-01-14 14:16) [9]

Семен Сорокин хорошая идея... :) Попробую "read"


 
Dmitry_04   (2005-01-14 14:17) [10]

begin...end извени за глупый вопрос, но зачем следить за размером?


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

> [10] Dmitry_04   (14.01.05 14:17)

Чтобы при чтении заполнить ВСЮ переменную. Не больше, но и не меньше.


 
Dmitry_04   (2005-01-14 14:51) [12]

что-то у меня не получается прочитать всю переменную из потока...:( Что делать?


type
 TMyVar = record
   i: integer;
   s: string;
   b: boolean;
 end;

var
mstrm: TMemoryStream;
fmv: TMyVar;

...

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


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

>mstrm.Read(fmv, SizeOf(mstrm));

>mstrm.Read(fmv, SizeOf(fmv));


 
begin...end ©   (2005-01-14 14:53) [14]

> [12] Dmitry_04   (14.01.05 14:51)

> mstrm.Read(fmv, SizeOf(mstrm))

Вы читаете из потока переменную типа TMyVar. Вам надо указать, сколько байт нужно в эту переменную прочитать. Так почему же Вы указываете вторым параметром в Read размер переменной-потока, а не размер переменной fmv?


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

Нужен размер считываемого блока данных, а не указателя :).


 
Digitman ©   (2005-01-14 14:56) [16]


> Dmitry_04   (14.01.05 14:51) [12]


> s: string; !!!!!!!!!



> что-то у меня не получается прочитать всю переменную из
> потока...:( Что делать?


читать в справке все про длинные строки до полного просветления


 
Dmitry_04   (2005-01-14 14:57) [17]

я думал надо так... потому что переменная fmv пустая, в ней ничего нет... вот меня и смутил ее размер...
Но теперь все работает... только почему-то при закрытии программы ошибка какая-то выпадает...:(


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

> [16] Digitman ©   (14.01.05 14:56)

О-о-о... Ещё и это...


 
Dmitry_04   (2005-01-14 15:03) [19]

и почему она выскакивает не понимаю...

mstrm.Free; написал...


 
Digitman ©   (2005-01-14 15:06) [20]


> begin...end ©   (14.01.05 14:58) [18]
> О-о-о... Ещё и это...


ладно бы только это ..


> Dmitry_04   (14.01.05 14:57) [17]



> при закрытии программы ошибка какая-то выпадает


и буквы в сообщении об ошибке, конечно же, не знакомые ?


> почему она выскакивает не понимаю


потому что ошибка)


 
Kerk ©   (2005-01-14 15:07) [21]

Dmitry_04   (14.01.05 15:03) [19]
см [16]


 
Семен Сорокин ©   (2005-01-14 15:08) [22]


> Dmitry_04   (14.01.05 15:03) [19]
> и почему она выскакивает не понимаю...

[6] & [16]
PS. Прям как предвидел продолжение :)


 
Dmitry_04   (2005-01-14 15:09) [23]

выскакивает окно ошибки:
"Exception EAccessViolation in module Project1.exe at 00003E1C. Access violation at address 00403E1C in module Project1.exe. Read of address 00956394."

Что это такое вообще не понимаю...


 
Digitman ©   (2005-01-14 15:09) [24]


> Как мне перевести


слово "перевести", миль пардон, ассоциируется с "бабушку через дорогу"...

а для потока (Делфи-объекта, наследника TStream) существуют термины "записать в поток", "прочитать из потока"


 
Dmitry_04   (2005-01-14 15:14) [25]

Digitman Точно! Тему говоришь! :)


 
Digitman ©   (2005-01-14 15:16) [26]


> Dmitry_04   (14.01.05 15:09) [23]
> Что это такое вообще не понимаю...


когда не понимаешь, вариантов не так уж и много : либо спросить о значении непонятного здесь же, в форуме, либо почитать книжки на эту тему, либо переквалифицироваться в управдомы

если же сообщение переводить дословно, то оно звучит так :

Возникло исключение класса EAccessViolation в модуле таком-то при выполнении маш.инструкции, находящейся по адресу такому-то.
Исключение возникло из-за нарушения прав доступа к данным по адресу такому-то в модуле таком-то.
Нарушение прав произошло при попытке чтения данных по такому-то адресу.


 
Dmitry_04   (2005-01-14 15:20) [27]

да, но почему она не возникает при чтении? А когда программу закрываешь? Так все записывается и читается отлично...


 
Kerk ©   (2005-01-14 15:23) [28]

Dmitry_04   (14.01.05 15:20) [27]
тебе уже раз пять ответили. ты читать умеешь?


 
Dmitry_04   (2005-01-14 15:25) [29]

все... я все понял! Спасибо всем! :))) Мне не надо было string использовать, я переделал на shortstring и все нормуль! :) У меня всеравно там одно слово хранится...:)


 
Семен Сорокин ©   (2005-01-14 15:30) [30]


> Dmitry_04   (14.01.05 15:25) [29]
> все... я все понял! Спасибо всем! :))) Мне не надо было
> string использовать, я переделал на shortstring и все нормуль!
> :) У меня всеравно там одно слово хранится...:)

может стоит тогда в string[20] переделать?


 
Dmitry_04   (2005-01-14 15:47) [31]

наверно :) так наверно еще лучше будет :)


 
Digitman ©   (2005-01-14 16:22) [32]


> Dmitry_04   (14.01.05 15:47) [31]
> наверно :) так наверно еще лучше будет :)


может и лучше .. но понимания происходящего это не добавит
таки все же вникни в спр.материалы по длинным строкам - оно хуже не будет и рано или поздно пригодится.


 
Dmitry_04   (2005-01-14 16:34) [33]

У меня тут еще один простенький вопросик возник... Вот если я в поток уже записывал переменную, а теперь надо другую переменную этого-же типа записать... мне перед тем как записывать писать mstrm.Clear? Т.е.


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


или тут без разницы? можно и не писать?


 
begin...end ©   (2005-01-14 16:36) [34]

> Dmitry_04   (14.01.05 16:34) [33]

> mstrm.Read(fmv, SizeOf(mstrm));

Вы что - издеваетесь, что ли?


 
Dmitry_04   (2005-01-14 16:39) [35]

begin...end Ой... сорри! Я эти строчки сверху скопировал и не увидел... Сорри!

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


 
begin...end ©   (2005-01-14 16:44) [36]

> Dmitry_04   (14.01.05 16:39) [35]

> Вот если я в поток уже записывал переменную, а теперь надо
> другую переменную этого-же типа записать... мне перед тем
> как записывать писать mstrm.Clear?

Если Вам надо, чтобы в потоке была всегда записана ОДНА переменная - естественно, поток надо перед каждой записью очищать. Если Вы хотите туда записать НЕСКОЛЬКО переменных, то записывайте их с помощью Write последовательно.

Правда, из кода [35] я не вижу, что там что-то записывается. Там из потока читается переменная, затем он очищается, а затем Вы пытаетесь из ПУСТОГО ПОТОКА прочитать что-то ещё.


 
Dmitry_04   (2005-01-14 16:46) [37]

ой... что-то я вообще сегодня торможу..... там Write надо... ну я вообще...:)


 
Digitman ©   (2005-01-14 16:51) [38]


> мне перед тем как записывать писать mstrm.Clear?


а ты сам себе задайся вопросом - а зачем собственно ? и что произойдет при вызове Clear() ?

вот река - это поток ... сомнений не вызывает этот факт, надеюсь ?

вот ты пустил по реке бумажный кораблик .. через минуту - еще один ..

тот кто ловит ниже по реке твои кораблики, поймает сначала первый пущенный тобой. затем через минуту - второй ... сомнений это не вызывает ?

теперь представь что ты пустил кораблик и тут же "очистил" реку, вместе со всем дерьмом что она несет, включая твой кораблик, и затем пустил следующий ... ЧТО увидит тот кто ожидает твои кораблики ниже по течению ?


 
Dmitry_04   (2005-01-14 16:57) [39]

он увидит второй кораблик :)


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

> [39] Dmitry_04   (14.01.05 16:57)

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



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

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.034 c
4-1102923618
denis24
2004-12-13 10:40
2005.01.30
запуск второй копии програмы из faq


1-1105880027
Жыбазисная
2005-01-16 15:53
2005.01.30
Использование типов данных, объявленных в DLL


3-1104013064
Никола
2004-12-26 01:17
2005.01.30
Печать платежных поручений


1-1105951569
slart
2005-01-17 11:46
2005.01.30
Inno Setup


1-1104789712
Colonel
2005-01-04 01:01
2005.01.30
Меню рабочего стола