Сохранение и получение логического значения из реестра Windows
Я пытаюсь сохранить / получить логическое значение из реестра Windows с помощью Delphi Rio (Firemonkey). Независимо от того, какое состояние я сохраняю, истинное или ложное, код всегда возвращает истинное значение. Вот пример проекта, иллюстрирующий мой метод:
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. Может кто-нибудь указать мне правильное направление?
1 ответ
Вы не передаете одно и то же имя ключа 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;