添加自定义项目到TShellTreeView

问题描述:

任何人都知道如何修改ShellCtrls.pas?其实我想添加一些项目在资源管理器树的顶部。添加自定义项目到TShellTreeView

例如:

-myitem  
-miitemtoo 
-mycomputer 
-c: 
-d: 

也许修改此增强树视图:http://delphi.about.com/library/weekly/code/gtrocheckshelltreeview.zip

但我认为ShellCtrls是要修改的主要文件。

我不认为你需要修改源代码。股票TShellTreeView是TCustomTreeView的后代,因此您可以在TreeView中添加项目。

下面的代码是而不是通过认真考虑或测试,但它可能会让你开始。它在ShellTreeView的顶部插入一个显示名称作为可执行文件名称和路径作为可执行文件路径的项目。

uses 
    shlobj, activex, shellapi; 

function InsertToSTV(STV: TShellTreeView; Pos: Integer; 
    Path, DisplayName: string): Boolean; 
var 
    ShellFolderInterface, NodeShellFolder: IShellFolder; 
    ItemIDList: PItemIDList; 
    CharsParsed, Attributes: ULONG; 
    wPath: PWideChar; 
    Node: TTreeNode; 
    FileInfo: TSHFileInfo; 
begin 
    Result:= False; 
    if (SHGetDesktopFolder(ShellFolderInterface) = NOERROR) then begin 
    wPath:= StringToOleStr(Path); 
    if wPath <> nil then 
     try 
     if ShellFolderInterface.ParseDisplayName(0, nil, wPath, CharsParsed, 
      ItemIDList, Attributes) = NO_ERROR then 

      ShellFolderInterface.BindToObject(ItemIDList, nil, IID_IShellFolder, 
       NodeShellFolder); 
      Node := STV.Items.Insert(STV.Items[Pos], DisplayName); 
      Node.Data := TShellFolder.Create(nil, ItemIDList, NodeShellFolder); 

      if STV.UseShellImages and not Assigned(STV.Images) then begin 
      SHGetFileInfo(PChar(ItemIDList), 0, 
          FileInfo, 
          SizeOf(FileInfo), 
          SHGFI_PIDL or SHGFI_SYSICONINDEX); 
      Node.ImageIndex := FileInfo.iIcon; 
      SHGetFileInfo(PChar(ItemIDList), 0, 
          FileInfo, 
          SizeOf(FileInfo), 
          SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_OPENICON); 
      Node.SelectedIndex := FileInfo.iIcon; 
      end; 
     finally 
      SysFreeString(wPath); 
     end; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    InsertToSTV(ShellTreeView1, 
      0, 
      ExtractFilePath(Application.ExeName), 
      ExtractFileName(Application.ExeName)); 
end; 

那么,要严格回答你的问题,修改ShellCtrls.pas,你可以在代码编辑器中打开它,在你想要的地方进行更改,然后将它编译到你的应用程序中。

但是,我强烈建议不要这样做。对其进行更改的最佳方法是创建后代组件。这就是OOP世界中事情的完成方式。

因此,而不是修改现有的类,创建一个后代类。