如何更新TeeChart

时间:2014-04-08 08:07:46

标签: delphi firemonkey delphi-xe3 teechart

我是Firemonkey和XE3环境的新手。

我的程序会进行一些计算,并应该使用TeeChart组件向用户提供反馈。

OnClick()
begin

    while(boolContinue) do
    begin
    NextStep(boolContinue);

    DoSomeCalculations();

    UpdateTeeChart();
    end;
end;

我在Delphi7中使用了Application.ProcessMessage。在FireMonkey应用程序中,似乎需要几秒钟才能进行一次ProcessMessage调用。

更新TChart的正确方法是什么(TLineSeries / TeeChart Lite v 2012.06.120613)?

我试过: - HandleMessage(工作,但很慢) - 仅处理绘制消息(有效,但速度慢) - 无效(不起作用) - 重绘(不起作用)

我也尝试使用线程但没有成功。

编辑:

添加了一个简单的测试程序:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMXTee.Engine, FMXTee.Procs, FMXTee.Chart, FMXTee.Series;

type
  TForm1 = class(TForm)
    Chart1: TChart;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
  line : TLineSeries;
  ii, x1, x2 : integer;

begin

  line := TLineSeries.Create(chart1);
  line.ParentChart := chart1;

  for ii  := 1 to 100 do
  begin
    line.AddXY(ii, random(20));

    // Do some calculations...
    self.Caption := IntToStr(ii);
    for x1 := 1 to 10000 do
      for x2 := 1 to 1000 do
      begin
      end;
  end;
end;

end.

1 个答案:

答案 0 :(得分:0)

找到解决方案!

这里还讨论了这个问题,并在那里找到了解决方案:

https://forums.embarcadero.com/message.jspa?messageID=427282

现在图表重新绘制,运行只需约2秒钟。

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMXTee.Engine, FMXTee.Procs, FMXTee.Chart, FMXTee.Series, Windows;


type MyThread = class(TThread)
  protected
   procedure Execute; override;
  public
    line : TLineSeries;

    constructor Create; overload;
    destructor Destroy; override;
end;


type
  TForm1 = class(TForm)
    Chart1: TChart;
    Button1: TButton;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}




constructor MyThread.Create;
begin
  inherited Create(true);
  FreeOnTerminate := true;
end;

destructor MyThread.Destroy;
begin
  inherited;
end;


procedure MyThread.Execute;
var
 ii, x1, x2 : integer;
begin
  for ii  := 1 to 100 do
  begin
    line.AddXY(ii, random(20));

    // Do some calculations...
    for x1 := 1 to 10000 do
      for x2 := 1 to 1000 do
      begin
      end;
  end;
end;




procedure TForm1.Button1Click(Sender: TObject);
var
   MT : MyThread;
   line : TLineSeries;
begin
   chart1.BottomAxis.Minimum := 0;
   chart1.BottomAxis.Maximum := 100;
   chart1.BottomAxis.AutomaticMinimum := false;
   chart1.BottomAxis.AutomaticMaximum := false;

   chart1.Legend.Visible := false;

  line := TLineSeries.Create(chart1);
  line.ParentChart := chart1;

  MT := MyThread.Create;
  MT.line := line;
  MT.Start;
end;


end.