Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TFileStream


NS1989 ©   (2008-11-27 13:07:00) 

Необходимо некоторое значение записывать в файл. Правильно ли я написал вариант сохранения через 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;


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


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

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


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


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


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


Тын-Дын   (2008-11-27 23:39:00) [3]


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


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


Slym   (2008-11-27 14:25:00) [4]

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


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


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


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


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


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


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


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

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

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


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


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


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


{RASkov}   (2008-11-27 13:18:00) [9]

> [3] NS1989   (27.11.08 13:13)

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


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


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


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


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

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


Palladin   (2008-11-27 13:16:00) [12]

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


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


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


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


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

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

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


Palladin   (2008-11-27 13:10:00) [15]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо