Заданные переменные могут быть успешно сохранены в потомке TStream.Вот пример.
Просто создайте новое приложение для форм vcl, добавьте в него два компонента TButton и заполните события OnClick для каждой кнопки, как показано в примере ниже.
Это было создано в XE4, поэтому условие использования может отличаться для других версий Delphi, но это должно быть тривиально изменить, удаляя индикаторы пространства имен перед каждым модулем в предложении использования.Сохранение переменной заданного типа с четко сформулированными значениями возможно в двоичном файле и легко с помощью Delphi.Другими словами,
Также предлагается взглянуть на блок TypInfo, если у вас есть источник, или просто использовать предоставленные функции, которые делают распространение типов Set вплоть до их текстового представления довольно простым, хотя здесь не приведен пример.Это рекомендуется, если вы хотите включить сохранение в файл конфигурации или ini-файл или в постоянном формате, который можно редактировать в тексте.
Ниже приведен самый простой из известных мне.Просмотр двоичного вывода типа набора, сохраненного в потоке, подобном приведенному ниже, показывает, что он сохраняется в наименьшем возможном растровом представлении для набора на основе его размера.Нижеследующий отображает один байт на диске (значение равно 5), что означает, что каждое значение должно быть сопоставлено степени 2 (seThis = 1, seThat = 2, seTheOther = 4), точно так же, как созданные вручную постоянные значения битовой маски.Компилятор, вероятно, следит за соблюдением правил, заставляющих набор сохранять свою ординальность.Этот пример был проверен на работах в Delphi XE4.
Надеюсь, что поможет.
Брайан Джозеф Джонс
unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls;
type
TSomeEnum = (seThis, seThat, seTheOther);
TSomeEnumSet = set of TSomeEnum;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SomeSetVar: TSomeEnumSet;
SomeBoolean: Boolean;
SomeInt: Integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
SomeSetVar := [seThis, seTheOther];
SomeBoolean := True;
SomeInt := 31415;
with TFileStream.Create('SetSave.bin',fmCreate or fmOpenWrite or fmShareCompat) do
try
Write(SomeSetVar,SizeOf(SomeSetVar));
Write(SomeBoolean,SizeOf(Boolean));
Write(SomeInt,SizeOf(Integer));
finally
Free;
end;
SomeSetVar := [];
SomeInt := 0;
SomeBoolean := False;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ResponseStr: string;
begin
with TFileStream.Create('SetSave.bin',fmOpenRead or fmShareCompat) do
try
Read(SomeSetVar,SizeOf(SomeSetVar));
Read(SomeBoolean,SizeOf(Boolean));
Read(SomeInt,SizeOf(Integer));
finally
Free;
end;
ResponseStr := 'SomeSetVar = ';
if (seThis in SomeSetVar) then
ResponseStr := ResponseStr + 'seThis ';
if (seThat in SomeSetVar) then
ResponseStr := ResponseStr + 'seThat ';
if (seTheOther in SomeSetVar) then
ResponseStr := ResponseStr + 'seTheOther ';
ResponseStr := ResponseStr + ' SomeBoolean = ' + BoolToStr(SomeBoolean);
ResponseStr := ResponseStr + ' SomeInt = ' + IntToStr(SomeInt);
ShowMessage(ResponseStr);
end;
end.