windows - 从 Windows 注册表保存和检索布尔值
问题描述
我正在尝试使用 Delphi Rio (Firemonkey) 从 Windows 注册表中保存/检索布尔值。无论我保存哪种状态,真或假,代码总是返回一个真值。这是一个说明我的方法的示例项目:
uses
System.IniFiles, System.Win.Registry;
const
AppRegKey = 'Software\Mycroft\TestApp';
procedure TForm2.btnReadClick(Sender: TObject);
var
Reg: TCustomIniFile;
checked: boolean;
begin
Reg := TRegistryIniFile.Create('');
checked := False;
if Reg.SectionExists(AppRegKey + '\State\BoxChecked') then begin
checked := Reg.ReadBool(AppRegKey,'Show', True);
end;
if checked then
ShowMessage('Checked')
else
ShowMessage('Unchecked');
end;
procedure TForm2.btnSaveClick(Sender: TObject);
var
Reg: TCustomIniFile;
begin
Reg := TRegistryIniFile.Create('');
Reg.WriteBool(AppRegKey + '\State\BoxChecked', 'Show', chkBrandNew.IsChecked);
end;
看来注册表中的值正在更新,所以我不确定为什么它总是返回 True 值。有人可以指出我正确的方向吗?
解决方案
您没有将相同的键名Reg.ReadBool()
传递给您传递给Reg.WriteBool()
.
您也在泄漏TRegistryIniFile
对象。
试试这个:
uses
System.IniFiles, System.Win.Registry;
const
AppRegKey = 'Software\Mycroft\TestApp';
AppRegKey_BoxChecked = AppRegKey + '\State\BoxChecked';
procedure TForm2.btnReadClick(Sender: TObject);
var
Reg: TCustomIniFile;
checked: boolean;
begin
Reg := TRegistryIniFile.Create('');
try
checked := False;
if Reg.SectionExists(AppRegKey_BoxChecked) then
begin
checked := Reg.ReadBool(AppRegKey_BoxChecked, 'Show', True);
end;
if checked then
ShowMessage('Checked')
else
ShowMessage('Unchecked');
finally
Reg.Free;
end;
end;
procedure TForm2.btnSaveClick(Sender: TObject);
var
Reg: TCustomIniFile;
begin
Reg := TRegistryIniFile.Create('');
try
Reg.WriteBool(AppRegKey_BoxChecked, 'Show', chkBrandNew.IsChecked);
finally
Reg.Free;
end;
end;
也就是说,TRegistryIniFile
是为了向后兼容用于保存配置TIniFile
然后迁移到注册表的旧代码。根本不应该使用新代码TRegistryIniFile
。
uses
System.Win.Registry;
const
AppRegKey = 'Software\Mycroft\TestApp';
AppRegKey_BoxChecked = AppRegKey + '\State\BoxChecked';
procedure TForm2.btnReadClick(Sender: TObject);
var
Reg: TRegistry;
checked: boolean;
begin
Reg := TRegistry.Create;
//Reg := TRegistry.Create(KEY_QUERY_VALUE);
try
checked := False;
if Reg.OpenKeyReadOnly(AppRegKey_BoxChecked) then
// if Reg.OpenKey(AppRegKey_BoxChecked, False) then
begin
if Reg.ValueExists('Show') then
checked := Reg.ReadBool('Show')
else
checked := True;
Reg.CloseKey;
end;
if checked then
ShowMessage('Checked')
else
ShowMessage('Unchecked');
finally
Reg.Free;
end;
end;
procedure TForm2.btnSaveClick(Sender: TObject);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create(KEY_SET_VALUE);
try
if Reg.OpenKey(AppRegKey_BoxChecked, True) then
begin
Reg.WriteBool('Show', chkBrandNew.IsChecked);
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
推荐阅读
- sql - 如何修复元数据库中的“缺少表的 FROM 子句条目”错误
- vba - Prompt for verifying recipients
- matrix - 如何进行 4 维旋转?
- spring - 在应用程序上下文中将 Spring Boot 2.1.9 碰撞到 2.2.0 没有 AuthenticationManager
- html - 如何修改下拉列表?
- javascript - ngClass 混合条件
- python - 将图像保存到后台任务抓取的 ImageField
- mongodb - Pentaho 数据集成多选参数
- deep-learning - 将cntk模型v1转换为cntk模型v2
- c++ - 如何在 QTextEdit 小部件的 QString 中包含的 HTML 中编写“<”