Сохранение и получение логического значения из реестра 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;
Другие вопросы по тегам