Delphi Rio(FireMonkey)读写Windows注册表布尔值异常求助
问题分析与解决方法
哦,我一眼就发现问题所在了——你在保存和读取注册表布尔值时,使用的路径不匹配,而且读取逻辑里还有一处容易忽略的小错误,导致每次读取都返回默认的True值。
核心问题拆解
保存路径与读取路径不一致
- 保存时,你将Section设置为
AppRegKey + '\State\BoxChecked',对应的注册表实际路径是HKEY_CURRENT_USER\Software\Mycroft\TestApp\State\BoxChecked,键名称为Show。 - 但读取时,你虽然用
SectionExists检查了正确的Section路径,可调用ReadBool时却传入了AppRegKey作为Section(也就是Software\Mycroft\TestApp),这意味着你在尝试读取完全不同位置的Show键。由于这个位置的键不存在,ReadBool就会返回你设置的默认值True,这就是每次都显示Checked的根本原因。
- 保存时,你将Section设置为
资源未正确释放
你的代码里没有用try...finally块来释放TRegistryIniFile实例,长期运行可能会导致内存泄漏,这是Delphi开发里的基本规范哦。
修正后的完整代码
读取按钮事件(btnReadClick)
procedure TForm2.btnReadClick(Sender: TObject); var Reg: TCustomIniFile; checked: boolean; const SectionPath = AppRegKey + '\State\BoxChecked'; // 统一Section路径常量 begin Reg := TRegistryIniFile.Create(''); try // 确保资源被正确释放 // 直接读取,无需提前判断Section是否存在,ReadBool会处理不存在的情况 checked := Reg.ReadBool(SectionPath, 'Show', False); if checked then ShowMessage('Checked') else ShowMessage('Unchecked'); finally Reg.Free; end; end;
保存按钮事件(btnSaveClick)
procedure TForm2.btnSaveClick(Sender: TObject); var Reg: TCustomIniFile; const SectionPath = AppRegKey + '\State\BoxChecked'; // 复用同一个常量避免拼写错误 begin Reg := TRegistryIniFile.Create(''); try Reg.WriteBool(SectionPath, 'Show', chkBrandNew.IsChecked); finally Reg.Free; end; end;
额外优化建议
- 将重复使用的Section路径定义为常量,避免手动拼接时出现拼写错误,也让代码更易维护。
- 读取操作无需提前调用
SectionExists,ReadBool方法本身会在键或Section不存在时返回你指定的默认值,这样能简化代码逻辑。
内容的提问来源于stack exchange,提问作者Gordon Turner
相关产品推荐
相关产品推荐

