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