你想要多少分呀??
树显示我已经做好了!可选取树型中的内容怎样得到它的Test1_id,因为edit.txt中的内容需要以Test1_id为条件进行检索。我想的是需要有一个变量保存Test1_id的内容。PB的TV控件中有一个data变量用来保存数据,可以解决这个问题。不知delphi有没有这种变量。如果没有应该怎样解决呀。很急呀!!!
树显示我已经做好了!可选取树型中的内容怎样得到它的Test1_id,因为edit.txt中的内容需要以Test1_id为条件进行检索。我想的是需要有一个变量保存Test1_id的内容。PB的TV控件中有一个data变量用来保存数据,可以解决这个问题。不知delphi有没有这种变量。如果没有应该怎样解决呀。很急呀!!!
利用data的例子The following code defines a record type of TMyRec and a record pointer type of PMyRec.type
PMyRec = ^TMyRec;
TMyRec = record
FName: string;
LName: string;
end;Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of a specified node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.procedure TForm1.Button1Click(Sender: TObject);var
MyRecPtr: PMyRec;
TreeViewIndex: LongInt;
begin
New(MyRecPtr);
MyRecPtr^.FName := Edit1.Text;
MyRecPtr^.LName := Edit2.Text;
TreeViewIndex := StrToInt(Edit3.Text);
with TreeView1 do
begin
if Items.Count = 0 then
Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
end;
end;After an item containing a TMyRec record has been added, the following code retrieves the FName and LName values associated with the item and displays the values in a label.procedure TForm1.Button2Click(Sender: TObject);begin
Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
PMyRec(TreeView1.Selected.Data)^.LName;
end;
implementation
uses unit1;
{$R *.dfm}type
PMyRecord = ^MyRecord;
MyRecord = record
department_id:string;
department_name:string;
end;var
p:PMyRecord;procedure TForm4.TvCreate();
var
k,j:Integer;
TNode,TNode_Root:TTreeNode;
Begin
new(p);
ADOTable1.Active:=False;
ADOTable1.Active:=True;
ADOQuery2.Active:=False;
ADOTable1.Open;
TreeView1.Items.Clear;
TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
For k:=1 To ADOTable1.RecordCount Do
Begin
p.department_id:=ADOTable1.FieldByName('department_id').AsString;
p.department_name:=ADOTable1.FieldByName('department_name').AsString;
TNode:=Treeview1.Items.AddChildObject(TNode_Root,p.department_name,p);
ADOTable1.Next;
End;
ADOQuery2.Active:=False;
End;作出来的达不到我需要效果呀!点击选取的值是最后一个的department_id呀!而我需要点那个出来那个的department_id值。
就是你先把Test1(表1)的所有的Test1_age这个字段的值加到treeview中去
然后执行语句选出Test2(表2)的所有的纪录 这个时候开始通过判断表2的现在的数据的Test1_id这个字段的值可以获得在表1的Test1_age 这个字段的值的
然后就开始在表1for i:=0 to treeview1.items.count 寻找这个字段的位置的
定义一个ttreeview类的变量node
if treeview1.Items.Item[i].Text=(你开始的时候获得在表1的Test1_age )得值的话
就node=treeview1.Items.Item[i]
然后再 treeview1.Items.AddChild(node,你的表2的Test2_name这个字段得值)
就可以实现你的功能了
删除的时候就直接 treeview1.Selected.Delete就可以了
但是你要更新你的treeview1的就可以了呵呵 我没有什么好的办法 不知道你看明白了没有的
procedure TForm4.TvCreate();
var
k,j:Integer;
TNode,TNode_Root:TTreeNode;
Begin
ADOTable1.Active:=True;
ADOTable1.Open;
TreeView1.Items.Clear;
TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
ADOTable1.First;
For k:=1 To ADOTable1.RecordCount Do
Begin
TNode:=TreeView1.Items.AddChild(TNode_Root,ADOTable1.FieldValues['department_name']);
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('Select * From worker');
ADOQuery2.SQL.Add('Where work_department=:aStr ORDER BY work_name;');
ADOQuery2.Parameters.ParamByName('aStr').Value:=Trim(ADOTable1.FieldValues['department_id']);
ADOQuery2.Active:=True;
ADOQuery2.Open;
For j:=1 To ADOQuery2.RecordCount Do
Begin
TreeView1.Items.AddChild(TNode,ADOQuery2.FieldValues['work_name']);
ADOQuery2.Next;
End;
}
ADOTable1.Next;
End;
ADOQuery2.Active:=False;
End;
如果是的话有两点问题:
一:效率太低。要作到点选后再出来下一级,这样的话下一级检索时需要一个上一级的参数。这参数怎么传递.我想的是以Test1_id为参数来获取Test2中的数据.
二:点击TV树后EDIT中要显示数据,而数据检索时也需要条件。如果取Test2_name的话,就存在一个问题,Test2_name中的内容是可修改的,所以行不通,只能取Test2_id.现在的问题是我怎样在加入TV树时也加入Test1_id,Test2_id,并且在点击Test1_age,Test2_name时获得相应的Test1_id,Test2_id的值,并以此为条件来检索数据。
procedure TForm1.FormShow(Sender: TObject);
var
TreeNodeProvince,TreeNodeCity : TTreeNode;
NodeDataRecPtr : PNodeDataRec;
RegAdmiCode,Temp : String;
begin
TreeView1.Items.Clear;
//TreeNodeProvince := nil;
//TreeNodeCity := nil;
with Query1 do
begin
Close;
SQL.Clear;
SQL.Text := 'select * from Admipartition order by ADMIPARTITIONNO asc';
try
Open;
except
Close;
Exit;
end;
//----^ if not (bof and eof) then
begin
First;
while Not eof do
begin
Temp := fieldbyname('AdmipartitionNo').AsString; if Copy(fieldbyname('AdmipartitionNo').AsString,3,4) = '0000' then
begin
New(NodeDataRecPtr);
NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
TreeNodeProvince := TreeView1.Items.AddObject(nil,FieldByName('ADMIPARTITIONNAME').AsString +
'' + FieldByName('ADMIPARTITIONNO').AsString,NodeDataRecPtr); // TreeNodeProvince := TreeView1.Items.Add(nil,FieldByName('ADMIPARTITIONNAME').AsString
// );
end
else
if Copy(FieldByName('ADMIPARTITIONNO').AsString,5,2) = '00' then
begin
New(NodeDataRecPtr);
NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
TreeNodeCity := TreeView1.Items.AddChildObject(TreeNodeProvince,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr);
end
else
begin
New(NodeDataRecPtr);
NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNo').AsString;
TreeView1.Items.AddChildObject(TreeNodeCity,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr); end;
Next;
end;
end;
end;
TreeView1.SetFocus;
TreeView1Click(Self);
end;
》》》》》回复人: hzxrh(好猫咪) ( ) 信誉:100 2003-12-20 18:00:00 得分:0
代码如下:
implementation
uses unit1;
{$R *.dfm}type
PMyRecord = ^MyRecord;
MyRecord = record
department_id:string;
department_name:string;
end;var
p:PMyRecord;procedure TForm4.TvCreate();
var
k,j:Integer;
TNode,TNode_Root:TTreeNode;
Begin
new(p);
ADOTable1.Active:=False;
ADOTable1.Active:=True;
ADOQuery2.Active:=False;
ADOTable1.Open;
TreeView1.Items.Clear;
TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
For k:=1 To ADOTable1.RecordCount Do
Begin
p.department_id:=ADOTable1.FieldByName('department_id').AsString;
p.department_name:=ADOTable1.FieldByName('department_name').AsString;
TNode:=Treeview1.Items.AddChildObject(TNode_Root,p.department_name,p);
ADOTable1.Next;
End;
ADOQuery2.Active:=False;
End;》》》》作出来的达不到我需要效果呀!点击选取的值是最后一个的department_id呀!而我需要点那个出来那个的department_id值。
把New(P)移动到循环体内就可以了,不过需要注意的是,指针释放必须手动进行,建议用指针数组。