2009-10-12 44 views
1

如何獲取TStrings中所有已安裝的組件?如何獲得IDE內所有安裝的組件? (Delphi)

我覺得這個代碼工作僅在包:

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; 

或者:

uses ToolsApi; 

{....} 

var 
    a, i: Integer; 
begin 
    with (BorlandIDEServices as IOTAPackageServices) do 
    begin 
    for a := 0 to GetPackageCount - 1 do 
    begin 
     for i := 0 to GetComponentCount(a) - 1 do 
     begin 
     {get each component name with GetComponentName(a, i);} 
     // DoSomething 
     end; 
    end; 
    end; 
end; 

感謝您的幫助。

+6

這兩個代碼示例看起來完全符合您的要求。有什麼問題?不要僅僅告訴我們你認爲代碼的作用。告訴我們當你運行它時會發生什麼,然後告訴我們你希望它會做什麼。 – 2009-10-12 10:14:23

+0

我有兩個代碼訪問衝突。僅將這些代碼用於IDE包。 – Kachwahed 2009-10-13 09:28:59

回答

3

本示例不使用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; 

我不是說這是理想的,但它確實會給你一個清單和一個headstart。

+0

非常感謝,它使用DelimitedText的智能思想,我將執行一個小的過濾器來獲取組件,可能會添加如下內容: if(Length(sComponent)> 1)和(sComponent [1] ='T' )然後 – Kachwahed 2009-10-13 09:32:47

+0

是的,這都是一個黑客的一點,但它需要的工作! – 2009-10-13 09:47:43

+0

此示例不適用於DelphiXe2 ...正在工作的代碼:
Reg.OpenKey('Software \ Embarcadero \ BDS \ 8.0 \ Palette \ Cache',False); //在適當的地方更改註冊碼 Reg.GetKeyNames(slValues); – RBA 2012-06-21 15:58:46