Сохранение и чтение из потока данных объекта Delphi , Компоненты и Классы , Потоки
Сохранение и чтение из потока данных объекта
Для чтения и записи на диск большого количества записей данных
объекта я использовал TFileStream и TMemoryStream. Ниже я привел пример,
сохраняющий на диске c помощью потока содержание контейнера DataArray,
насчитывающего несколько тысяч записей объектов:
DataStream := TFileStream.Create('vccmem.dat', fmCreate);
MakeDate := FormatDateTime('mmmm d, yyyy',date);
DataStream.Write(MakeDate, SizeOf(MakeDate));
RCount := DataArray.Size;
DataStream.Write(RCount,SizeOf(RCount));
for q := 1 to DataArray.Size do
begin
Application.ProcessMessages;
ARecord := DataArray[q] as TNameRecord;
DataStream.Write(ARecord.id, SizeOf(ARecord.id));
DataStream.Write(ARecord.first_name, SizeOf(ARecord.first_name));
DataStream.Write(ARecord.last_name, SizeOf(ARecord.last_name));
DataStream.Write(ARecord.title, SizeOf(ARecord.title));
DataStream.Write(ARecord.address, SizeOf(ARecord.address));
DataStream.Write(ARecord.city, SizeOf(ARecord.city));
DataStream.Write(ARecord.state, SizeOf(ARecord.state));
DataStream.Write(ARecord.zip, SizeOf(ARecord.zip));
DataStream.Write(ARecord.phone, SizeOf(ARecord.phone));
DataStream.Write(ARecord.fax, SizeOf(ARecord.fax));
DataStream.Write(ARecord.e_mail, SizeOf(ARecord.e_mail));
end ;
DataStream.Destroy;
А вот код, но на этот раз загружающий данные в память при запуске приложения
и создающие контейнер данных с именем NameArray:
DataStream := TMemoryStream.Create;
DataStream.LoadFromFile('vccmem.dat');
DataStream.Read (MakeDate, SizeOf(MakeDate));
DataStream.Read (RCount, SizeOf(RCount));
for q := 1 to RCount do
begin
NameRecord := TNameRecord.Create;
DataStream.Read (NameRecord.id, SizeOf(NameRecord.id));
DataStream.Read (NameRecord.first_name,
SizeOf(NameRecord.first_name));
DataStream.Read (NameRecord.last_name,
SizeOf(NameRecord.last_name));
DataStream.Read (NameRecord.title, SizeOf(NameRecord.title));
DataStream.Read (NameRecord.address, SizeOf(NameRecord.address));
DataStream.Read (NameRecord.city, SizeOf(NameRecord.city));
DataStream.Read (NameRecord.state, SizeOf(NameRecord.state));
DataStream.Read (NameRecord.zip, SizeOf(NameRecord.zip));
DataStream.Read (NameRecord.phone, SizeOf(NameRecord.phone));
DataStream.Read (NameRecord.fax, SizeOf(NameRecord.fax));
DataStream.Read (NameRecord.e_mail, SizeOf(NameRecord.e_mail));
NameArray.Insert(NameRecord);
end ;
Код, который вы предоставили, является примером использования компонентов TFileStream
и TMemoryStream
в Delphi для чтения и записи данных в файл.
Запись данных в файл:
DataStream := TFileStream . Create ( 'vccmem.dat' , fmCreate ) ;
MakeDate := FormatDateTime ( 'mmmm d, yyyy' , date ) ;
DataStream . Write ( MakeDate , SizeOf ( MakeDate )) ;
RCount := DataArray . Size ;
DataStream . Write ( RCount , SizeOf ( RCount )) ;
Эти строки создают новый файл с именем vccmem.dat
и записывают текущую дату в него. Затем они записывают размер объекта DataArray
в файл.
Далее цикл проходит по каждому элементу в массиве DataArray
и записывает соответствующие поля каждого объекта TNameRecord
в файл:
for q := 1 to DataArray . Size do
begin
Application . ProcessMessages ;
ARecord := DataArray [ q ] as TNameRecord ;
DataStream . Write ( ARecord . id , SizeOf ( ARecord . id )) ;
DataStream . Write ( ARecord . first_name , SizeOf ( ARecord . first_name )) ;
DataStream . Write ( ARecord . last_name , SizeOf ( ARecord . last_name )) ;
DataStream . Write ( ARecord . title , SizeOf ( ARecord . title )) ;
DataStream . Write ( ARecord . address , SizeOf ( ARecord . address )) ;
DataStream . Write ( ARecord . city , SizeOf ( ARecord . city )) ;
DataStream . Write ( ARecord . state , SizeOf ( ARecord . state )) ;
DataStream . Write ( ARecord . zip , SizeOf ( ARecord . zip )) ;
DataStream . Write ( ARecord . phone , SizeOf ( ARecord . phone )) ;
DataStream . Write ( ARecord . fax , SizeOf ( ARecord . fax )) ;
DataStream . Write ( ARecord . e_mail , SizeOf ( ARecord . e_mail )) ;
end ;
Наконец, файл закрывается вызовом Destroy
на объекте TFileStream
:
Чтение данных из файла:
DataStream := TMemoryStream . Create ;
DataStream . LoadFromFile ( 'vccmem.dat' ) ;
DataStream . Read ( MakeDate , SizeOf ( MakeDate )) ;
DataStream . Read ( RCount , SizeOf ( RCount )) ;
for q := 1 to RCount do
begin
NameRecord := TNameRecord . Create ;
DataStream . Read ( NameRecord . id , SizeOf ( NameRecord . id )) ;
DataStream . Read ( NameRecord . first_name , SizeOf ( NameRecord . first_name )) ;
DataStream . Read ( NameRecord . last_name , SizeOf ( NameRecord . last_name )) ;
DataStream . Read ( NameRecord . title , SizeOf ( NameRecord . title )) ;
DataStream . Read ( NameRecord . address , SizeOf ( NameRecord . address )) ;
DataStream . Read ( NameRecord . city , SizeOf ( NameRecord . city )) ;
DataStream . Read ( NameRecord . state , SizeOf ( NameRecord . state )) ;
DataStream . Read ( NameRecord . zip , SizeOf ( NameRecord . zip )) ;
DataStream . Read ( NameRecord . phone , SizeOf ( NameRecord . phone )) ;
DataStream . Read ( NameRecord . fax , SizeOf ( NameRecord . fax )) ;
DataStream . Read ( NameRecord . e_mail , SizeOf ( NameRecord . e_mail )) ;
NameArray . Insert ( NameRecord ) ;
end ;
Эти строки загружают данные из файла vccmem.dat
в память. Затем они читают дату и счетчик записей из файла. Цикл проходит по каждому элементу в файле, читает каждый поле каждого объекта TNameRecord
и вставляет его в новый массив NameArray
.
В статье описывается сохранение и чтение данных объекта в потоке, а также загрузка этих данных в память при запуске приложения.
Комментарии и вопросы Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Потоки ::