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

Вниз

TFileStream   Найти похожие ветки 

 
NS1989   (2008-11-27 13:07) [0]

Необходимо некоторое значение записывать в файл. Правильно ли я написал вариант сохранения через TFileStream:


 F := TFileStream.Create(Name, fmCreate);
 try
   Write(Value, SizeOf(Value));
 finally
   Free;
 end;

 //2:

 M := TMemoryStream.Create;
 with M do
   try
     Write(Value, SizeOf(Value));
     SaveToFile(Name);
   finally
     Free;
   end;


 
Palladin ©   (2008-11-27 13:10) [1]

а что смущает?


 
Сергей М. ©   (2008-11-27 13:12) [2]

1. Следует использовать метод WriteBuffer - он возбудит исключение, если при записи приключится какой-либо катаклизм

2. Правильность в обоих вариантах зависит от типа Value


 
NS1989   (2008-11-27 13:13) [3]


> а что смущает?


1-способ сохранения, так как впервые приходится использовать TFileStream


 
Palladin ©   (2008-11-27 13:16) [4]

метод Write одинаковый, что в TFileStream, что в TMemoryStream, потому что это метод их общего наследника TStream. повторяю, что смущает?


 
Palladin ©   (2008-11-27 13:16) [5]

тьфу, родителя, а не наследника... )


 
{RASkov} ©   (2008-11-27 13:18) [6]

> [3] NS1989   (27.11.08 13:13)

Первый способ именно тут и именно так - написан не верно.


 
NS1989   (2008-11-27 13:18) [7]


>  Правильность в обоих вариантах зависит от типа Value


Хотелось бы услышать более подробно, при какой ситуации возникнет ошибка


 
NS1989   (2008-11-27 13:19) [8]


> {RASkov} ©   (27.11.08 13:18) [6]
> > [3] NS1989   (27.11.08 13:13)Первый способ именно тут
> и именно так - написан не верно


Подскажите как должно быть правильно


 
Сергей М. ©   (2008-11-27 13:33) [9]


> при какой ситуации возникнет ошибка


При указании в кач-ве Value идентификатора переменной, имеющий любой из типов данных с управляемым временем жизни - (Ansi|Wide)String, [Ole]Variant, динамический массив ..


 
Поросенок Винни-Пух ©   (2008-11-27 13:33) [10]

try
  Write(Value, SizeOf(Value));
finally
  Free;
end;

Это и есть правильно.
Все данные по адресу Value размером с Value запишутся в поток.


 
Сергей М. ©   (2008-11-27 13:35) [11]


> Все данные по адресу Value размером с Value запишутся в
> поток


"Все" вовсе не обязаны.
Потому Write как раз и объявлен как функциональный метод


 
Slym ©   (2008-11-27 14:25) [12]

Сергей М. ©   (27.11.08 13:33) [9]
уточнение:
нельзя таким образом сохранить "ссылочный" тип или тип в котором присутствуют поля ссылочного типа...
под ссылочные типы подподают: динамические массивы а также их производные - строки с переменной длинной, указатели (PChar, PInteger) и производные (объекты)...
короче в общем случае все что SizeOf(Value)=SizeOf(Integer), но при этом вмещающее в себя более байт так сохранить нельзя


 
Тын-Дын ©   (2008-11-27 23:39) [13]


> 1. Следует использовать метод WriteBuffer - он возбудит
> исключение, если при записи приключится какой-либо катаклизм


Следует использовать, если знаешь зачем.
А так - без разницы что - Write или WriteBuffer.


 
Сергей М. ©   (2008-11-28 09:05) [14]


> Тын-Дын ©   (27.11.08 23:39) [13]


Ну хорошо, не "следует", а "рекомендуется"


 
Плохиш ©   (2008-11-28 10:43) [15]


> NS1989   (27.11.08 13:13) [3]
>
>
> > а что смущает?
>
>
> 1-способ сохранения

Действительно, не указано к чему относится Write.



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

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

Наверх




Память: 0.5 MB
Время: 0.014 c
2-1227856798
Андрей Алекс.
2008-11-28 10:19
2009.01.11
Сохдать Pages в PageControl


15-1226817733
Igor20
2008-11-16 09:42
2009.01.11
СтринГлист :) помогите


2-1227990525
demon
2008-11-29 23:28
2009.01.11
RGB


2-1227719429
FEV
2008-11-26 20:10
2009.01.11
Функция плагина winamp...


15-1226831942
b1tard
2008-11-16 13:39
2009.01.11
Симплекс-метод