有谁知道如何修改ShellCtrls.pas?实际上我想在资源管理器树的顶部添加一些项目。
例如:
-myitem
-miitemtoo
-mycomputer
-c:
-d:
或者可能修改此增强树视图:http://delphi.about.com/library/weekly/code/gtrocheckshelltreeview.zip
但我认为ShellCtrls是要修改的主要文件。
答案 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;