- Хотел бы я на "винте" столько места, чтобы на него влез двухсот гигабайтный своп-файл!
- Зачем тебе такой большой своп?!!
- Да не нужен мне такой своп! Просто хотелось бы столько места!..
Какое наилучшее решение для сохранения экземпляра TStringGrid
(150x10)?
myStream := TFileStream.Create('grid1.sav', fmOpenRead);
StringGrid1 := myStream1.ReadComponent(StringGrid1) as TStringGrid;
Here's the translation of the content into Russian:
Классическая проблема!
Текущий подход не подходит для больших файлов, таких как файл обмена размером 200 ГБ (хотя бы и если было возможно хранить такой огромный файл в памяти, методы TFileStream и WriteComponent/ReadComponent могут быть неэффективными или не надежными).
Для хранения меньшего экземпляра TStringGrid (150x10) у вас есть несколько вариантов:
Сериализация XML: вы можете использовать встроенные функции сериализации XML Delphi для хранения данных грида в файле XML. Это относительно лёгкое и легко реализуемое решение.
uses
XmlSerializer;
procedure SaveGridToXML;
var
xmlStream: TMemoryStream;
begin
xmlStream := TMemoryStream.Create;
try
XmlSerializer1.SaveToStream(StringGrid1, xmlStream);
xmlStream.SaveToFile('grid1.xml');
finally
xmlStream.Free;
end;
end;
procedure LoadGridFromXML;
var
xmlStream: TMemoryStream;
begin
xmlStream := TMemoryStream.Create;
try
xmlStream.LoadFromFile('grid1.xml');
StringGrid1 := XmlSerializer1.LoadFromStream(xmlStream);
finally
xmlStream.Free;
end;
end;
Бинарная сериализация: вы можете использовать методы WriteComponent/ReadComponent, но с более эффективным бинарным форматом.
uses
Classes;
procedure SaveGridToBinFile;
var
stream: TFileStream;
begin
stream := TFileStream.Create('grid1.bin', fmCreate);
try
StringGrid1.WriteComponent(stream);
finally
stream.Free;
end;
end;
procedure LoadGridFromBinFile;
var
stream: TFileStream;
begin
stream := TFileStream.Create('grid1.bin', fmOpenRead);
try
StringGrid1 := stream.ReadComponent as TStringGrid;
finally
stream.Free;
end;
end;
Кастомная бинарная форма: вы можете создать кастомную бинарную форму для хранения данных грида, которая может быть более эффективной, чем использовать WriteComponent/ReadComponent. Это требует больше усилий и экспертизы.
Для больших файлов вам может потребоваться рассмотреть использование базы данных или более robust хранения, которое предназначено для обработки больших объемов данных.
Никогда не забывайте освобождать память и файловые потоки, когда вы закончите с ними, чтобы избежать утечек памяти!
В статье рассматривается вопрос о том, как сохранить экземпляр компонента TStringGrid на диске с помощью потока TFileStream и обратно прочитать его.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.