You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi Rio(FireMonkey)读写Windows注册表布尔值异常求助

问题分析与解决方法

哦,我一眼就发现问题所在了——你在保存和读取注册表布尔值时,使用的路径不匹配,而且读取逻辑里还有一处容易忽略的小错误,导致每次读取都返回默认的True值。

核心问题拆解

  1. 保存路径与读取路径不一致

    • 保存时,你将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的根本原因。
  2. 资源未正确释放
    你的代码里没有用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:07:31