lisongmagic高手,lisongmagic高手,lisongmagic高手,lisongmagic高手 帮人帮到底吧 ( 积分: 100 )

  • 主题发起人 主题发起人 xx6620063
  • 开始时间 开始时间
X

xx6620063

Unregistered / Unconfirmed
GUEST, unregistred user!
你的给代码我试了,速度快.但全部是上下级关系,没有同级关系的,我要的效果是:
hh省
cc县
ii乡
PP乡
bb县
oo乡
UU乡


我初学,能一并发个完整给我好吗? xx6620063@163.com
 
我在你昨晚的那个帖子上又回答你了;埃,还是把它再贴上吧

把TreeView1.Items.AddNode(nil,TreeView1.Selected,info.P_Name,info,naAddChild);中的 naAddChild 改为 naAdd 就行了;
你可以做两个菜单: 一个是"添加节点",一个是"添加子节点";
 
我初步看了一下,感觉代码不会出现那种问题,可能是你数据库反映父子关系字段的编码数据
有问题;
我现在在公司,等晚上回去再说
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
TreeView1: TTreeView;
ADOQuery1: TADOQuery;
PopupMenu1: TPopupMenu;
Add: TMenuItem;
Edit: TMenuItem;
Delete: TMenuItem;
refresh: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure AddClick(Sender: TObject);
private
{ Private declarations }
public
function GetParentNode(P_Id: string): TTreeNode;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
TInfo = record
P_Name: string[32];
ID: string[32];
P_Id: string[32];
end;
PInfo = ^TInfo;


procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
close;
sql.Text:= 'select * from treeTable order by P_ID,ID';
open;
end;
end;

function TForm1.GetParentNode(P_Id: string): TTreeNode;
var
i: integer;
begin
Result:= nil;
for i:= 0 to TreeView1.Items.Count -1 do
begin
if PInfo(TreeView1.Items.Data).P_Id = P_Id then
Result:= TreeView1.Items;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);

var
aTreeNode: TTreeNode;
Info: PInfo; //用此变量去封装树节点的data属性



begin
New(info); //开指针内存
TreeView1.Items.BeginUpdate;//防止树频繁刷新
TreeView1.Items.Clear; //初始化

try
with ADOQuery1 do
begin
first;
while not Eof do
begin
Info.P_Id:= FieldByName('P_ID').AsString;
Info.Id:= FieldByName('ID').AsString;
Info.P_Name:= FieldByName('P_Name').AsString;

aTreeNode:= GetParentNode(FieldByName('P_Id').AsString);
if aTreeNode = nil then
begin
TreeView1.Items.AddNode(nil,nil,info.P_Name,info,naAddChild);
end
else
begin
TreeView1.Items.AddNode(nil,aTreeNode,info.P_Name,info,naAddChild);
end;
next;
end;
end;
finally
dispose(info);//释放指针内存
end;
TreeView1.Items.EndUpdate; //beginUpdate - endUpdate 配对使用
TreeView1.FullExpand;//展开整个树
end;

procedure TForm1.AddClick(Sender: TObject);
var
Info: PInfo; //用此变量去封装树节点的data属性
begin
new(info);

try
if TreeView1.Selected <> nil then
begin
info.P_Name:= 'new node';
info.P_Id:= pinfo(TreeView1.Selected.Data).ID;
//info.Id:= ...这由你自己的子节点编码规则生成相应的编码

TreeView1.Items.AddNode(nil,TreeView1.Selected,info.P_Name,info,naAddChild);
//保存到数据库的部分你自己完成
end;
finally
dispose(info);
end;
end;

end.

//我改了不行 数据如下:
ID P_ID P_name all_name
52 0 贵州省 贵州省
5227 52 贵阳市 贵州省贵阳市
522729 5227 惠水县 贵州省贵阳市惠水县
522728 5227 罗甸县 贵州省贵阳市罗甸县
52272901 522729 好花乡 贵州省贵阳市惠水县好花乡
52272902 522729 长田乡 贵州省贵阳市惠水县长田乡

显示 贵州省
-贵阳市
-惠水县
-好花乡
-长田乡
-罗甸县
 
晕倒,显示部分一个递归生成树不就可以了吗
 
我试用别的人递归方法,可有好几千条记录,太慢了,楼上有好的方法吗?能不能贴出来看看?
 
楼主,不好意思,是我代码的问题,
你再试试:(把以前的buttonclick替换掉)
procedure TForm1.Button1Click(Sender: TObject);

var
aTreeNode: TTreeNode;
Info: PInfo; //用此变量去封装树节点的data属性

begin
TreeView1.Items.BeginUpdate;//防止树频繁刷新
TreeView1.Items.Clear; //初始化

with ADOQuery1 do
begin
first;
while not Eof do
begin
New(info); //开指针内存
Info.P_Id:= FieldByName('P_ID').AsString;
Info.Id:= FieldByName('ID').AsString;
Info.P_Name:= FieldByName('P_Name').AsString;

aTreeNode:= GetParentNode(FieldByName('P_Id').AsString);
if aTreeNode = nil then
begin
TreeView1.Items.AddNode(nil,nil,info.P_Name,info,naAddChild);
end
else
begin
TreeView1.Items.AddNode(nil,aTreeNode,info.P_Name,info,naAddChild);
end;
next;
end;
end;

TreeView1.Items.EndUpdate; //beginUpdate - endUpdate 配对使用
TreeView1.FullExpand;//展开整个树
end;
 
修改后代码:在我机上已运行ok的

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
TreeView1: TTreeView;
ADOQuery1: TADOQuery;
PopupMenu1: TPopupMenu;
Add: TMenuItem;
Edit: TMenuItem;
Delete: TMenuItem;
refresh: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure AddClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
function GetParentNode(P_Id: string): TTreeNode;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

type
TInfo = record
P_Name: string[32];
ID: string[32];
P_Id: string[32];
end;
PInfo = ^TInfo;


procedure TForm1.FormCreate(Sender: TObject);
begin
with ADOQuery1 do
begin
close;
sql.Text:= 'select * from treeTable order by P_ID,ID';
open;
end;
end;

function TForm1.GetParentNode(P_Id: string): TTreeNode;
var
i: integer;
begin
Result:= nil;
for i:= 0 to TreeView1.Items.Count -1 do
begin
if PInfo(TreeView1.Items.Item.Data).ID = P_Id then
Result:= TreeView1.Items.Item;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);

var
aTreeNode: TTreeNode;
Info: PInfo; //用此变量去封装树节点的data属性

begin
TreeView1.Items.BeginUpdate;//防止树频繁刷新
TreeView1.Items.Clear; //初始化

with ADOQuery1 do
begin
first;
while not Eof do
begin
New(info); //开指针内存
Info.P_Id:= FieldByName('P_ID').AsString;
Info.Id:= FieldByName('ID').AsString;
Info.P_Name:= FieldByName('P_Name').AsString;

aTreeNode:= GetParentNode(FieldByName('P_Id').AsString);
if aTreeNode = nil then
begin
TreeView1.Items.AddNode(nil,nil,info.P_Name,info,naAddChild);
end
else
begin
TreeView1.Items.AddNode(nil,aTreeNode,info.P_Name,info,naAddChild);
end;
next;
end;
end;

TreeView1.Items.EndUpdate; //beginUpdate - endUpdate 配对使用
TreeView1.FullExpand;//展开整个树
end;

procedure TForm1.AddClick(Sender: TObject);
var
Info: PInfo; //用此变量去封装树节点的data属性
begin
new(info);

try
if TreeView1.Selected <> nil then
begin
info.P_Name:= 'new node';
info.P_Id:= pinfo(TreeView1.Selected.Data).ID;
//info.Id:= ...这由你自己的子节点编码规则生成相应的编码

TreeView1.Items.AddNode(nil,TreeView1.Selected,info.P_Name,info,naAddChild);
end;
finally
//dispose(info);
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i: integer;
begin
for i:= 0 to TreeView1.Items.Count-1 do
dispose(pinfo(TreeView1.Items.Item.Data)); //释放new()所开的内存
end;

end.
 
老大,我已测试可以了有点慢,2000条记录用在P42.5 512上用20秒,我太菜了,你看能不能把添加,修改,删除补一下,太感谢了.
 
一下取两千条不慢才怪,你试过的别人的方法大概要多长时间?
一下子显示2000条记录,有必要吗,设计的好像有点问题,
也可以先取出第一层,然后用户点击的时候再去取似乎更好点,
就像微软的资源管理器一样,一层一层给你展开。

至于什么添加,修改,还要删除等等,我看你就别折腾人了,
公司现在挺忙的;再说你自己应该去
研究研究,学习学习,这样才有长进,我想你也应该有这个能力搞定那些问题。
 
加分了,还是谢了,
 
后退
顶部