procedure TForm3.TreeView1Click(Sender: TObject);begin
edit1.Text :=treeview1.Selected.text;
end;
为什么我选择父节点时,不显示父节点的TEXT,还是显示的子节点的呢,怎么才能点哪个节点得到哪个节点的TEXT和DATA值呢,谢谢大家帮个忙
edit1.Text :=treeview1.Selected.text;
end;
为什么我选择父节点时,不显示父节点的TEXT,还是显示的子节点的呢,怎么才能点哪个节点得到哪个节点的TEXT和DATA值呢,谢谢大家帮个忙
PUser = ^TUser;
TUser = record
name: String;
sex: String;
age: String;
birthdate: String;
end;
private
{ Private declarations }
FUser: PUser;
procedure TForm1.Button1Click(Sender: TObject);
var
vNode: TTreeNode;
begin
Treeview1.Items.Clear;
New(FUser);
FUser.name := 'test01';
FUser.sex := '男';
FUser.age := '18';
FUser.birthdate := '2009-01-01';
vNode := TreeView1.Items.Add(nil,FUser.name);
vNode.Data := FUser;
New(FUser);
FUser.name := 'test02';
FUser.sex := '女';
FUser.age := '18';
FUser.birthdate := '2007-01-01';
vNode := TreeView1.Items.AddChild(vNode,FUser.name);
vNode.Data := FUser;end;procedure TForm1.TreeView1Click(Sender: TObject);
var
vTNode: TTreeNode;
begin
New(FUser);
vTNode := TreeView1.Selected;
FUser := vTNode.Data;
ShowMessage(TreeView1.Selected.Text+'/'+Fuser.age+':'+Fuser.sex);
end;
aaa
cc
dd
bb
bbb
cc
ss
当我第一次选中aaa时,selected.text可以返回aaa,当我选中下面的子节点cc dd bb时,再点击aaa时,selected就不显示aaa了,我看了看aaa的selected.level是1,当我点cc dd bb时,level=2,再点父节点aaa时,level没有变,所以就不能显示aaa了,怎么解决
procedure TForm1.TreeView1Click(Sender: TObject);
var
vTNode: TTreeNode;
begin
New(FUser); //这句是不需要的。
vTNode := TreeView1.Selected;
FUser := vTNode.Data;
ShowMessage(TreeView1.Selected.Text+'/'+Fuser.age+':'+Fuser.sex);
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var
vTNode: TTreeNode;
begin
New(FUser);
vTNode := TreeView1.Selected;
FUser := vTNode.Data;
ShowMessage(TreeView1.Selected.Text+'/'+Fuser^.age+':'+Fuser^.sex);
dispose(FUser);
end;
我直接给TREEVIEW1里写点节点,测试没问题,但程序里面用上面语句生成后就不得行,搞不懂哇
unit Unit3;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShlObj, ComCtrls, StdCtrls;typePTreeViewItem = ^TTreeViewItem;TTreeViewItem = recordParentFolder: IShellFolder; // 接点对应的文件夹的父文件夹的IShellFolder接口Pidl, FullPidl: PItemIDList; // 接点对应的文件夹的相对和绝对项目标识符列表HasExpanded: Boolean; // 接点是否展开end;
TForm3 = class(TForm)
GroupBox1: TGroupBox;
TreeView1: TTreeView;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
Edit3: TEdit;procedure FormDestroy(Sender: TObject);procedure FormCreate(Sender: TObject);procedure TreeView1Expanding(Sender: TObject; Node: TTreeNode;var AllowExpansion: Boolean);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);privateFItemList: TList;procedure SetTreeViewImageList;procedure FillTreeView(Folder: IShellFolder; FullPIDL: PItemIDList; ParentNode: TTreeNode);end;varForm3: TForm3;
showid:boolean;
implementation{$R *.DFM}usesActiveX, ComObj, ShellAPI, CommCtrl;// 以下是几个对项目标识符进行操作的函数procedure DisposePIDL(ID: PItemIDList);varMalloc: IMalloc;beginif ID = nil then Exit;OLECheck(SHGetMalloc(Malloc));Malloc.Free(ID);end;function CopyItemID(ID: PItemIDList): PItemIDList;varMalloc: IMalloc;beginResult := nil;OLECheck(SHGetMalloc(Malloc));if Assigned(ID) thenbeginResult := Malloc.Alloc(ID^.mkid.cb + sizeof(ID^.mkid.cb));CopyMemory(Result, ID, ID^.mkid.cb + sizeof(ID^.mkid.cb));end;end;function NextPIDL(ID: PItemIDList): PItemIDList;beginResult := ID;Inc(PChar(Result), ID^.mkid.cb);end;function GetPIDLSize(ID: PItemIDList): Integer;beginResult := 0;if Assigned(ID) thenbeginResult := sizeof(ID^.mkid.cb);while ID^.mkid.cb <> 0 dobeginInc(Result, ID^.mkid.cb);ID := NextPIDL(ID);end;end;end;function CreatePIDL(Size: Integer): PItemIDList;varMalloc: IMalloc;HR: HResult;beginResult := nil;HR := SHGetMalloc(Malloc);if Failed(HR) then Exit;tryResult := Malloc.Alloc(Size);if Assigned(Result) thenFillChar(Result^, Size, 0);finallyend;end;function ConcatPIDLs(ID1, ID2: PItemIDList): PItemIDList;varcb1, cb2: Integer;beginif Assigned(ID1) thencb1 := GetPIDLSize(ID1) - sizeof(ID1^.mkid.cb)elsecb1 := 0;cb2 := GetPIDLSize(ID2);Result := CreatePIDL(cb1 + cb2);if Assigned(Result) thenbeginif Assigned(ID1) thenCopyMemory(Result, ID1, cb1);
CopyMemory(PChar(Result) + cb1, ID2, cb2);end;end;// 将二进制表示的项目标识符列表转换成有可识的项目名function GetDisplayName(Folder: IShellFolder; PIDL: PItemIDList;ForParsing: Boolean): String;varStrRet: TStrRet;P: PChar;Flags: Integer;beginResult := '';if ForParsing thenFlags := SHGDN_FORPARSINGelseFlags := SHGDN_NORMAL;Folder.GetDisplayNameOf(PIDL, Flags, StrRet);case StrRet.uType ofSTRRET_CSTR:SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));STRRET_OFFSET:beginP := @PIDL.mkid.abID[StrRet.uOffset - sizeof(PIDL.mkid.cb)];SetString(Result, P, PIDL.mkid.cb - StrRet.uOffset);end;STRRET_WSTR:Result := StrRet.pOleStr;end;end;function GetIcon(PIDL: PItemIDList; Open: Boolean): Integer;constIconFlag = SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON;varFileInfo: TSHFileInfo;Flags: Integer;beginif Open thenFlags := IconFlag or SHGFI_OPENICONelseFlags := IconFlag;
SHGetFileInfo(PChar(PIDL), 0, FileInfo, sizeof(TSHFileInfo), Flags);Result := FileInfo.iIcon;end;// 获得每个文件夹在系统中的图标procedure GetItemIcons(FullPIDL: PItemIDList; TreeNode: TTreeNode);beginwith TreeNode dobeginImageIndex := GetIcon(FullPIDL, False);SelectedIndex := GetIcon(FullPIDL, True);end;end;// 获得系统的图标列表procedure TForm3.SetTreeViewImageList;varImageList: THandle;FileInfo: TSHFileInfo;beginImageList := SHGetFileInfo(PChar('C:\'), 0, FileInfo,sizeof(TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);if ImageList <> 0 thenTreeView_SetImageList(TreeView1.Handle, ImageList, 0);end;// 生成文件夹管理树procedure TForm3.FillTreeView(Folder: IShellFolder;FullPIDL: PItemIDList; ParentNode: TTreeNode);varTreeViewItem: PTreeViewItem;EnumIDList: IEnumIDList;PIDLs, FullItemPIDL: PItemIDList;NumID: LongWord;ChildNode: TTreeNode;Attr: Cardinal;begintryOLECheck(Folder.EnumObjects(Handle, SHCONTF_FOLDERS, EnumIDList));while EnumIDList.Next(1, PIDLs, NumID) = S_OK dobeginFullItemPIDL := ConcatPIDLs(FullPIDL, PIDLs);TreeViewItem := New(PTreeViewItem);TreeViewItem.ParentFolder := Folder;TreeViewItem.Pidl := CopyItemID(PIDLs);TreeViewItem.FullPidl := FullItemPIDL;TreeViewItem.HasExpanded := False;FItemList.Add(TreeViewItem);ChildNode := TreeView1.Items.AddChildObject(ParentNode,GetDisplayName(Folder, PIDLs, False), TreeViewItem);GetItemIcons(FullItemPIDL, ChildNode);Attr := SFGAO_HASSUBFOLDER or SFGAO_FOLDER;Folder.GetAttributesOf(1, PIDLs, Attr);if Bool(Attr and (SFGAO_HASSUBFOLDER or SFGAO_FOLDER)) thenif Bool(Attr and SFGAO_FOLDER) thenif Bool(Attr and SFGAO_HASSUBFOLDER) thenChildNode.HasChildren := True;end;except// 你可在此处对异常进行处理end;end;procedure TForm3.FormDestroy(Sender: TObject);varI: Integer;begintryfor I := 0 to FItemList.Count-1 dobeginDisposePIDL(PTreeViewItem(FItemList[i]).PIDL);DisposePIDL(PTreeViewItem(FItemList[i]).FullPIDL);end;FItemList.Clear;FItemList.Free;exceptend;end;procedure TForm3.FormCreate(Sender: TObject);varFolder: IShellFolder;begin
showid:=false;
SetTreeViewImageList;OLECheck(SHGetDesktopFolder(Folder));FItemList := TList.Create;FillTreeView(Folder, nil, nil);end;procedure TForm3.TreeView1Expanding(Sender: TObject; Node: TTreeNode;var AllowExpansion: Boolean);varTVItem: PTreeViewItem;SHFolder: IShellFolder;beginTVItem := PTreeViewItem(Node.Data);if TVItem.HasExpanded then Exit;OLECheck(TVItem.ParentFolder.BindToObject(TVItem^.Pidl,nil, IID_IShellFolder, Pointer(SHFolder)));
FillTreeView(SHFolder, TVItem^.FullPidl, Node);
Node.AlphaSort;
TVItem^.HasExpanded := True;end;procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=cafree;
form3:=nil;
end;procedure TForm3.Button2Click(Sender: TObject);
begin
close;
end;procedure TForm3.Button1Click(Sender: TObject);
begin
showid:=true;
close;
end;procedure TForm3.TreeView1Change(Sender: TObject; Node: TTreeNode);
varTVItem: PTreeViewItem;SHFolder: IShellFolder;beginTVItem := PTreeViewItem(NODE.Data);if TVItem.HasExpanded then Exit;
if copy(GetDisplayName(tvitem.ParentFolder,tvitem^.Pidl ,true),1,2)='::' then
edit1.Text :=node.Text
else
edit1.Text := GetDisplayName(tvitem.ParentFolder,tvitem^.Pidl ,true);
edit3.Text :=inttostr(treeview1.Selected.Level);end;
end.