用TreeView对数据表操作,点击相应节点,实现添加,删除等功能 快点啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 问题详细点啊,表是什么结构,想对应成怎样的treeview;一般思路是:简单点的话,让treeview的treenode.data 指向表中数据的 ID;面向对象的话,用对象把表一封装,让treeview的treenode.data 指向一个对象; TTreeView的详细用法,http://www.cnblogs.com/del/category/127351.html另外D7有自带的Demo [code=Delphi(Pascal)]unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Menus;type TAInfo = class private FID: integer; FPId: integer; FName: String; public constructor Create ; overload ; constructor Create(id:integer; pId :integer; name :String ) ; overload ; public property ID :integer read FID write FID ; property PId :integer read FPId write FPId ; property Name :String read FName write FName ; end; TForm1 = class(TForm) tv1: TTreeView; pm1: TPopupMenu; N1: TMenuItem; procedure FormCreate(Sender: TObject); procedure N1Click(Sender: TObject); procedure tv1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);var Node :TTreeNode ; info :TAInfo ;begin tv1.Items.BeginUpdate ; tv1.Items.Clear ; tv1.Items.EndUpdate ; info := TAInfo.Create(1,0,'开发部'); Node := tv1.Items.Add(nil, info.Name) ; //1 Node.Data := info ; //2 // 1和2 可以用下面语句代替// Node := tv1.Items.AddObject(nil, info.Name, info) ;end;{ TAInfo }constructor TAInfo.Create;begin self.FID := 0 ; self.FPId := -1 ; self.FName := '' ;end;constructor TAInfo.Create(id, pId: integer; name: String);begin self.FID := id ; self.FPId := pId ; self.FName := name ;end;procedure TForm1.N1Click(Sender: TObject); function getPNodeCount(): integer ;//得到根节点数 var i:integer ; cnt :integer ; begin cnt := 0 ; for i := 0 to tv1.Items.Count -1 do begin if (tv1.Items.Item[i].Level = 0 ) then begin cnt := cnt + 1 ; end; end; Result := cnt ; end;var Node :TTreeNode ; id , pId :integer ; info ,addInfo :TAInfo ;begin if tv1.Selected <> nil then //有选中节点 begin info := TAInfo(tv1.Selected.Data) ; addInfo := TAInfo.Create ; addInfo.ID := tv1.Selected.Count+1 ; addInfo.PId := info.ID ;//增加的节点的PID应该为选中的节点ID addInfo.Name := tv1.Selected.Text + '_' + IntToStr(addInfo.ID) ; Node := tv1.Items.AddChild(tv1.Selected, addInfo.Name) ; //1 Node.Data := addInfo ; //2 // 1和2 可以用下面语句代替 // Node := tv1.Items.AddChildObject(tv1.Selected, addInfo.Name, addInfo) ; end //没有选中节点,则增加根目录 else begin //因为没有实际数据,所以写了一个getPNodeCount id := getPNodeCount() ; addInfo := TAInfo.Create(id, 0 , '新增_' + IntToStr(id)); Node := tv1.Items.Add(nil, addInfo.Name) ; //1 Node.Data := addInfo ; //2 // 1和2 可以用下面语句代替 // Node := tv1.Items.AddObject(nil, addInfo.Name, addInfo) ; end;end;procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var s_dir: string; node: TTreeNode;begin if Button = mbRight then begin tv1.Selected := tv1.GetNodeAt(X, Y); //确保在需要添加子节点的节点上面右键 end;end ;end.[code] 求教,小弟现用CHART图表控件制作图表,后将结果导出为WMF图片文件,但CHART标题栏由汉字变成了问号,不解,在此求教! Help me?Delphi+Access数据库更新的问题? 我跟XX不得不说的故事之:我跟SciTE不得不说的故事。 XP下做的程序在98下面窗口显示不正确,怎么办?在线等! 声卡发声问题 treeview问题 memo里无法换行 对要打印的数据条目该怎么控制 斑竹你难道真的不能同意吗?我已经发表了一次贴子,看看java版的计划把都放到标题上来了 可以这样传数据吗? 软件打包问题求助 寻求帮助EXCEL和STRINGGRID
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Menus;type
TAInfo = class
private
FID: integer;
FPId: integer;
FName: String;
public
constructor Create ; overload ;
constructor Create(id:integer; pId :integer; name :String ) ; overload ; public
property ID :integer read FID write FID ;
property PId :integer read FPId write FPId ;
property Name :String read FName write FName ;
end;
TForm1 = class(TForm)
tv1: TTreeView;
pm1: TPopupMenu;
N1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure tv1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var
Node :TTreeNode ;
info :TAInfo ;
begin
tv1.Items.BeginUpdate ;
tv1.Items.Clear ; tv1.Items.EndUpdate ;
info := TAInfo.Create(1,0,'开发部');
Node := tv1.Items.Add(nil, info.Name) ; //1
Node.Data := info ; //2
// 1和2 可以用下面语句代替
// Node := tv1.Items.AddObject(nil, info.Name, info) ;end;{ TAInfo }constructor TAInfo.Create;
begin
self.FID := 0 ;
self.FPId := -1 ;
self.FName := '' ;
end;constructor TAInfo.Create(id, pId: integer; name: String);
begin
self.FID := id ;
self.FPId := pId ;
self.FName := name ;
end;procedure TForm1.N1Click(Sender: TObject);
function getPNodeCount(): integer ;//得到根节点数
var
i:integer ;
cnt :integer ;
begin
cnt := 0 ;
for i := 0 to tv1.Items.Count -1 do
begin
if (tv1.Items.Item[i].Level = 0 ) then
begin
cnt := cnt + 1 ;
end;
end; Result := cnt ;
end;
var
Node :TTreeNode ;
id , pId :integer ;
info ,addInfo :TAInfo ;begin
if tv1.Selected <> nil then //有选中节点
begin
info := TAInfo(tv1.Selected.Data) ;
addInfo := TAInfo.Create ;
addInfo.ID := tv1.Selected.Count+1 ;
addInfo.PId := info.ID ;//增加的节点的PID应该为选中的节点ID
addInfo.Name := tv1.Selected.Text + '_' + IntToStr(addInfo.ID) ;
Node := tv1.Items.AddChild(tv1.Selected, addInfo.Name) ; //1
Node.Data := addInfo ; //2
// 1和2 可以用下面语句代替
// Node := tv1.Items.AddChildObject(tv1.Selected, addInfo.Name, addInfo) ;
end //没有选中节点,则增加根目录
else
begin
//因为没有实际数据,所以写了一个getPNodeCount
id := getPNodeCount() ;
addInfo := TAInfo.Create(id, 0 , '新增_' + IntToStr(id));
Node := tv1.Items.Add(nil, addInfo.Name) ; //1
Node.Data := addInfo ; //2
// 1和2 可以用下面语句代替
// Node := tv1.Items.AddObject(nil, addInfo.Name, addInfo) ;
end;
end;procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
s_dir: string;
node: TTreeNode;
begin
if Button = mbRight then
begin tv1.Selected := tv1.GetNodeAt(X, Y); //确保在需要添加子节点的节点上面右键 end;
end ;end.[code]