用DBChart 如何动态生成曲线

cpu 2009-09-26 08:45:55
数据表GTest
typea daya ssa
---------------------------------
101 1 0.20
101 2 0.60
101 3 0.63
101 4 0.89
101 5 0.71
102 1 0.36
102 3 1.00
102 4 0.96
102 5 0.56

用如下程序DBCHART没有生成曲线,请教各位,如何处理?谢谢
我用的是delphi7+TeeChar7

var
qrytmp,qrytmpg:TAdoQuery;
sqlstr:string;
myseries:TLineSeries;
begin
qrytmp:=TAdoQuery.Create(self);
qrytmp.Connection:=mains.ADOConnection1;
qrytmpg:=TAdoQuery.Create(self);
qrytmpg.Connection:=mains.ADOConnection1;
sqlstr:='select distinct typea from GTest';
qrytmp.Close;
qrytmp.SQL.Clear;
qrytmp.sql.Add(sqlstr);
try
qrytmp.Open;
except
showmessage('处理数据出现错误');
exit;
end;
while not qrytmp.Eof do
begin
sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';
qrytmpg.Close;
qrytmpg.SQL.Clear;
qrytmpg.SQL.Add(sqlstr);
qrytmpg.Open;
if qrytmpg.RecordCount>0 then
begin
myseries:=TLineSeries.Create(self);
myseries.DataSource:=qrytmpg;
myseries.XLabelsSource:='daya';
myseries.XValues.ValueSource:='daya';
myseries.YValues.ValueSource:='ssa';
myseries.CheckDataSource;
myseries.Repaint;
DBChart1.AddSeries(myseries);
end;
qrytmp.Next;
end;
DBChart1.Refresh;
end;
...全文
428 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qthl004 2012-08-01
  • 打赏
  • 举报
回复
楼主找的是这个么????


DbNetList是一个综合功能的列表选择组件,作为动态HTML(DHTML)实现。运用DbNetList,你可以快速为自己的web页面添加数据库驱动的列表、下拉式列表(drop-down)、树型和复选框列表。DbNetList兼容最流行的各种数据库服务器,包括:SQL Server、Oracle和Informix。

具体功能:

生成列表、多列列表、下拉式列表(drop-down)、树型列表、复选框列表...
提供ASP 和 ASP.NET的本地版本。
基于浏览器。无论何处均可设计和运行。无需客户端安装。无需Java。纯DHTML。
完全封装的组件。轻松与任一web页面整合。
生成稳健的基于web的应用程序。
支持大量数据库,包括:SQL Server、 MSDE、 Oracle、 Sybase、 DB2、 MySQL、 Access、 Visual Fox Pro、 InterSystems Caché、 Informix 等,还有更多。
完全可以自定义配置。
DbNetList特别为拓展微软IE家族浏览器的性能而设计,你的客户端将需要IE 5.0或更高版本。实际上,只需几行代码,就把一个DbNetList包含到了你的应用程序。甚至通常复杂的结构,比如嵌套的树状列表,也仅仅需要几行代码就可以实现:
DbNetList包含了所有这些强大的、额外的功能
列表中附加的隐藏数据项目,可以被获取、作为每一个行/节点的属性存储并可以通过程序操作。
通过selectData()方法发出ad-hoc数据库询问。
"按需"扩展的树型列表 - 管理大型嵌套目录,无需在顶层预先载入整个结构。
自动完成 - 当定焦在DbNetList时,键入一串字符,第一个匹配行将自动高亮。



wooden954 2009-09-27
  • 打赏
  • 举报
回复
完整的解决方案(已测试)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
StdCtrls;

type
TMains = class(TForm)
DBChart1: TDBChart;
ADOConnection1: TADOConnection;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
//在这里定义数据集对象
qrytmp:TAdoQuery;
qrytmpg:Array of TADOQuery; //改为动态数组,这个数组需要是全局的,以便在正确的位置释放

public
{ Public declarations }
end;

var
Mains: TMains;

implementation

{$R *.dfm}

procedure TMains.Button1Click(Sender: TObject);
var
DataSetIdx,i:Integer;
sqlstr:string;
myseries:TLineSeries;
begin
if Not Assigned(qrytmp) then //判断对象qrytmp是否已创建,如果没有创建,则创建实例
begin
qrytmp:=TADOQuery.Create(self);
qryTmp.Connection:=mains.ADOConnection1;
end;
sqlstr:='select distinct typea from GTest';
qrytmp.Close;
qrytmp.SQL.Clear;
qrytmp.sql.Add(sqlstr);
try
qrytmp.Open;
except
showmessage('处理数据出现错误');
exit;
end;

while not qrytmp.Eof do
begin
//调整动态数组个数
if qrytmp.RecNo>Length(qrytmpg) then
begin
DataSetIdx:=Length(qrytmpg);
SetLength(qrytmpg,DataSetIdx+1);
end
else
begin
DataSetIdx:=qrytmp.RecNo-1;
end;
//判断本数据集对象是否创建
if Not Assigned(qrytmpg[DataSetIdx]) then //判断对象qrytmp是否已创建,如果没有创建,则创建实例
begin
qrytmpg[DataSetIdx]:=TADOQuery.Create(self);
qrytmpg[DataSetIdx].Connection:=mains.ADOConnection1;
end;
sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';

qrytmpg[DataSetIdx].Close;
qrytmpg[DataSetIdx].SQL.Clear;
qrytmpg[DataSetIdx].SQL.Add(sqlstr);
qrytmpg[DataSetIdx].Open;
if qrytmpg[DataSetIdx].RecordCount>0 then
begin
myseries:=TLineSeries.Create(self);
DBChart1.AddSeries(myseries); //将这行语句放在这里
myseries.DataSource:=qrytmpg[DataSetIdx];
myseries.XLabelsSource:='daya';
myseries.XValues.ValueSource:='daya';
myseries.YValues.ValueSource:='ssa';
myseries.CheckDataSource;
myseries.Repaint;
//DBChart1.AddSeries(myseries); //这行语句需要移动到上面
end;
qrytmp.Next;
end;
DBChart1.Refresh;
end;

procedure TMains.FormDestroy(Sender: TObject);
var
i:Integer;
begin
qrytmp.Close;
qrytmp.Free;

for i:=0 to Length(qrytmpg)-1 do
begin
qrytmpg[i].Close;
qrytmpg[i].Free;
end;
end;

end.

wooden954 2009-09-27
  • 打赏
  • 举报
回复
有一语句的位置楼主写错了,在执行过程中会出错,导致例外之后语句就不执行了,所以不能显示数据
另外:楼主的算法有问题,只能显示最后一组曲线(因为在分类之后你只有一个数据集),应该每条曲线对应一个数据集,即应该使用动态对象数组

var
qrytmp:TAdoQuery;
qrytmpg:Array of TADOQuery; //改为动态数组,这个数组需要是全局的,以便在正确的位置释放
DataSetLen:Integer;
sqlstr:string;
myseries:TLineSeries;
begin
qrytmp:=TAdoQuery.Create(self);
qrytmp.Connection:=mains.ADOConnection1;
//qrytmpg:=TAdoQuery.Create(self);
//qrytmpg.Connection:=mains.ADOConnection1;
sqlstr:='select distinct typea from GTest';
qrytmp.Close;
qrytmp.SQL.Clear;
qrytmp.sql.Add(sqlstr);
try
qrytmp.Open;
except
showmessage('处理数据出现错误');
exit;
end;
while not qrytmp.Eof do
begin
sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';
DataSetLen:=Length(qrytmpg);
Setlength(qrytmpg,DataSetLen+1);

qrytmpg[DataSetLen]:=TAdoQuery.Create(self); //在这里创建曲线数据集对象
qrytmpg[DataSetLen].Connection:=mains.ADOConnection1; //
qrytmpg[DataSetLen].Close;
qrytmpg[DataSetLen].SQL.Clear;
qrytmpg[DataSetLen].SQL.Add(sqlstr);
qrytmpg[DataSetLen].Open;
if qrytmpg[DataSetLen].RecordCount>0 then
begin
myseries:=TLineSeries.Create(self);
DBChart1.AddSeries(myseries); //将这行语句放在这里
myseries.DataSource:=qrytmpg[DataSetLen];
myseries.XLabelsSource:='daya';
myseries.XValues.ValueSource:='daya';
myseries.YValues.ValueSource:='ssa';
myseries.CheckDataSource;
myseries.Repaint;
//DBChart1.AddSeries(myseries); //这行语句需要移动到上面
end;
qrytmp.Next;
end;
DBChart1.Refresh;


bdmh 2009-09-27
  • 打赏
  • 举报
回复
直接在属性中绑定数据集(代码也行)
另外你的代码问题很大,在 while循环中又对qrytmp进行重新的sql打开,没出问题,算你幸运
当然,如果不绑定数据集,可以循环数据集,然后将值填充到chart
DBChart1.SeriesList[0].AddXY(),还有很多类似Add的方法,都可以动态填充数值
wxsan 2009-09-27
  • 打赏
  • 举报
回复
绑定数据集,设置好行、列应该就可以了

5,939

社区成员

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

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