Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在IDE中获取所有已安装的组件?(德尔菲)_Delphi_Delphi 7 - Fatal编程技术网

Delphi 如何在IDE中获取所有已安装的组件?(德尔菲)

Delphi 如何在IDE中获取所有已安装的组件?(德尔菲),delphi,delphi-7,Delphi,Delphi 7,如何在TStrings中获取所有已安装的组件 我认为这段代码只能在包中工作: uses TypInfo, ToolIntf, Exptintf; procedure GetComponentNames(lst: TStrings); var i, k: Integer; CRef: TClass; strName: ShortString; begin lst.Clear; for i := 0 to ToolServices.GetModuleCount-1 do

如何在TStrings中获取所有已安装的组件

我认为这段代码只能在包中工作:

    uses TypInfo, ToolIntf, Exptintf;

procedure GetComponentNames(lst: TStrings);
var
  i, k: Integer;
  CRef: TClass;
  strName: ShortString;
begin
  lst.Clear;
  for i := 0 to ToolServices.GetModuleCount-1 do
  begin
    for k := 0 to ToolServices.GetComponentCount(i)-1 do
      begin
       CRef := TClass(GetClass(ToolServices.GetComponentName(i, k)));
       while CRef <> nil do
       begin
         strName := CRef.ClassName;
         if lst.IndexOf(strName) = -1 then
           lst.Add(strName);
         if str <> 'TComponent' then
          CRef := CRef.ClassParent
         else
           CRef := nil;
       end;
      end;
  end;    
end;

感谢您的帮助。

此示例不使用OpenAPI,而是使用注册表。它可以工作,但也列出了其他隐藏项中的非可视组件

procedure GetComponentNames(lst: TStrings);
var
  i, j, iPos: Integer;
  Reg: TRegistry;
  sComponent: String;
  slValues, slData: TStrings;
begin
  Reg := TRegistry.Create;
  slValues := TStringList.Create;
  slData := TStringList.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Reg.OpenKey('Software\Borland\Delphi\6.0\Palette', False); // Change reg key where appropriate
    Reg.GetValueNames(slValues);
    for i := 0 to Pred(slValues.Count) do
    begin
      lst.Append(slValues[i]);
      lst.Append('----------');
      slData.Delimiter := ';';
      slData.DelimitedText := Reg.ReadString(slValues[i]);
      for j := 0 to Pred(slData.Count) do
      begin
        sComponent := slData[j];
        iPos := Pos('.', sComponent);
        if (iPos > 0) then
          Delete(sComponent, 1, iPos);
        lst.Append(sComponent);
      end;
    end;
  finally
    slData.Free;
    slValues.Free;
    Reg.Free;
  end; {try..finally}
end;

我并不是说这是理想的,但它确实给了你一个列表和一个起点

这两个代码示例似乎都完全符合您的要求。有什么问题吗?不要只告诉我们你认为代码的作用。告诉我们当你运行它的时候到底发生了什么,然后告诉我们你希望它能做什么。我对这两个代码都有访问冲突。只在IDE包中使用这些代码。非常感谢,使用DelimitedText是一个明智的想法,我将执行一个小的过滤器来只获取组件,可能会添加如下内容:如果(长度(sComponent)>1)和(sComponent[1]='T'),那么是的,这是一个有点小技巧,但它完成了所需的工作!此示例不适用于DelphiXe2…正在运行的代码:
Reg.OpenKey('Software\Embarcadero\BDS\8.0\palete\Cache',False);//在适当的情况下更改注册表项注册表项GetKeyNames(slValues);
procedure GetComponentNames(lst: TStrings);
var
  i, j, iPos: Integer;
  Reg: TRegistry;
  sComponent: String;
  slValues, slData: TStrings;
begin
  Reg := TRegistry.Create;
  slValues := TStringList.Create;
  slData := TStringList.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    Reg.OpenKey('Software\Borland\Delphi\6.0\Palette', False); // Change reg key where appropriate
    Reg.GetValueNames(slValues);
    for i := 0 to Pred(slValues.Count) do
    begin
      lst.Append(slValues[i]);
      lst.Append('----------');
      slData.Delimiter := ';';
      slData.DelimitedText := Reg.ReadString(slValues[i]);
      for j := 0 to Pred(slData.Count) do
      begin
        sComponent := slData[j];
        iPos := Pos('.', sComponent);
        if (iPos > 0) then
          Delete(sComponent, 1, iPos);
        lst.Append(sComponent);
      end;
    end;
  finally
    slData.Free;
    slValues.Free;
    Reg.Free;
  end; {try..finally}
end;