如何实现treeview节点随意增加,取出相关节点库中表的信息?(200分)(200分)

W

wsmp3

Unregistered / Unconfirmed
GUEST, unregistred user!
使用1个treeview,2个button按钮,1个edit,1个dbgrid。单击button1增加树节点(edit中的内容),单击button2删除树节点。
实现:1.选中某一节点,单击button1,增加它的子节点,并将节点存入库的一个表中,可以增加任意层。
2.窗体formshow时将treeview的库中所有节点显示出(当然是分了任意层),可以不展开。
3.单击treeview任何一节点,在dbgrid中显示库中另一表中的该节点相关的内容(或者将相关信息存入同一表中)
是否用拓扑结构?如何实现?给一下具体代码,谢谢!
 
那就用DX里面的DBTreeView吧,可以做的到。
 
设计节点表的时候要做成反身关系的,就是有一个id字段,再有一个parent_id字段来
实现关联。
利用TTreeNode的Data属性来保存相关信息。
 
相对来说取很容易,写回去要难点,要全部代码和表结构,请发邮件给我
TREEVIEW很好控制的.
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, Grids, DBGrids, DB, ImgList, Menus, ExtCtrls,
ToolWin;

type
Tfmmain = class(TForm)
tvwzfl: TTreeView;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ImageList1: TImageList;
poptv1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Splitter1: TSplitter;
lvtext: TListView;
Poptv2: TPopupMenu;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
N3: TMenuItem;
ImageList2: TImageList;
ImageList3: TImageList;
CoolBar1: TCoolBar;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton3: TToolButton;
ToolButton4: TToolButton;
DBGrid2: TDBGrid;
ToolButton2: TToolButton;
Button1: TButton;
ComboBox1: TComboBox;
Button2: TButton;
procedure treenew;
procedure listaddtype;
procedure listaddfile;
function inttostrex(num:integer;times:integer;withchar:char):string;
function getfullpath(pathID:Longint):string;
procedure Button1Click(Sender: TObject);
procedure tvwzflChange(Sender: TObject; Node: TTreeNode);
procedure tvwzflEdited(Sender: TObject; Node: TTreeNode;
var S: String);
procedure N1Click(Sender: TObject);
procedure tvwzflMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure MenuItem1Click(Sender: TObject);
procedure MenuItem2Click(Sender: TObject);
procedure lvtextMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure lvtextClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure lvtextDblClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure N2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
fmmain: Tfmmain;
tempnode:array[0..10] of ttreenode;
curx,cury:integer;
curpath:string;
implementation

uses datamodel, editer;

{$R *.dfm}
procedure Tfmmain.treenew;
var
pathlevel:integer;
begin
tvwzfl.Items.Clear;
while not infdata.tbtype.Eof do
begin
pathlevel:=length(infdata.tbtype['typepath']) div 4 -1;
if pathlevel=0 then tempnode[pathlevel]:=nil;
tempnode[pathlevel+1]:=tvwzfl.Items.AddChild(tempnode[pathlevel],infdata.tbtype['typename']);
tempnode[pathlevel+1].SelectedIndex:=1;
infdata.tbtype.next;
end;
end;

procedure Tfmmain.listaddtype;
var
textitem:TListItem;
nodeindex:integer;
begin
lvtext.Items.Clear;
if tvwzfl.Selected.Count=0 then exit;//如所选节点下无子项则退出

for nodeindex:=0 to tvwzfl.Selected.Count-1 do
begin
textitem:=lvtext.Items.Add;
textitem.Caption:=tvwzfl.Selected.Item[nodeindex].Text;
textitem.ImageIndex:=0;
end;
end;

procedure Tfmmain.listaddfile;
var
textfileitem:TListItem;
begin
infdata.qrtext.First;
while not infdata.qrtext.Eof do
begin
textfileitem:=lvtext.Items.Add;
textfileitem.Caption:=infdata.qrtext['texttitle'];
textfileitem.SubItems.Add(inttostr(length(infdata.qrtexttextmemo.Value))+'字节');
textfileitem.SubItems.Add(infdata.qrtextrecdatetime.AsString);
textfileitem.ImageIndex:=1;

infdata.qrtext.Next;
end;


end;

function Tfmmain.inttostrex(num:integer;times:integer;withchar:char):string;
var
i:integer;
begin
result:=inttostr(num);
if length(result)>=times then exit;
times:=times-length(result)-1;
for i:=0 to times do result:=withchar+result;
end;

function Tfmmain.getfullpath(pathID:Longint):string;//通过分类类编号得出分类名的完整路径
var
pathstr:string;
begin
infdata.tbtype.Locate('typeid',pathstr,[loCaseInsensitive]);

end;

procedure Tfmmain.Button1Click(Sender: TObject);
begin

fmtextediter.ShowModal;
end;

procedure Tfmmain.tvwzflChange(Sender: TObject; Node: TTreeNode);
var
i:integer;
pathtxt:string;
findnode:ttreenode;
begin
//定位类别中的记录使与用户在TREEVIEW中所选择同步
pathtxt:='';
findnode:=tvwzfl.Selected;
for i:=tvwzfl.Selected.Level downto 0 do
begin
pathtxt:=inttostrex(findnode.Index,4,'0')+pathtxt;
findnode:=findnode.Parent;
end;
infdata.tbtype.Locate('typepath',pathtxt,[loCaseInsensitive]);
//对文章表里进行过滤只需要属于当前类的文章
infdata.qrtext.Close;
infdata.qrtext.SQL.Clear;
infdata.qrtext.SQL.add('select * from textinfo where texttype='+inttostr(infdata.tbtype['typeid']));
infdata.qrtext.Open;
//为listview增加项目
listaddtype;
listaddfile;
end;

procedure Tfmmain.tvwzflEdited(Sender: TObject; Node: TTreeNode;
var S: String);
begin
infdata.tbtype.Edit;
infdata.tbtype['typename']:=S;
infdata.tbtype.Post;
end;

procedure Tfmmain.N1Click(Sender: TObject);
begin
//tvwzfl.Selected.EditText;
button1.Caption:=tvwzfl.Selected.GetLastChild.Text;
end;

procedure Tfmmain.tvwzflMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
curnode:ttreenode;
begin
curnode:=tvwzfl.GetNodeAt(x,y);
if curnode<>nil then
begin
if button=mbright then
begin
curnode.Selected:=true;
poptv1.Popup(x+fmmain.Left,y+fmmain.Top+coolbar1.Height);
end
end
else
begin
if button=mbright then poptv2.Popup(x+fmmain.Left,y+fmmain.Top+coolbar1.Height);
end;



end;

procedure Tfmmain.MenuItem1Click(Sender: TObject);
begin
tvwzfl.FullExpand;
end;

procedure Tfmmain.MenuItem2Click(Sender: TObject);
begin
tvwzfl.FullCollapse;
end;


procedure Tfmmain.lvtextMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
curx:=x;
cury:=y;
end;

procedure Tfmmain.lvtextClick(Sender: TObject);
begin
if lvtext.GetItemAt(curx,cury)<>nil then button1.Caption:='有'
else
button1.Caption:='wu';
end;

procedure Tfmmain.FormShow(Sender: TObject);
begin
fmmain.treenew;
end;

procedure Tfmmain.ComboBox1Change(Sender: TObject);
begin
if combobox1.Text='1' then lvtext.ViewStyle:=vsSmallIcon;
if combobox1.Text='2' then lvtext.ViewStyle:=vsIcon;
if combobox1.Text='3' then lvtext.ViewStyle:=vslist;
if combobox1.Text='4' then lvtext.ViewStyle:=vsreport;
end;

procedure Tfmmain.lvtextDblClick(Sender: TObject);
var
lvindex:integer;
begin
if lvtext.Selected=nil then exit;
if lvtext.Selected.ImageIndex=0 then
begin
lvindex:=lvtext.Selected.Index;
tvwzfl.Selected.Item[lvindex].Selected:=true;
end
else
begin
fmtextediter.ShowModal;
end;

end;

procedure Tfmmain.Button2Click(Sender: TObject);
begin
tvwzfl.Selected.MoveTo(tvwzfl.Selected.GetNext ,naadd);
end;

procedure Tfmmain.N2Click(Sender: TObject);
begin
tvwzfl.Selected.MoveTo(tvwzfl.Selected.GetNext ,naadd);
end;
end.


重要的是表结构的设计,要的话发邮件到我信箱我用的是ACCESS的
理论上可以无限制为TREEVIEW增加层次. 发信到 firemonk@sina.com
 
在加一点,读数据库到TREEVIEW上这上面的这个过程
上面还有些其他的代码,如加数据库的资料到LISTVIEW里
TREEBVIEW刷新过程 只有简单几句,
procedure Tfmmain.treenew;
var
pathlevel:integer;
begin
tvwzfl.Items.Clear;
while not infdata.tbtype.Eof do//如果数据库的表未到结尾那么进入此循环
begin
pathlevel:=length(infdata.tbtype['typepath']) div 4 -1;//得出将要增加的节点路径层次等级
if pathlevel=0 then tempnode[pathlevel]:=nil;//假如将要增加的节点路径层次是在根层的话,那么就让其父节点为空
tempnode[pathlevel+1]:=tvwzfl.Items.AddChild(tempnode[pathlevel],infdata.tbtype['typename']);//向TREEVIEW增加项目
tempnode[pathlevel+1].SelectedIndex:=1;指定所增加项目在TREEVIEW所显示的图标
infdata.tbtype.next;让表指针下移一位
end;
end;
看了表结构你就明白了
tbtype的内容如下
TYPEID typepath typename
1 0000 计算机知识
2 0001 笑话
3 0002 经文
4 0003 游戏
5 0004 小说、杂文
6 00020000 佛教经文
7 00020001 道教经文
8 00020002 其他经文
9 0005 诗词歌赋
10 00000000 应用软件知识
11 00000001 操作系统知识
12 00000002 编程知识
13 000000020000 DELPHI
14 000000020001 VB
15 000000020002 C++ BULIDER
16 000000020003 POWER BULIDER
17 0000000200000000 数据库
18 0000000200000001 系统相关
19 0000000200000002 图形图象
重要的是TYPEPATH
14 000000020001 VB
就表示 根节点下的0号节点下的2号节点下的1号节点,我以4位STRING来表示一个节点
pathlevel:=length(infdata.tbtype['typepath']) div 4 -1;//得出将要增加的节点路径层次等级
这句语句比如将000000020001代入就得到2,表示其有两层为何要减1是因为TREEVIEW的规则
是以0开始.
 
使用递归函数很容易实现
 
多人接受答案了。
 
顶部