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 将自定义项添加到TShellTreeView_Delphi - Fatal编程技术网

Delphi 将自定义项添加到TShellTreeView

Delphi 将自定义项添加到TShellTreeView,delphi,Delphi,有人知道如何修改ShellCtrls.pas吗?实际上,我想在浏览器树的顶部添加一些项目 例如: -myitem -miitemtoo -mycomputer -c: -d: 或者修改此增强的树状视图: 但是我认为ShellCtrls是需要修改的主文件。好吧,严格地回答您的问题,要修改ShellCtrls.pas,您可以在代码编辑器中打开它,在那里进行所需的更改,然后将其编译到您的应用程序中 但是,我强烈建议不要这样做。对其进行更改的最佳方法是创建子体组件。这就是OOP世界中的工作方式

有人知道如何修改ShellCtrls.pas吗?实际上,我想在浏览器树的顶部添加一些项目

例如:

-myitem    
-miitemtoo
-mycomputer
-c:
-d:
或者修改此增强的树状视图:


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

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

但是,我强烈建议不要这样做。对其进行更改的最佳方法是创建子体组件。这就是OOP世界中的工作方式


因此,与其修改现有类,不如创建一个子类。

我认为您不需要修改源代码。股票TShellTreeView是TCustomTreeView的后代,因此您可以像在树视图中一样添加项目

下面的代码没有经过充分的考虑或测试,但它可能会帮助您开始。它在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;
使用
shlobj、activex、shellapi;
函数InsertToSTV(STV:TShellTreeView;Pos:Integer;
路径,显示名称:字符串):布尔值;
变量
ShellFolderInterface,NodeShellFolder:IShellFolder;
ItemIDList:PItemIDList;
炭黑,属性:乌龙;
wPath:PWideChar;
节点:TTreeNode;
FileInfo:TSHFileInfo;
开始
结果:=假;
如果(SHGetDesktopFolder(ShellFolderInterface)=无错误),则开始
wPath:=StringToOleStr(路径);
如果wPath为nil,则
尝试
如果ShellFolderInterface.ParseDisplayName(0,nil,wPath,CharsParsed,
ItemIDList,Attributes)=没有错误
ShellFolderInterface.BindToObject(ItemIDList,nil,IID_IShellFolder,
NodeShellFolder);
节点:=STV.Items.Insert(STV.Items[Pos],DisplayName);
Node.Data:=TShellFolder.Create(nil,ItemIDList,NodeShellFolder);
如果STV.UseShellImages未分配(STV.Images),则开始
SHGetFileInfo(PChar(ItemIDList),0,
文件信息,
SizeOf(文件信息),
SHGFI_PIDL或SHGFI_系统索引);
Node.ImageIndex:=FileInfo.iIcon;
SHGetFileInfo(PChar(ItemIDList),0,
文件信息,
SizeOf(文件信息),
SHGFI_PIDL或SHGFI_系统图标索引或SHGFI_OPENICON);
Node.SelectedIndex:=FileInfo.iIcon;
结束;
最后
SysFreeString(wPath);
结束;
结束;
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
插入电视(ShellTreeView1,
0,
ExtractFilePath(Application.ExeName),
ExtractFileName(Application.ExeName));
结束;