财管家 首页
当前位置:主页>delphi7/进销存和数据库> 文章内容

Tchart控件的动态添加series的问题

发布时间:2011-01-04 | QQ免费站
1楼: 我要做一组对比曲线,横坐标为时间段,纵坐标为产量值,但根据选择区块个数来动态添加series,使每一条曲线,代表不同区块相同时间段内的产量值曲线,如何添加series?

2楼: 不同区块,什么意思?是多坐标吗?

3楼: to yostgxf
不同区块是指油田用的词,也就是产量是和区块挂沟的,不同区块的产量是不一样的,我要对比是同一时间段内不同区块产量情况,你只要告诉我在Tchart控件进里怎样动态添加series就可以了。

4楼: var
Series2: TFastLineSeries;

procedure TForm1.Button1Click(Sender: TObject);
begin
Series2 := TFastLineSeries.Create(Self);
Series2.ParentChart := Chart1;
end;
就行了,是这个意思吗

5楼: to yostgxf
我不知道你是实现什么功能的,但我要的是:
series1.clear;
seres2.clear;
......
有几个区块加几个series,区块的个数是动态变化的,就可以了

6楼: 差不多这个意思吧
mySeries: array of TFastLineSeries;

procedure TForm1.Button1Click(Sender: TObject);
var i, k, n: integer;
begin
n := 5; //现在要的个数
k := Length(mySeries); //原来的个数
if k > n then
begin
for i := k - 1 downto n do
begin
mySeries[i].Free;
end;
SetLength(mySeries, n);
end else
begin
SetLength(mySeries, n);
for i := k to n-1 do
begin
mySeries[i] := TFastLineSeries.Create(Self);
mySeries[i].ParentChart := Chart1;
end;
end;
end;

7楼: 上面是动态产生Series的数量,如果知道最多数,一次产生中间不显示也可以
Series1.Active := False; //不显示

8楼: 还有问题嘛,等你五分钟,我准备去休息了

9楼: to_yostgxf
谢谢,我明天回单位试一下,成功了,马上结贴。

10楼: [:)]晚安

11楼: to_yostgxf
这个代码,错在哪里,请帮看一下:

procedure Tcysdqx_F.Button1Click(Sender: TObject);
var
mySeries: array of TFastLineSeries;
myny,myqk,str:string;
i,k,n: integer;
begin
for i:=0 to listbox1.Items.Count - 1 do myqk:=myqk+''''+','+''''+listbox1.Items[i];
for i:=0 to listbox4.Items.Count - 1 do myny:=myny+''''+','+''''+listbox4.Items[i];
str:='select qkdydm,cysd,ny from cysdb where qkdydm in('+''''+myqk+''''+') and ny in('+''''+myny+''''+') order by ny';
//str:='select qkdydm,cysd,ny from cysdb where ny in('+''''+myny+''''+') order by ny';
edit1.text:=str;
ADOQ_qkcysd.SQL.Clear;
ADOQ_qkcysd.SQL.Add(str);
ADOQ_qkcysd.open ;
if ADOQ_qkcysd.RecordCount=0 then
showmessage('所查区块或时间采油速度没计算!')
else
begin
// myseries[1].Clear ;
// myseries[2].Clear;

n := ADOQ_qkcysd.RecordCount; //现在要的个数
k := Length(mySeries); //原来的个数
if k > n then
begin
for i := k - 1 downto n do mySeries[i].Free;
SetLength(mySeries, n);
end else
begin
SetLength(mySeries, n);
for i := k to n-1 do

begin
mySeries[i] := TFastLineSeries.Create(Self);
mySeries[i].ParentChart := Chart1;
// myseries[i].Clear;

end;


end;




i:=1;
while not ADOQ_qkcysd.Eof do
begin
myseries[i].Clear;
myseries[i].Add(ADOQ_qkcysd.FieldValues['cysd'],ADOQ_qkcysd.FieldValues['ny'], clTeeColor );
i:=i+1;
ADOQ_qkcysd.Next ;
end;
end;
ADOQ_qkcysd.Close ;

end;如 管家婆免费软件可打印报

12楼: i:=1;//改为i:=0; 动态数组的下标从0开始
while not ADOQ_qkcysd.Eof do
begin
myseries[i].Clear;
myseries[i].Add(ADOQ_qkcysd.FieldValues['cysd'],ADOQ_qkcysd.FieldValues['ny'], clTeeColor );
i:=i+1;
ADOQ_qkcysd.Next ;
end;

13楼: var
mySeries: array of TFastLineSeries; //变量不能在这里定义,至少是类的私有变量

14楼: to_yostgxf
把变量改为i:=0后,程序不出错,但是图型不是我要的结果,不知道怎么设。
你有QQ吗?
我想给你发静态曲线我做出来的图,跟动态曲线做来的图做一下比较,差在哪里?

15楼: 我不知道你用什么图形,我给的例子是TFastLineSeries。你修改变量就行了
[:)],好像你对chart一点不熟悉耶

16楼: to yostgxf
不好意思,让你见笑了,我的确对delphi的绘图不熟悉,但是我用的也是TFastLineSeries,不过,我用静态做出来的曲线跟动态做出来的曲线的确不太一样,可能是属性设置有问题,不管怎么样,真得太谢谢你了。

17楼: 呵呵,应该不会不同的。你把变量定义的位置修改了没有。我现在很少用QQ之类的东西

18楼: 不知道你说的什么不同,hongxing_dl724@163.com

19楼: to yostgxf
你的代码是对的,变量定义位置也没有问题,只是我的算法有问题,导致结果不一样,这是我用了半天时间,修改出来的正确结果,我把它发布出来,希望以后有需要的人,仅共参考。

procedure Tcysdqx_F.Button1Click(Sender: TObject);
var
mySeries: array of TFastLineSeries;
myny,str,myqk:string;
i,k,n,j,m: integer;
begin
myqk:='';
n := listbox1.Items.Count; //现在要的个数
k := Length(mySeries); //原来的个数
if k > n then
begin
for i := k - 1 downto n do mySeries[i].Free;
SetLength(mySeries, n);
end else
begin


SetLength(mySeries, n);
for i := k to n-1 do
begin
mySeries[i] := TFastLineSeries.Create(Self);
mySeries[i].ParentChart := Chart1;
end;
end;
for m:=0 to listbox1.Items.Count - 1 do
begin
myqk:= listbox1.items[m];
myseries[m].Clear;
for j:=0 to listbox4.Items.Count - 1 do myny:=myny+''''+','+''''+listbox4.Items[j];
str:='select cysd,ny from cysdb where qkdydm='+''''+myqk+''''+' and ny in('+''''+myny+''''+') order by ny';
ADOQ_qkcysd.SQL.Clear;
ADOQ_qkcysd.SQL.Add(str);
ADOQ_qkcysd.open ;
if ADOQ_qkcysd.RecordCount=0 then
showmessage('所查区块或时间采油速度没计算!')
else
begin
while not ADOQ_qkcysd.Eof do
begin
chart1.BottomAxis.Axis.Width:=4;
myseries[m].Marks.BackColor := clTeal;
myseries[m].Marks.Font.Charset := DEFAULT_CHARSET;
myseries[m].Marks.Font.Color := clWhite;
myseries[m].Marks.Font.Height := -11;
myseries[m].Marks.Font.Name := 'Arial';
myseries[m].Marks.Font.Style := [fsBold];
myseries[m].LinePen.Width := 3;
myseries[m].Marks.ArrowLength := 8;
// myseries[m].Marks.BackColor := clTeal;
myseries[m].Marks.Visible:=true;
myseries[m].Marks.Style := smsValue;
// myseries[m].LinePen.Color := clRed;
myseries[m].Add(ADOQ_qkcysd.FieldValues['cysd'],ADOQ_qkcysd.FieldValues['ny'], clTeeColor );

ADOQ_qkcysd.Next ;
end;
myseries[m].Title:=listbox1.Items.Strings[m];
ADOQ_qkcysd.Close ;
end;
end;
end;

20楼: 接受答案了.