一个ShellTreeView和一个ShellListView连接,实现对本地文件的访问
但是如果ShellListView的AutoRefresh为true的话,运行点击ShellListView
中的“我的电脑”,再双击其中一个硬盘盘符,就抛出EAccessViolation异常。只好将ShellListView的AutoRefresh设为false,然后再指定的操作后自行
ShellListView.Refresh 才能实现List中的刷新。不知是否有更好的解决方法。如果ShellTreeView的AutoRefresh为true,一开始访问TreeView中的节点,例如双击ShellTreeView中的“我的电脑”,再双击其中一个硬盘盘符,  等等 类似的操作
然后关闭程序,就会抛出EAccessViolation异常,程序使用正常,但是关闭时候抛出异常让人很不爽。将ShellTreeView的AutoRefresh设置为false,加入如下操作procedure TForm1.ShellTreeView1Click(Sender: TObject);
begin
  if ShellTreeView1.SelectedFolder.IsFolder then
    ShellTreeView1.Refresh(ShellTreeView1.Selected);
end;这时候能够实现单击ShellTreeView中item时候刷新点中的节点。不过如果单击
光盘之前的一个分区(硬盘)的图标,就会提示“请将磁盘插入XX:”
也就是刷新了光盘的item 如何才能解决这个问题。控件的AutoRefresh属性本来给予了我们很大的方便,但是却出现这么多问题。。
让本菜鸟迷惑不已,请求高手给于解决方法

解决方案 »

  1.   

    怀疑是不是刷新的时候是刷了之前一个index的item
    或者是连续刷了两个TTreeNode,用下面代码可以避免
    单击光盘之前的一个分区(硬盘)的图标,就会提示“请将磁盘插入XX:”
    的情况,不过遇到单击某个分区第一的文件夹的时候出错:无效的index,
    所以硬是这样实现刷新:if ShellTreeView1.Selected.Index-1 >=0 then
      ShellTreeView1.Refresh(ShellTreeView1.Items.Item[ShellTreeView1.Selected.Index-1]);
    但是要兜这么大一个圈,实在不太懂。忘高手指点AutoRefresh属性的问题。谢