如何更新 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)?

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

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

编辑:

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

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.

找到解决方案!

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

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.

相关内容

  • 没有找到相关文章

最新更新