procedure TForm3.TreeView1Click(Sender: TObject);begin
edit1.Text :=treeview1.Selected.text;
end;
为什么我选择父节点时,不显示父节点的TEXT,还是显示的子节点的呢,怎么才能点哪个节点得到哪个节点的TEXT和DATA值呢,谢谢大家帮个忙

解决方案 »

  1.   

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

  2.   

    我意思是比如
      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了,怎么解决
      

  3.   

    就比如用鼠标点哪个节点就得到哪个节点的TEXT和DATA。
      

  4.   

    是不是在OnChange事件中处理比较好呢。
      

  5.   

    是不是在OnChange事件中处理比较好呢。
      

  6.   

    另,2楼的代码有错的地方。
    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; 
      

  7.   

    楼上的不要感觉也有问题
    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;
      

  8.   

    我用的是treeview1.item.addchildobject(parentnode,sring,pionter)来增加的,然后在 TForm3.TreeView1Expanding(Sender: TObject; Node: TTreeNode;var AllowExpansion: Boolean);里面增加子节点的内容,是不是这个原因啊
    我直接给TREEVIEW1里写点节点,测试没问题,但程序里面用上面语句生成后就不得行,搞不懂哇
      

  9.   

    我改用onchang也是一样的啊,同级的可以变换,上一级的就不行了,选过就没有了
      

  10.   

    //以下是源码,直接可以运行,你们试试,看看edit.text的变化就知道了
    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.