【问题标题】:Adding custom items to an TShellTreeView将自定义项添加到 TShellTreeView
【发布时间】:2010-01-26 10:34:47
【问题描述】:

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

例如:

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

或者也许修改这个增强的树视图:http://delphi.about.com/library/weekly/code/gtrocheckshelltreeview.zip

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

【问题讨论】:

    标签: delphi


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-13
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多