关于使用TChart控件画曲线的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 jinms
  • 开始时间 开始时间
J

jinms

Unregistered / Unconfirmed
GUEST, unregistred user!
现在想做一个采集四块表数据的工控软件,主窗口有四个TChart控件,运行时四个TChart控件的图型都在变化,现在用户想双击某一个图型,就新建一个窗口显示这个TChart控件的图型,
此时,主窗口这个TChart控件显示的图型,和这个新建的窗口中的TChart控件中的图型是完全一致的,并且同步发生变化,请问该怎能么搞,各位高人给个思路,
我的想法是主窗口和新建的窗口共用相同的Series,但不知道可不可行,也不知如何做,请大家给个思路,先谢了
 
现在想做一个采集四块表数据的工控软件,主窗口有四个TChart控件,运行时四个TChart控件的图型都在变化,现在用户想双击某一个图型,就新建一个窗口显示这个TChart控件的图型,
此时,主窗口这个TChart控件显示的图型,和这个新建的窗口中的TChart控件中的图型是完全一致的,并且同步发生变化,请问该怎能么搞,各位高人给个思路,
我的想法是主窗口和新建的窗口共用相同的Series,但不知道可不可行,也不知如何做,请大家给个思路,先谢了
 
正要用TChart,还在学习阶段,帮顶,顺便学习
 
我正在 用 ExpressFlowChart 从数据库中查询节点 来话流程图,TMD 都写了一个星期了
 
“主窗口这个TChart控件显示的图型,和这个新建的窗口中的TChart控件中的图型是完全一致的,并且同步发生变化”
因为在两个Form中,所以可以将Chart,Series命名完全一样,这样你可以将数据刷新的部分用函数实现,函数的参数是:Form,Chart,Series,新增加的数据,这样在刷新时两个同时刷新了.
 
TO:ax518598
刷新可以这样,但是在用户未双击TChart控件时,主窗口是先有数据,新建的窗口是后打开的,这时新建的窗口中TChart控件也要有主窗口上的全部数据,当然先前的那部分数据可以从数据库中调出来,
我问这个问题主要是想看看还有没有其它方法,使两个窗口中的TChart控件中的内容完全相同,即:
主窗口.TChart1=新建窗口.TChart1
 
如果是从数据库中提出的数据,那你用DBChart很容易实现了,你在设计时将两个DBChart设计得一样,双击时再显示新建的窗口就行了,DBChart自动会刷新的,你只管给数据库中加数据就可以了,因为这样可以不考虑给Chart加数据了,如果仍要用Chart,可以考虑用个文本文件做Chart的数据源,也是可以实现的(不过这个我只是以前见过一个例子,自己没实现过)
 
是这样的,我的程序是实时采集数据,先把采到的数据存在一个数组中,每当数据满了,或到了一个时间(如每隔3分钟保存一次数据),这样,新建的窗口中的TChart控件中的数据就是数据库中的数据 + 当前数组中的数据,而主窗口中的TChart控件显示的是全部的数据,我想请教的是有没有什么办法使得
主窗口.TChart1=新建窗口.TChart1
变得更简单些呢,或者有什么更好的方法实现我想在两个窗口中同步显示实时和历史数据呢
 
series1为主窗体(form1)上Chart1的Seiies
procedure TForm1.Chart1AfterDraw(Sender: TObject);
var
i:integer;
Series2: TFastLineSeries;
begin
if not assigned(form2) then
exit;
for i:=0 to form2.chart2.SeriesCount-1 do
form2.chart2.Series.Free;
series2:=TFastLineSeries.Create(nil);
series2.Assign(series1);
form2.chart2.AddSeries(series2);
end;
 
TO:hb_wshsh大侠,
谢谢回复,待我试试看,若成功马上给分
 
刚试了一下,对于静态创建的窗口完全可以这么做,但对于动态创建的窗口,就是使用
var
lf_frm:TFrm_JbParam;
begin
lf_frm := TFrm_JbParam.Create(self);
lf_frm.ShowModal;
end;
这时在lf_frm中的窗口中TChart控件中还是没有显示?这是为什么?
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Chart1: TChart;
Series1: TFastLineSeries;
Button1: TButton;
Button2: TButton;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure Chart1AfterDraw(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
series1.AddY(random(200),formatdatetime('hh:mm:ss',now));
end;

procedure TForm1.Chart1AfterDraw(Sender: TObject);
var
i:integer;
Series2: TFastLineSeries;
begin
if not assigned(form2) then
exit;
for i:=0 to form2.chart1.SeriesCount-1 do
form2.chart1.Series.Free;
series2:=TFastLineSeries.Create(nil);
series2.Assign(series1);
form2.chart1.AddSeries(series2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if not assigned(form2) then
form2:=tform2.create(Application);
form2.showmodal;
form2.free;
form2:=nil;
end;

end.
你试一下,完全没有问题的
 
那我再试试,我用的是Delphi6 控件是安装D6时自带的 TChart standard 4.04
 
还是不行啊,是不是在新创建的窗口中的TChart需要设置些什么啊?
 
var
lf_frm:TFrm_JbParam;
begin
lf_frm := TFrm_JbParam.Create(self);
lf_frm.ShowModal;
end;
你把 lf_frm:TFrm_JbParam;声明放到private部分,然后在destory部分Free,
if assigned(lf_frm) then
begin
lf_frm.free;
lf_frm:=nil;
end;
就应该没问题了,新建窗口的TChart不需要任何设置,连Series也不用加。前面的代码如果你的窗体不是继承自自设的窗体也没有问题。你在过程内部声明的窗体变量当然在AfterDraw事件中不能访问,过程内部的变量离开声明的过程就失效了
 
To:hb_wshsh
真牛人啊,佩服佩服!!
 
后退
顶部