设置变量可以成功保存到 TStream 后代。这是一个例子。
只需创建一个新的 vcl 表单应用程序,向其中添加两个 TButton 组件并为每个按钮填写 OnClick 事件,如下例所示。
这是在 XE4 中创建的,因此对于其他版本的 Delphi,uses 子句可能会有所不同,但通过删除uses 子句中每个单元之前的命名空间指示符应该很容易改变。使用 Delphi 可以轻松地将具有明确值的集合类型变量保存到二进制文件中。换句话说,
如果您有源代码或仅使用提供的函数,还建议您查看 TypInfo 单元,这使得将 Set 类型分解为它们的文本表示相当简单,尽管此处没有提供示例。如果您想包括保存到配置或 ini 文件或以文本可编辑的持久性格式,则建议这样做。
下面是我所知道的最简单的一个。查看保存到如下流的集合类型的二进制输出意味着它基于集合的大小以最小的可能位图表示形式保存。下面的一个映射到磁盘上的一个字节(值为 5),这意味着每个值必须映射到 2 的幂(seThis = 1,seThat = 2,seTheOther = 4),就像手动创建的常量位掩码值一样。编译器可能会强制它遵循强制 set 保持其序数的规则。这个例子是在 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.