treeview中记录的查询定位问题:(200分)

  • 主题发起人 主题发起人 LJH1978
  • 开始时间 开始时间
L

LJH1978

Unregistered / Unconfirmed
GUEST, unregistred user!
如:
A单位:
--李三
--李四
--李五
。。。。。
B单位:
--李三娃
--李七
--李八
。。。。。
C单位:
。。。。。。
。。。。。。
当我查找李三时, 选择光标到达李三,当点 下一个 按扭时,选择光标到达 李三娃
应该如何做
难点是TREEVIEW中所有的数据一样显示出来,不光只显示包含李三的记录。
 
1、先装载数据,形成Treeview
2、设置过滤条件选出记录
3、根据记录查找treeview找到对应的结点
 
2、设置过滤条件选出记录
select * from xxxx where field1 like '%李三%',可能查找到包含李三的所有记录,
3、根据记录查找treeview找到对应的结点
这点具体如何做我就不知道了能详细些吗?
 
装载数据时可以将key字段放入ttreenode的data中,下面的程序实现找到相应的分支,
由data可以定位数库中的记录
interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
TreeView1: TTreeView;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
item:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
if treeview1.Items.Count>0 then
begin
if item<>0 then
item:=item+1;
for i:=item to treeview1.Items.Count-1 do
begin
if pos(edit1.Text,treeview1.Items.Item.Text)<>0 then
begin
treeview1.Selected:=treeview1.Items.Item;
treeview1.Items.Item.Expanded:=true;
item:=i;
break;
end;
end;
end;
if i>=treeview1.Items.Count then
begin
treeview1.Selected:=nil;
item:=0;
end;

treeview1.SetFocus;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
item:=0;
end;

end.
 
这个问题很好实现。关键是数据库表结构设计(TREEVIEW数据和TREEVIEW关联)问题。
 
设计好数据库的关系就好了,然后的事情好解决
 
我在一个树表中用以下结构实现了一棵树
create table xxx
(
class int,//级别 可以定义为树根为1
hicod int,//上级编号 树根为0
name char(100),//名称
cod int primary key//本编号
)
create unique index xxx_idx on xxx(class,hicod,name)
 
不会这么难吧,直接在树上查找不是很简单吗?
定义一个全局变量i,记下treenode的index
首先从第一个treenode开始找(index=0,i=0),找到后记下这时的treenode的index(i=index)
下次再从这里开始找,找到树的最后时把i=0,当要找的字符变了的时候i=0就行了,
不用怎么样的数据库设计吧!
 
1表结构能实现treeview中的树
2treeview能定位一条记录
我现在用的这个表结构能实现多层的树
 
这样做试试看能否满意您的要求:

private
{ Private declarations }
i : Integer; //别忘了先定义
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
ss,m,n : integer;
begin
ss := TreeView1.Items.Count;
for m := i+1 to ss-1 do begin
if Pos(Edit1.Text,TreeView1.Items.Item[m].Text)>0 Then begin
TreeView1.Items.Item[m].Selected := True;
i := m;
exit;
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
i := -1;
end;

在Edit1.text值为“李三”,第一次按BUTTON时,光标停在"李三",第二次按光标停在"李三娃"
你根据自己的需要再进行修改,另外需把Treeview1.HideSelected设为False.
 
按楼上仁兄的做法试了试, 还行
不过还有两个问题没有解决:
1 如当找到李三时,TREEVIEW1的李三的值息怎样有蓝色光带表示选中。
2 如有如下记录
李一
李二
李三
查找含‘李’字的
当找到李三时,再按“查找“我的想法是又到李一(第一个记录)
谢谢
 
1。setfocus就行了。
2。第二个问题就简单了,查到树的末尾,再i:=-1就行了。如下:
procedure TForm1.Button1Click(Sender: TObject);
var
ss,m,n : integer;
begin
ss := TreeView1.Items.Count;
for m := i+1 to ss-1 do begin
if Pos(Edit1.Text,TreeView1.Items.Item[m].Text)>0 Then begin
TreeView1.Items.Item[m].Selected := True;
TreeView1.SetFocus;//加上这一句,第一个问题就解决了
i := m;
exit;
end
else //表示没有查到相应记录
i:=-1;//就行了。
end;
end;

 
book523,
说得对
 
多人接受答案了。
 
后退
顶部