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
to:tonylk 我并没有看到你写的程序
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)); 跟它原来的有什么不同,哪句是不让程序去读软驱的,请详细解释一下,不好意思,我是菜鸟 谢谢
设置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多久升星了,帮我一把吧
我在http://wosens.com的“资源”里面怎么找不到你说的修改后的TShellTreeView的代码
如果你有,请发一份到
谢谢!
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
我并没有看到你写的程序
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));
跟它原来的有什么不同,哪句是不让程序去读软驱的,请详细解释一下,不好意思,我是菜鸟
谢谢
http://www.tonixsoft.com/index.php?mmenu_id=4&smenu_id=0005
谢谢赐教!我想再问你一个问题,就是如何将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多久升星了,帮我一把吧
行,我一共只有240分,你要多少?
你能告诉我邮箱或者QQ号码吗
邮箱:[email protected]
或到:www.tonixsoft.com 可以找我,
好久不用qq了,呵呵。。