SaveToStream()、LoadFromStream() 对应文本流;
SaveToBinStream()、LoadFromBinStream() 对应二进制流; 相对文本流, 二进制流会小一些.
有这几个方法, 控件数据与状态的序列化就太容易了.
示例:
1、控件: ListBox1、Button1、Button2
2、事件: Button1.OnClick、Button2.OnClick、Form1.OnCreate
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Layouts, FMX.ListBox; type TForm1 = class(TForm) ListBox1: TListBox; Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.fmx} {给 ListBox1 加点内容} procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin for i := 0 to 9 do ListBox1.Items.Add('Item' + IntToStr(i)); end; {存取 ListBox1} procedure TForm1.Button1Click(Sender: TObject); const path = 'c:\temp\ListBox1Stream.txt'; var stream: TFileStream; begin {1} stream := TFileStream.Create(path, fmCreate); ListBox1.SaveToStream(stream); stream.Free; {2} ListBox1.Clear; ShowMessage('a'); {3} stream := TFileStream.Create(path, fmOpenRead); ListBox1.LoadFromStream(stream); stream.Free; end; {存取当前窗体} procedure TForm1.Button2Click(Sender: TObject); const path = 'c:\temp\Form1Stream.dat'; var stream: TFileStream; begin {1} stream := TFileStream.Create('c:\temp\Form1Stream.dat', fmCreate); Self.SaveToBinStream(stream); stream.Free; {2} Button1.Free; Button2.Free; ListBox1.Free; Realign; ShowMessage('a'); {3} stream := TFileStream.Create('c:\temp\Form1Stream.dat', fmOpenRead); Self.LoadFromBinStream(stream); stream.Free; end; end.
状态保存测试:
1、控件: Button1、Button2、Panel1; 在 Panel1 中再放三个 TCheckBox
2、事件: Button1.OnClick、Button2.OnClick、Form1.OnCreate、Form1.OnDestroy
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs; type TForm1 = class(TForm) Panel1: TPanel; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.fmx} var stream: TMemoryStream; procedure TForm1.FormCreate(Sender: TObject); begin stream := TMemoryStream.Create; Button2.Enabled := False; end; procedure TForm1.FormDestroy(Sender: TObject); begin stream.Free; end; {调整三个 CheckBox 的状态后保存} procedure TForm1.Button1Click(Sender: TObject); begin Panel1.SaveToStream(stream); ShowMessage(IntToStr(stream.Size)); Button2.Enabled := True; end; {恢复} procedure TForm1.Button2Click(Sender: TObject); begin stream.Position := 0; Panel1.LoadFromStream(stream); end; end.
分类:
XE2 与 FireMonkey
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧