一个设备管理系统,设备有多种类型,每种类型有多种型号,类型和型号都不确定,
要求能增加设备类型和型号,通过Treeview的拖动改变(包容和并列)关系,最好要有库表的设计说明和程序,(包括节点的编码说明),满意的话可加到500分
要求能增加设备类型和型号,通过Treeview的拖动改变(包容和并列)关系,最好要有库表的设计说明和程序,(包括节点的编码说明),满意的话可加到500分
解决方案 »
- TooButton调用bmp图标的问题
- 求助:如何读取带有分格符的记录中的各个字段
- 请教大家一个超简单的问题
- 如何在COMBOX出现的下拉列表的每项上移动时加入事件代码?并且能知道目前焦点在下拉列表的哪一项上?
- 新手上路:如何将一个窗口切分为三个窗口(如:VC中的切分窗口,每个窗口一个视图)?
- 问一个关于datetimepicker控件的白痴问题
- 如何使用delphi6.0自带的数据库通过sql2000的导入/导出向导,导入sql2000中
- 怎样在Panel上面动态的创建一个控件。谢谢。
- 请帮忙!急需TeeChartPro5.02FullSourceCode!
- 请教delphi + intrabweb 问题
- 在DELPHI中如何具体调用OUTLOOK?
- delphi如何调用有返回值的存储过程?
[email protected]
PMyRecord = ^MyRecord;
MyRecord = record
ID : integer;
Name:string;
ParentID : integer;
end;//end of recordprocedure TfrmKhlxGl.pCreateTreeView(Node:TTreeNode;ParentID:integer;
AtvnViewNode:TTreeView;AadoConnection:TADOConnection;AstrSQL:String;
AImageIndex,ASelectedIndex:Integer;AstrFieldName:String);
var
tmpNode : TTreeNode;
ADOTree : TADOQuery;
p : PMyRecord;
begin
ADOTree := TADOQuery.Create(self);
ADOTree.Connection := AadoConnection;
ADOTree.close;
ADOTree.SQL.clear;
//SELECT lx_bh, lx_mc,lx_parentID FROM ESMDqxlx_1
ADOTree.SQL.Text := AstrSQL+' where '+AstrFieldName +' ='+inttostr(ParentID);
ADOTree.open;
if ADOTree.recordcount > 0 then
begin
ADOTree.First;
while not ADOTree.Eof do
begin
new(p);
p.ID := ADOTree.Fields[0].AsInteger;
p.name :=ADOTree.Fields[1].AsString;
p.ParentID := ADOTree.Fields[2].AsInteger;
tmpNode := AtvnViewNode.Items.AddChildObject(Node,p.name,p);
if AtvnViewNode.Images<>nil then //有图标时设置图标
begin
tmpNode.SelectedIndex := ASelectedIndex; //选中时图标
tmpNode.ImageIndex := AImageIndex; //没选中时图标
end; {== End If ==}
pCreateTreeView(tmpNode,ADOTree.Fields[0].AsInteger,AtvnViewNode,AadoConnection,AstrSQL,16,17,AstrFieldName);
ADOTree.next;
//dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
end;
end;
ADOTree.Free;
end;
drop table [dbo].[ESMDqxlx_1]
GOCREATE TABLE [dbo].[ESMDqxlx_1] (
[lx_bh] [bigint] IDENTITY (1, 1) NOT NULL ,
[lx_mc] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[lx_bz] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[lx_ParentID] [bigint] NULL ,
[lx_jb] [int] NULL
) ON [PRIMARY]
GO
dbTreeCodeTable.active:=false;
cdsCodeTableTree.close;
cdsCodeTableTree.sql.text:='select * from m_codeTable_info order by ct_code';
cdsCodeTableTree.open;
if cdsCodeTableTree.active then
begin
dbTreeCodeTable.Active:=true;
dbTreeCodeTable.FullExpand;
end;
end;
[email protected]
procedure TFrm_wjTree.ShowMsc(Nodex: TTreeNode; Ls_ssds: string; I:integer);
var BscNode,BtsNode,CellNode: array[0..500]of TTreeNode;
MS,BS,BT,CE :Integer;
NewNode: array[0..500]of TTreeNode;
begin
MS:=1;BS:=1;BT:=1;CE:=1;
with AdoQuery1 do
begin
AdoQuery1.close;
AdoQuery1.sql.Clear;
AdoQuery1.sql.Add('select WX_MSCMC from WX_MSCXX where WX_SSDS=:SSDS order by wx_mscmc');
AdoQuery1.Parameters.ParamByName('SSDS').Value:=Ls_ssds;
AdoQuery1.open;
AdoQuery1.first;
while not AdoQuery1.eof do
begin
NewNode[MS]:=TV.Items.AddChild(Nodex,AdoQuery1.FieldByName('WX_MSCMC').AsString);
NewNode[MS].ImageIndex:=1;
begin
with AdoQuery2 do
begin
AdoQuery2.close;
AdoQuery2.sql.Clear;
AdoQuery2.sql.Add('select WX_BSCMC from WX_BSCXX where WX_SSMSC=:SSMSC order by wx_bscmc');
AdoQuery2.Parameters.ParamByName('SSMSC').Value:=AdoQuery1.FieldByName('WX_MSCMC').AsString;
AdoQuery2.Open;
AdoQuery2.First;
while not AdoQuery2.eof do
begin
BscNode[BS]:=TV.Items.AddChild(NewNode[MS],AdoQuery2.FieldByName('WX_BSCMC').AsString);
BscNode[BS].ImageIndex:=1;
begin
with AdoQuery3 do
begin
AdoQuery3.close;
AdoQuery3.sql.Clear;
AdoQuery3.sql.Add('select WX_JZMC from WX_JZXX where WX_GSBSC=:GSBSC order by wx_jzmc');
AdoQuery3.Parameters.ParamByName('GSBSC').Value:=AdoQuery2.FieldByName('WX_BSCMC').AsString;
AdoQuery3.Open;
AdoQuery3.First;
while not AdoQuery3.eof do
begin
BtsNode[BT]:=TV.Items.AddChild(BscNode[BS],AdoQuery3.FieldByName('WX_JZMC').AsString);
BtsNode[BT].ImageIndex:=1;
begin
with AdoQuery4 do
begin
AdoQuery4.close;
AdoQuery4.sql.Clear;
AdoQuery4.sql.Add('select WX_CELLID from WX_JZXQXX WHERE WX_SSBTS=:LS_SSBTS order by wx_cellid');
AdoQuery4.Parameters.ParamByName('LS_SSBTS').Value:=AdoQuery3.FieldByName('WX_JZMC').AsString;
AdoQuery4.Open;
AdoQuery4.First;
while not AdoQuery4.eof do
begin
CellNode[CE]:=TV.Items.AddChild(BtsNode[BT],AdoQuery4.FieldByName('WX_CELLID').AsString);
CellNode[CE].ImageIndex:=1;
AdoQuery4.Next;
//CE:=CE+1;
end;
end;
end;
AdoQuery3.Next;
BT:=BT+1;
end;
end;
end;
AdoQuery2.next;
BS:=BS+1;
end;
end;
end;
AdoQuery1.next;
MS:=MS+1;
end;
end;
end;
procedure TFrm_wjTree.TVDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);var TargetNode,SourceNode:TTreeNode;
begin
TargetNode:=TV.GetNodeAt(X,Y);
if (Source = Sender) and (TargetNode <> nil) and (TargetNode.Level+1=TV.Selected.Level) then
begin
Accept:=true;
SourceNode:=TV.Selected;
while (TargetNode.Parent <> nil) and
(TargetNode <> SourceNode) do
TargetNode :=TargetNode.Parent;
if (TargetNode = SourceNode) and (Trim(SourceNode.Parent.Text)=Trim(TargetNode.Text)) and (Trim(SourceNode.Parent.Parent.Text)=Trim(TargetNode.Text))then
Accept :=False;
end
else
Accept :=False;
end;procedure TFrm_wjTree.TVDragDrop(Sender, Source: TObject; X, Y: Integer);
var TargetNode,SourceNode :TTreeNode;
begin
//TV.BeginDrag(true);
TargetNode:=TV.GetNodeAt(X,Y);
if (TargetNode <> nil) then
begin
try
SourceNode :=TV.Selected;
SourceNode.MoveTo(TargetNode,naAddChildFirst);
case SourceNode.Level of
3:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_mscxx set wx_ssds=:Ls_ssds where wx_mscmc=:Ls_mscmc');
Parameters.ParamByName('Ls_ssds').Value:=Trim(TargetNode.Parent.Text);
Parameters.ParamByName('Ls_mscmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
4:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_bscxx set wx_ssmsc=:Ls_ssmsc where wx_bscmc=:Lx_bscmc');
Parameters.ParamByName('Ls_ssmsc').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Lx_bscmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
5:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_jzxx set wx_gsbsc=:Ls_gsbsc where wx_jzmc=:Ls_jzmc');
Parameters.ParamByName('Ls_gsbsc').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Ls_jzmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
6:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_jzxqxx set wx_ssbts=:Ls_ssbts where wx_cellid=:Ls_cellid');
Parameters.ParamByName('Ls_ssbts').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Ls_cellid').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
end;
TargetNode.Expand(False);
TV.Selected :=TargetNode;
Except;
raise;
end;
end;
比如设备
家用
扳手
钳子
公用
机床
扳手当拖动改变关系的时候,如果拖动的是“扳手”的时候,不能通过 SourceNode.Text
update怎么办?
分析代码表的结构,设计了两种存储的方式.。对于有明显层次结构的基础代码,在实际存储的数据里体现了它们的层次结构。对于没有层次结构的基础代码,也就是简单的二维表存储。表名和列名都遵循中文拼音命名格式,表基本架构如下:
本文只针对有层次结构的表,设计格式如下:字段名 字段类型 字段功能描述
xh integer 唯一的主键,和业务数据没有关系
dm char 体现层次结构的唯一代码
mc char 记录的名称
jb Integer 体现记录在树结构上的层次
xj integer 是否有子节点
bz Char 备注,供用户填写备注的信息
bjdm char 本级别的代码(明码,提供用户输入)
zdydm char 所有上层代码 + 分隔符号 + bjdm
… … 其他的业务数据字段
[email protected]
BPFZ0010002 //备品辅助...但无法体现数据的详细层次关系
自增加序号 自身ID 上级ID 相应级别 自身详细描述 备注这种方式也是可行的,但如果数据量过大会造成资源占用!
update怎么办?你指的是数据库里的更新还是当前树的显示?
procedure TFrm_wjTree.TVDragDrop(Sender, Source: TObject; X, Y: Integer);
var TargetNode,SourceNode :TTreeNode;
begin
//TV.BeginDrag(true);
TargetNode:=TV.GetNodeAt(X,Y);
if (TargetNode <> nil) then
begin
try
SourceNode :=TV.Selected;
SourceNode.MoveTo(TargetNode,naAddChildFirst); // 树更新
case SourceNode.Level of
3:begin //这一下根据拖动情况更新数据库
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_mscxx set wx_ssds=:Ls_ssds where wx_mscmc=:Ls_mscmc');
Parameters.ParamByName('Ls_ssds').Value:=Trim(TargetNode.Parent.Text);
Parameters.ParamByName('Ls_mscmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
4:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_bscxx set wx_ssmsc=:Ls_ssmsc where wx_bscmc=:Lx_bscmc');
Parameters.ParamByName('Ls_ssmsc').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Lx_bscmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
5:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_jzxx set wx_gsbsc=:Ls_gsbsc where wx_jzmc=:Ls_jzmc');
Parameters.ParamByName('Ls_gsbsc').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Ls_jzmc').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
6:begin
with QTreeNodeYD do
begin
close;
sql.Clear;
sql.Add('update wx_jzxqxx set wx_ssbts=:Ls_ssbts where wx_cellid=:Ls_cellid');
Parameters.ParamByName('Ls_ssbts').Value:=Trim(TargetNode.Text);
Parameters.ParamByName('Ls_cellid').Value:=Trim(SourceNode.Text);
ExecSQL;
end;
end;
end;
TargetNode.Expand(False);
TV.Selected :=TargetNode;
Except;
raise;
end;
end;
zyxg(子夜) 见到 zyxg(子夜) 来领分的帖子就进来领分
我另外开帖子给,别的都会给的