关于TTreeView的问题

iranjn 2005-12-05 09:43:59
我想实现这样的功能:
->2004销售额
->->2004年1月销售额
.....
->->2004年12月销售额
->2005销售额
->->2005年1月销售额
.....
->->2005年12月销售额
我的代码如下:
ADOQ1.Close;
ADOQ1.SQL.Text := ' select * from CYearMsg order by YearName ';
ADOQ1.Open;
ADOQ1.First;
YCount := ADOQ1.RecordCount;
for i:= 0 to ADOQ1.RecordCount-1 do
begin
TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;
TreeView1.Items[I].ImageIndex := ADOQ1.FieldByName('YearName').AsInteger;
ADOQ1.Next;
end;
ADOQ2.Close;
ADOQ2.SQL.Text := ' select * from CMonthMsg order by MonthName ';
ADOQ2.Open;
ADOQ2.First;
for i:= 0 to ADOQ2.RecordCount-1 do
begin
for j:= 0 to YCount-1 do
if Pos(InttoStr(TreeView1.Items[j].ImageIndex),ADOQ2.FieldByName('MonthName').AsString) >0 then
begin

TreeView1.Items.AddChild(TreeView1.Items[j],ADOQ2.FieldByName('MonthName').AsString+'销售额:'+ADOQ2.FieldByName('MNY').AsString);
end;
ADOQ2.Next;

end;

出来的效果是:

->2004销售额
->->2004年1月销售额
->->->2004年1月
->->->->2004年1月
……
->->->->2005年12月
->->->2004年2月
……
->->->2005年12月



.....
->->2004年12月销售额
->2005销售额
都跑到第一个节点去了,这个根据上面的代码该怎么该才能出现我想要的结果?
...全文
255 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmzgz81 2005-12-06
  • 打赏
  • 举报
回复

这是我照你的要求给的表结构:
create table test (年份表)
(
ID int identity(1,1),
XSyear varchar(20)
)

insert into test (XSyear) values (2004)
insert into test (XSyear) values (2005)

select * from test

create table testlink (月表)
(
ID int identity(1,1),
upID int , (和年表关联)
XSMonth varchar(20)
)

insert into testlink (upID,XSMonth) values (1,'2004-01')
insert into testlink (upID,XSMonth) values (1,'2004-02')
insert into testlink (upID,XSMonth) values (1,'2004-03')
insert into testlink (upID,XSMonth) values (1,'2004-04')
insert into testlink (upID,XSMonth) values (1,'2004-05')
insert into testlink (upID,XSMonth) values (1,'2004-06')
insert into testlink (upID,XSMonth) values (1,'2004-07')
insert into testlink (upID,XSMonth) values (1,'2004-08')
insert into testlink (upID,XSMonth) values (1,'2004-09')
insert into testlink (upID,XSMonth) values (1,'2004-10')
insert into testlink (upID,XSMonth) values (1,'2004-11')
insert into testlink (upID,XSMonth) values (1,'2004-12')

insert into testlink (upID,XSMonth) values (2,'2005-01')
insert into testlink (upID,XSMonth) values (2,'2005-02')
insert into testlink (upID,XSMonth) values (2,'2005-03')
insert into testlink (upID,XSMonth) values (2,'2005-04')
insert into testlink (upID,XSMonth) values (2,'2005-05')
insert into testlink (upID,XSMonth) values (2,'2005-06')
insert into testlink (upID,XSMonth) values (2,'2005-07')
insert into testlink (upID,XSMonth) values (2,'2005-08')
insert into testlink (upID,XSMonth) values (2,'2005-09')
insert into testlink (upID,XSMonth) values (2,'2005-10')
insert into testlink (upID,XSMonth) values (2,'2005-11')
insert into testlink (upID,XSMonth) values (2,'2005-12')

select * from testlink


这是生成树的:
procedure TForm1.Button1Click(Sender: TObject);
var
Qstr,YearStr,MonthStr:String;
p:integer;
node:TTreeNode;
i:integer;
begin
Qstr:='select * from test';
with adoQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(Qstr);
Open;
First;
while not eof do
begin
YearStr:=fieldbyname('XSyear').AsString;
p:=fieldbyname('ID').AsInteger;
node:=treeview1.Items.Add(nil,YearStr);
Qstr:='select * from testlink where upID='+IntToStr(p);
with adoQuery2 do
begin
close;
SQL.Clear;
SQL.add(Qstr);
open;
First;
while not eof do
begin
MonthStr:=fieldbyname('XSMonth').AsString;
TreeView1.Items.AddChild(node,MonthStr);
Next;
end;
end;
Next;
end;
end;
end;
阿三 2005-12-06
  • 打赏
  • 举报
回复
在ado2中忘加了一个next:)
阿三 2005-12-06
  • 打赏
  • 举报
回复
帮你改了一下代码:你试一下,别用ado1.recordcount,这个严重影响速度

procedure TForm1.Button2Click(Sender: TObject);
var
node: TTreeNode;
begin
with adoq1 do
begin
close;
sql.text := 'select * from CYearMsg order by YearName';
open;
end;
while not eof do
begin
node := TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;
node.ImageIndex := ADOQ1.FieldByName('YearName').AsInteger;
with adoquery2 do
begin
close;
sql.text := ' select * from CMonthMsg order by MonthName where yearname ='+ADOQ1.FieldByName('YearName').asstring;
open;
while not eof do
begin
TreeView1.Items.AddChild(node,ADOQ2.FieldByName('MonthName').AsString+'销售额:'+ADOQ2.FieldByName('MNY').AsString);
close;
end;
end;
ADOQ1.Next;
end;


end;
suncheng_hong 2005-12-05
  • 打赏
  • 举报
回复
我给你个例子,希望对你有助:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
TV: TTreeView;
Button1: TButton;
ClientDataSet1: TClientDataSet;
Edt_BH: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
EDT_MC: TEdit;
EDT_SJBH: TEdit;
Button2: TButton;
procedure TVClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
TMyData = ^TNodeData;
TNodeData = record
ID: Integer; //标签
BH: string; //编号
MC: string; //名称
SJBH: string; //上级编号
end;

var
Form1: TForm1;
//procedure TForm1.Button1Click(Sender: TObject);
//function KHSTR(str: string): string;

implementation

uses UDMDATA;

{$R *.dfm}

function KHSTR(str: string): string;
begin
result := '(' + str + ')';
end;

function TreeFill(FTV: Tobject; ID: Integer; TREEDSTNAMESHOW, TREEDSTNAME, TREEDSBHNAME, TREEDSMCNAME, TREEDSSJBHNAME: string): Boolean;
var
TV: TTreeView;
TopNode: TTreeNode;
TempNode: TTreeNode;
MyData: TMyData;
S: array of TMydata;
CDS_Tree: TClientDataset;
I, J, COUNT: Integer;
F: Boolean;
begin
TV := TTreeView(FTV);
TV.Items.Clear;
TV.ReadOnly := True;
TopNode := TV.Items.GetFirstNode;
New(MyData);
MyData^.ID := ID;
MyData^.BH := '';
MyData^.MC := '';
MyData^.SJBH := '';
TopNode := TV.Items.Add(TopNode, TREEDSTNAMEShow);
TopNode.ImageIndex := 0;
TopNode.SelectedIndex := 1;
TopNode.Data := MyData;
try
CDS_Tree := TClientDataset.Create(DMDATA);
CDS_Tree.ProviderName := 'DSP_AQCMD';
CDS_Tree.CommandText := ' SELECT * FROM ' + TREEDSTNAME + ' ORDER BY ' + TREEDSBHNAME;
try
CDS_Tree.Open;
COUNT := 0;
COUNT := CDS_Tree.RecordCount + 1;
if COUNT > 1 then
begin
SetLength(S, COUNT);
CDS_Tree.First;
while not CDS_Tree.Eof do
begin
New(MyData);
MyData^.ID := ID;
MyData^.BH := CDS_Tree.fieldbyname(TREEDSBHNAME).AsString; ;
MyData^.MC := CDS_Tree.fieldbyname(TREEDSMCName).AsString;
MyData^.SJBH := CDS_Tree.fieldbyname(TREEDSSJBHNAME).AsString;

if (MyData^.SJBH = null) or (MyData^.SJBH = '') or (MyData^.SJBH = '0') then
begin
//第二层
TopNode := TV.Items.GetFirstNode;
TempNode := TV.Items.AddChild(TopNode, KHStr(MyData^.BH) + MyData^.MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := MyData;
end
else
begin
//有上级
F := False;
for J := 0 to TV.Items.Count - 1 do
begin
if TMyData(TV.Items[J].data)^.BH = Mydata^.SJBH then
begin
F := True;

TopNode := TV.Items[J];
TempNode := TV.Items.AddChild(TopNode, KHStr(MyData^.BH) + MyData^.MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := MyData;

Break;
end;
end;
if not F then //找不到上级
S[CDS_Tree.RecNo] := Mydata;
end;
CDS_Tree.Next;
end;
end;
except
ShowMessage('打开表出错!');
end;
finally
CDS_Tree.Free;
end;
//处理未加入树的记录
for I := 0 to COUNT - 1 do
begin
if S[I] <> nil then
begin
F := FaLSE;
for J := 0 to TV.Items.Count - 1 do
begin
if TMyData(TV.Items[J].data)^.BH = s[i].SJBH then
begin
F := True;
TopNode := TV.Items[J];
TempNode := TV.Items.AddChild(TopNode, KHStr(s[i].BH) + s[i].MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := s[i];
Break;
end;
end;

if not F then
begin
//加入到第二层
TopNode := TV.Items.GetFirstNode;
TempNode := TV.Items.AddChild(TopNode, KHStr(s[i].BH) + s[i].MC);
TempNode.ImageIndex := 0;
TempNode.SelectedIndex := 1;
TempNode.Data := s[i];
end
end;
end;
TV.FullExpand;
TV.FullCollapse;
end;

procedure TForm1.TVClick(Sender: TObject);
var CZFVALUE: string;
begin
if TV.Selected <> nil then
begin
if TV.Selected.data <> nil then
begin
EDT_BH.Text := TMyData(TV.Selected.data)^.BH;
EDT_MC.Text := TMyData(TV.Selected.data)^.mc;
edt_sjbh.text := TMyData(TV.Selected.data)^.sjBH;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Treefill(TV, 0, '部门档案', 'BMDA', 'BH', 'MC', 'SJBH');
TV.FullExpand;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
EDT_BH.Text := '';
EDT_MC.Text := '';
edt_sjbh.text := '';

end;

procedure TForm1.FormShow(Sender: TObject);
const
FrmConStrA = 'Provider=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database Password="%s";Data Source="%s"';
var constra: string;
begin


ConStrA := Format(FrmConStrA, ['', ExtractFilePath(Application.ExeName) + 'db1.mdb']);
with DMDATA.ADOCON do
begin
close;
ConnectionString := constra;
open;
end;
Treefill(TV, 0, '部门档案', 'BMDA', 'BH', 'MC', 'SJBH');
TV.FullExpand;

end;

end.
iranjn 2005-12-05
  • 打赏
  • 举报
回复
父节点是有了也没有错,但是往每个父节点增加子节点的时候出问题,本来应该加到2005年的都跑到2004年的了
zzq4823 2005-12-05
  • 打赏
  • 举报
回复
AddChild时要指定父节点,可在数据库中设一个字段Flag控制
if (Flag) then //父节点
TreeView1.Items.Add(nil,ADOQ1.FieldByName('YearName').AsString+'年销售额:'+ADOQ1.FieldByName('MNY').AsString) ;
内容概要:本文介绍了基于Matlab代码实现的电力系统机组组合优化调度方法,适用于IEEE14、IEEE30和IEEE118节点标准测试系统。该资源聚焦于电力系统中发电机组的优化调度问题,通过智能优化算法实现对机组启停、出力分配等决策的最优化,旨在降低运行成本、提升系统可靠性和经济性。文中系统阐述了从数学模型构建、多类型约束处理到优化算法设计与仿真实验验证的完整研究流程,并提供了可复现的Matlab代码,涵盖目标函数设定、约束条件建模及算法求解过程,适用于电力系统调度、能源优化等相关领域的科研与教学实践。; 适合人群:具备电力系统分析、运筹学基础及Matlab编程能力的高校学生、科研人员和工程技术人员,尤其适合从事电力系统优化、智能算法应用研究的研究生与青年学者。; 使用场景及目标:①用于电力系统机组组合(UC)问题的教学实验与课程设计;②支撑科研工作中对遗传算法、粒子群算法等智能优化算法在电力系统调度中应用的研究;③为含可再生能源接入的现代电网调度提供仿真平台与技术参考,助力低碳电力系统规划与运行。; 阅读建议:建议读者结合电力系统调度理论与优化建模知识,深入理解机组组合问题的数学本质与物理约束,再通过Matlab代码进行仿真实践,重点关注算法收敛性、多目标权衡策略与不同测试系统间的性能对比,以实现理论与实践的深度融合。
内容概要:本文研究了一种基于TCN-BiGRU-Attention混合神经网络模型的风电功率预测方法,旨在提升预测精度。该模型融合了时间卷积网络(TCN)对局部时序特征的强大提取能力、双向门控循环单元(BiGRU)对时间序列前后依赖关系的双向捕捉能力,以及注意力(Attention)机制对关键时间步特征的自适应加权聚焦能力。研究采用多变量输入方式,综合纳入风速、风向、温度等多种气象因素作为输入特征,实现风电功率的单步预测。通过对实际风电场数据的实验验证,该模型在预测精度方面相较于单一模型或其他组合模型展现出显著优势,有效降低了预测误差。; 适合人群:具备一定机器学习与深度学习基础,从事新能源预测、电力系统调度或相关领域研究的科研人员与工程技术人员。; 使用场景及目标:①应用于风电场功率实时预测,提升电网调度的稳定性与安全性;②为电力市场交易、储能配置和可再生能源消纳提供高精度数据支持;③作为深度学习模型融合设计的参考案例,推动时序预测技术的发展。; 阅读建议:此资源提供了完整的Matlab代码实现,读者在学习时应重点关注模型结构的设计原理、多变量特征的处理方式以及Attention机制的融入方法,建议结合代码进行复现实验,调整参数以深入理解各组件对最终预测性能的影响。
内容概要:本文聚焦于非线性值迭代自适应动态规划(ADP)算法的研究,通过复现Matlab代码深入探讨离散时间非线性系统的策略迭代方法。文章系统阐述了ADP算法的核心原理,重点分析了其在处理非线性系统时的优势与挑战,并详细展示了值迭代与策略迭代在优化控制策略中的具体实现过程。研究强调了通过迭代优化实现系统性能最大化的方法论,同时提供了完整的代码与文档资源,便于读者进行深入学习与实践。; 适合人群:具备一定编程基础,尤其是对Matlab有初步了解的研发人员,以及从事控制理论、自动化、人工智能等领域的研究人员和研究生。; 使用场景及目标:① 为控制理论与自动化领域的研究者提供非线性系统控制策略设计与实现的实用案例;② 为学生和初学者提供学习与理解自适应动态规划算法及其在非线性系统中应用的实践机会;③ 推动相关领域的学术交流与技术进步,激发更多研究者投身于非线性控制系统的研究与优化。; 阅读建议:此资源兼具理论深度与实践指导。建议读者在学习过程中紧密结合理论知识与代码操作,动手实现算法,并通过调整参数或应用场景来深化理解。同时,可参考提供的参考资料,进一步探索自适应动态规划领域的最新研究进展。

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧