【问题标题】:How to get the Delphi Projects MRU List?如何获取 Delphi Projects MRU List?
【发布时间】:2022-01-01 18:58:23
【问题描述】:

我正在尝试从特定的 Delphi 版本中获取项目 MRU 列表:

function GetDelphiMRUList(const verstr: string; var MRUList: TStringList): Boolean;
var
  Reg: TRegistry;
begin
  Result := False;
  MRUList.Text := '';
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Reg.OpenKeyReadOnly('SOFTWARE\Embarcadero\BDS\' + verstr);
    Result := Reg.KeyExists('Closed Projects');
    Reg.CloseKey;
    if Result then
    begin
      // How to get the MRUList?

    end;
  finally
    Reg.Free;
  end;
end;

用法:

procedure TForm1.FormCreate(Sender: TObject);
begin
  var MRUList: TStringList;
  MRUList := TStringList.Create;
  try
    if GetDelphiMRUList('22.0', MRUList) then
      CodeSite.Send('TForm1.FormCreate: MRUList', MRUList);
  finally
    MRUList.Free;
  end;
end;

我一直在获取已关闭项目的列表。

【问题讨论】:

    标签: delphi registry delphi-11-alexandria


    【解决方案1】:

    至少在我的系统上,注册表值被命名为File_0File_1 等等,所以检索这个列表很容易:

    function GetDelphiMRUList(const verstr: string; MRUList: TStringList): Boolean;
    begin
      var Reg := TRegistry.Create;
      try
        Reg.RootKey := HKEY_CURRENT_USER;
        Result := Reg.OpenKey('SOFTWARE\Embarcadero\BDS\' + verstr + '\Closed Projects', False);
        if Result then
        begin
          MRUList.Clear;
          var i := 0;
          while Reg.ValueExists('File_' + i.ToString) do
          begin
            MRUList.Add(Reg.ReadString('File_' + i.ToString));
            Inc(i);
          end;
        end;
      finally
        Reg.Free;
      end;
    end;
    

    (请注意,让MRUList 成为var 参数是没有意义的。)

    用法:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      var List := TStringList.Create;
      try
        if GetDelphiMRUList('21.0', List) then
          Memo1.Lines.Assign(List)
        else
          Memo1.Text := 'Couldn''t get MRU list.';
      finally
        List.Free;
      end;
    end;
    

    【讨论】:

    • 谢谢!我的问题: 1. 你为什么不用Reg.CloseKey;? 2.TBaseProject和数字1,1,1,1,1是什么意思? 3. 为什么你更喜欢Reg.OpenKey 而不是OpenKeyReadOnly
    • (1) TRegistry.Destroy 析构函数调用CloseKey,如您在System.Win.Registry.pas 中所见,可能接近第255 行。 (2) 这是Embarcadero 的实现细节。它没有记录在案,并且格式可能随时更改。您实际上不应该读取这些注册表项:它们仅由 BDS 在内部使用以保存其设置。您必须向 Embarcadero 开发人员询问格式是什么。如果你给他们一大笔钱,他们甚至可能会答应你在下一个版本的 BDS 中不会改变这种格式......
    • (3) 我一直使用OpenKey 并且从来没有理由使用其他东西。在 HKCU,你可以做任何你想做的事,所以权限不会成为问题。
    • 很遗憾,Delphi 没有项目经理。所以,IMO,创建一个自定义的是有意义的。
    • 我会更进一步。我会将MRUList 参数更改为TStrings,以便Memo1.Lines 可以直接传递给函数。然后在内部,我会让函数使用 TRegistry.GetValueNames() 并循环遍历结果,因此对值的名称没有任何假设。
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2010-11-16
    相关资源
    最近更新 更多