2010-01-25 118 views

回答

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; 
1

那麼,要嚴格回答你的問題,修改ShellCtrls.pas,你可以在代碼編輯器中打開它,在你想要的地方進行更改,然後將它編譯到你的應用程序中。

但是,我強烈建議不要這樣做。對其進行更改的最佳方法是創建後代組件。這就是OOP世界中事情的完成方式。

因此,而不是修改現有的類,創建一個後代類。

相關問題