将自定义项添加到TShellTreeView

时间:2010-01-25 03:43:13

标签: delphi

有谁知道如何修改ShellCtrls.pas?实际上我想在资源管理器树的顶部添加一些项目。

例如:

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

或者可能修改此增强树视图:http://delphi.about.com/library/weekly/code/gtrocheckshelltreeview.zip

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

2 个答案:

答案 0 :(得分:1)

嗯,要严格回答您的问题,要修改ShellCtrls.pas,在代码编辑器中打开它,在那里进行所需的更改,然后将其编译到您的应用程序中。

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

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

答案 1 :(得分:1)

我认为您不需要修改来源。库存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;