我已经编译修改了 TShellTreeView 代码,给大家共享出来在我的网站上“资源”里面,由于网站用的是免费空间,如果不能登录请尝试不同的时间。http://wosens.com

解决方案 »

  1.   

    to:amei2000go 
    我在http://wosens.com的“资源”里面怎么找不到你说的修改后的TShellTreeView的代码
    如果你有,请发一份到
    谢谢!
      

  2.   

    procedure TCustomShellTreeView.InitNode(NewNode: TTreeNode; ID: PItemIDList; ParentNode: TTreeNode);
    var
      CanAdd: Boolean;
      NewFolder: IShellFolder;
      AFolder: TShellFolder;
    begin
      AFolder := TShellFolder(ParentNode.Data);
      NewFolder := GetIShellFolder(AFolder.ShellFolder, ID);
      NewNode.Data := TShellFolder.Create(AFolder, ID, NewFolder);
      with TShellFolder(NewNode.Data) do
      begin
        NewNode.Text := DisplayName;
        if FUseShellImages and not Assigned(Images) then
        begin
          NewNode.ImageIndex := GetShellImage(AbsoluteID, False, False);
          NewNode.SelectedIndex := GetShellImage(AbsoluteID, False, True);
        end;
        if NewNode.SelectedIndex = 0 then NewNode.SelectedIndex := NewNode.ImageIndex;
        //to**************
        if NewNode.Level<=2 then begin
          NewNode.HasChildren:=true;
        end
        else begin
          NewNode.HasChildren := SubFolders;
          if fpShared in Properties then NewNode.OverlayIndex := 0;
        end;
        if (otNonFolders in ObjectTypes) and (ShellFolder <> nil) then
          NewNode.HasChildren := GetHasSubItems(ShellFolder, ObjectFlags(FObjectTypes));
      end;  CanAdd := True;
      if Assigned(FOnAddFolder) then FOnAddFolder(Self, TShellFolder(NewNode.Data), CanAdd);
      if not CanAdd then
        NewNode.Delete;
    end;我用它做的一个程序:
    http://www.tonixsoft.com/index.php?mmenu_id=3&smenu_id=0005
      

  3.   

    to:tonylk
    我并没有看到你写的程序
      

  4.   

    tonylk,你可不可以解释一下你写的
        if NewNode.Level<=2 then begin
          NewNode.HasChildren:=true;
        end
        else begin
          NewNode.HasChildren := SubFolders;
          if fpShared in Properties then NewNode.OverlayIndex := 0;
        end;
        if (otNonFolders in ObjectTypes) and (ShellFolder <> nil) then
          NewNode.HasChildren := GetHasSubItems(ShellFolder, ObjectFlags  (FObjectTypes));
    跟它原来的有什么不同,哪句是不让程序去读软驱的,请详细解释一下,不好意思,我是菜鸟
    谢谢
      

  5.   

    地址改过了,是:
    http://www.tonixsoft.com/index.php?mmenu_id=4&smenu_id=0005
      

  6.   

    原先的控件在建立所有节点时都会调用SubFolders()来判断该节点下有没有子节点,这个函数会去读取当前目录下有无子目录,当要判断的目录是软驱时这就必然会引起对软驱的读操作。我做的改动为,当所添加的节点小于第二层时(NewNode.Level<=2,0层为桌面,1层为我的电脑,网络邻居等,2层就为软驱硬盘的a盘,c盘等),设置NewNode.HasChildren:=true;就让这个节点不去判断文件夹下是否有子文件夹,直接显示一个展开的+号,这样就可以避免软驱的读写,而当你点击这个+号时,程序还是会去判断是否有子目录,这个时候才去读取软驱,并且当读取失败时,会自动将+号去除。这样改后和原控件唯一的区别就是:原控件在加载后,如果软驱下没有目录,就根本不会显示+号,而修改的控件,必须等点击了加号后才去判断软驱下有无文件夹。我也想过,通过盘符,调函数判断这个盘符是否floopydisk,但是其实那样只有麻烦,所以直接用节点的level来判断了。
      

  7.   

    to:tonylk
    谢谢赐教!我想再问你一个问题,就是如何将ShellTreeView的当前目录设置为你所指定的目录,我看过其他人发的一些帖子,都没有真正的解决这个问题,如果你有办法,请你跟我详细的讲讲!
      

  8.   

    设置shelltreeview的当前目录,当时我首先想到的办法就是直接用:
    ShellTreeView.Path:=xx;
    来做,可是当我把这段代码用到我的程序后出现访问错误,原因好像和我设置完路径后需要动态删除和建立一些控件有关。后来,我用发送消息的办法来解决了:
    procedure TBrowseForm.ComboBoxPathSelect(Sender: TObject);
    begin
      if Assigned(FFileTreeViewForm) then begin
        FFileTreeViewForm.ChangeFolder(ComboBoxPath.Text);
      end;
    end;
    //当在combox中选择一个路径后,设置treeview中的path为这个路径,接着,程序跑到这里:procedure TFileTreeViewForm.ChangeFolder(AFolderName:String);
    begin
      //*******************************************************************************
      //!!) i have to use a message instead of change the treeview's path directly,
      //cause that will cause some exception when the ThumbFileView remove controls.
      FNewFolderName:=AFolderName;
      PostMessage(Handle,WM_CHANGEFOLDER,0,0);
    end;
    //自定义的一个方法,它不直接改filetreeview的path,而是先记录欲设置的path,并发送消息。const
      WM_CHANGEFOLDER = WM_USER+501;type
      TFileTreeViewForm = class (TForm)
      private
        procedure OnWMChangeFolder(var Message:TMsg);message WM_CHANGEFOLDER;
      ....
      end;procedure TFileTreeViewForm.OnWMChangeFolder(var Message:TMsg);
    var
      FolderTmp:String;
    begin
      FolderTmp:=FNewFolderName;
      if (ExtractFileName(FolderTmp)='..') then begin
        FolderTmp:=Copy(FolderTmp,1,LastDelimiter('\',FolderTmp)-1);
        FolderTmp:=Copy(FolderTmp,1,LastDelimiter('\',FolderTmp));
      end;
      ShellTreeView.Path:=FolderTmp;
      if (ShellTreeView.Selected<>nil) then
        ShellTreeView.Selected.MakeVisible;
    end;
    //真正设置FileTreeView的path。这个不时什么好方法,应该有更可靠的方法吧,但是在我的程序里我就是这么干的,反正它能用了。另:to  vitamin99(狼口一只羊) 
    再开个贴给我加点分怎么样,我还差100多久升星了,帮我一把吧
      

  9.   

    to:tonylk
    行,我一共只有240分,你要多少?
    你能告诉我邮箱或者QQ号码吗
      

  10.   

    那给我100吧,
    邮箱:[email protected]
    或到:www.tonixsoft.com 可以找我,
    好久不用qq了,呵呵。。