Записать список строк в системный реестр

Тема в разделе "Delphi", создана пользователем WinHack, 28 ноя 2016.

  1. WinHack
    Можно ли записать содержание списка строк в системный реестр, а потом прочитать их из реестра? Реально. Здесь мы будем записывать каждую строку как значение ключа, а имя ключа будет иметь индекс каждого элемента в списке.

    Код:
    procedure TDPRegistry.SaveStringListInRegistry(
      _RootKey: HKEY; _Localkey: String; Strings: TStrings
    );
    var
      TR: TRegIniFile;
      LStringIndex: Integer;
    begin
      TR := TRegIniFile.Create('');
      try
        case _RootKey of // значение по умолчанию RootKey=HKEY_CURRENT_USER
          HKEY_CLASSES_ROOT,
          HKEY_CURRENT_USER,
          HKEY_LOCAL_MACHINE,
          HKEY_USERS,
          HKEY_PERFORMANCE_DATA,
          HKEY_CURRENT_CONFIG,
          HKEY_DYN_DATA: TR.RootKey := _RootKey;
        end;
        // make sure no entries for this section/ key
        TR.EraseSection(_Localkey);
        with TRegistry(TR) do
        begin
          if OpenKey(_Localkey, true) then
          begin
            try
              for LStringIndex := 0 to Strings.Count - 1 do
                WriteString (IntToStr(LStringIndex), Strings[LStringIndex]);
            finally
              CloseKey;
            end;
          end;
        end;
      finally
        TR.Free;
      end;
    end;
    
    { Получаем список строк из реестра }
    procedure TDPRegistry.GetStringListFromRegistry(
      _RootKey: HKEY; _Localkey: String; Strings: TStrings
    );
    var
      TR: TRegIniFile;
      LStringIndex: Integer;
      RegKeyInfo: TRegKeyInfo;
    begin
      Strings.Clear;  // начинаем без элементов списка строк
      TR := TRegIniFile.Create('');
      try
        case _RootKey of // default is  RootKey=HKEY_CURRENT_USER
          HKEY_CLASSES_ROOT,
          HKEY_CURRENT_USER,
          HKEY_LOCAL_MACHINE,
          HKEY_USERS,
          HKEY_PERFORMANCE_DATA,
          HKEY_CURRENT_CONFIG,
          HKEY_DYN_DATA: TR.RootKey := _RootKey;
        end;
        {TR.ReadSectionValues(_Localkey, Strings); не работает как надо,
        потому что возвращает строки как "1=Value", "2=Value"...}
        with TRegistry(TR) do
        begin
          if OpenKey(_Localkey, true) then
          begin
            try
              if (GetKeyInfo(RegKeyInfo)) then
              begin
                for LStringIndex := 0 to RegKeyInfo.NumValues - 1 do
                  Strings.Add(ReadString(IntToStr(LStringIndex)));
              end;
            finally
              CloseKey;
            end;
          end;
        end;
      finally
        TR.Free;
      end;
    end;