Сохранение данных проекта

Проблема сохранения данных своей программы в файле встает перед большинством программистов. Например, пусть вы разрабатываете какой-либо визуальный редактор и нужно сохранить модель в файле для того, чтобы иметь возможность впоследствии ее загрузить.

Для работы с файлами в Delphi есть объект TFileStream, который представляет собой поток данных и является потомком объекта TStream. Если вам требуется обработка файлов, используйте этот объект.

Итак, давайте рассмотрим практический пример сохранения данных и напишем код, в котором реализуем следующие возможности:

  • на форме в случайной точке должен появляться компонент TImage;
  • в созданный компонент должно загружаться случайное изображение из набора TImageList;
  • программа должна иметь возможность сохранять положения компонентов и изображение в файле (сохранять необходимо именно изображение, а не его индекс в списке);
  • в программе должна быть реализована возможность загрузки данных из файла.

Для реализации проекта я поместил на форму меню и панель с кнопками T ActionMainMenuBar Создать, Открыть, Сохранить и Добавить картинку.

Помимо этого на форме нужно разместить список ImageList с изображениями. Для примера я поместил в список 6 изображений размером 32x32.

procedure TForm1.acAddPicExecute(Sender: TObject);

var

imgTemp: TImage;

begin

imgTemp:= TImage.Create(plClient);

// Получаем случайную картинку из ImageList

// и загружаем ее в TImage

ImageList1.GetBitmap(Random(6), imgTemp.Picture.Bitmap);

// Устанавливаем основные параметры компонента

imgTemp.Left:= Random(Width - 20);

imgTemp.Top:= Random(Height - 100);

imgTemp.AutoSize:= True;

imgTemp.Transparent:= True;

plClient.InsertControl(imgTemp);

end;

Давайте подробнее рассмотрим код. Сначала создается компонент TImage. Во время его создания методу Create передается указатель на панель, на которую мы поместим наше изображение. Затем выбирается случайное изображение из списка ImageList1 и помещается в объект Bitmap.

В качестве дополнения мы случайным образом устанавливаем позицию компонента и изменяем его свойства Autosize и Transparent на true, чтобы загруженное изображение было прозрачным и компонент автоматически принял его размеры.

В последней строке вызывается метод InsertControl панели plClient. В качестве параметра ему передается созданный компонент TImage. После этого изображение размещается в указанной позиции панели.

Теперь перейдем к созданию нового проекта. Я максимально упростил пример, и список создаваемых компонентов TImage нигде не хранится, поэтому достаточно просто уничтожить все изображения, после чего можно считать, что новый проект создан. Итак, по щелчку на кнопке Создать у нас будут выполняться всего две строки кода:

procedure TForm1.acNewExecute(Sender: TObject);

begin

plClient.DestroyComponents;

end;

Вызывается метод DestroyComponents панели, на которой могут находиться компоненты TImage. Так как все наши изображения находятся на панели, они уничтожаются.

Вот теперь переходим к процессу сохранения данных. По щелчку на кнопке Сохранить будет выполняться код из листинга ниже

Глобальная переменная

FileName: string = 'SaveData.dat';

procedure TForm1.acSaveExecute(Sender: TObject);

Var

fs: TFileStream;

ms: TMemoryStream;

i, index: Integer;

Begin

// Сохраняем проект

fs:= TFileStream.Create(FileName, fmCreate);

Try

// Записываем сигнатуру

fs.Write('proj', 8);

//Записываем количество элементов

index:= plClient.ComponentCount;

fs.Write(index, SizeOf(index));

// Записываем информацию о картинках

for i:= 0 to plClient.ComponentCount - 1 do

Begin

//Левая позиция

fs.Write(TImage(plClient.Components[i]).Left, SizeOf(index));

//Верхняя позиция

fs.Write(TImage(plClient.Components[i]).Top, SizeOf(index));

// Картинку загружаем в память

ms:= TMemoryStream.Create;

TImage(plClient.Components[i]).Picture.Bitmap.SaveToStream(ms);

ms.Seek(0, soFromBeginning);

// Сохраняем размер картинки

index:= ms.Size;

fs.Write(index, SizeOf(index));

// Сохраняем картинку

fs.CopyFrom(ms, ms.Size);

ms.Free;

end;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: