Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизКак мне перевести свой тип в поток? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.031 c