Я использую Borland C ++ Builder для создания этого. Код очень прост, потому что сейчас его единственная цель — помочь мне научиться использовать функции TChart. Я буду использовать то, что узнаю, чтобы создать более сложную программу позже.
У меня есть ряд чисел, которые должны быть показаны в блокноте и на диаграмме. Значения на графике отображаются после того, как программа завершает свою работу, однако мне нужно, чтобы значения обновлялись в режиме реального времени — я имею в виду, что каждый раз, когда программа вычисляет новое число, оно должно немедленно отображаться на графике. Возможно ли это сделать? Если так, как я могу это сделать?
Заранее спасибо.
#pragma hdrstop
#include "Unit1.h"//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TChartSeries* series1 = Chart1->Series[0];
series1->Clear();
int num = 0;
Memo1->Clear();
for(int i=0; i<5000; i++)
{
num = num++;
Memo1->Lines->Add(IntToStr(num));
series1->AddXY(i, num, "", clGreen);
}
}
Вы должны принудительно перерисовывать диаграмму, когда захотите:
Chart1->Repaint();
Таким образом, вы могли бы иметь:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TChartSeries* series1 = Chart1->Series[0];
series1->Clear();
int num = 0;
Memo1->Clear();
for(int i=0; i<5000; i++)
{
num = num++;
Memo1->Lines->Add(IntToStr(num));
series1->AddXY(i, num, "", clGreen);
Chart1->Repaint();
}
}
Или, чтобы повысить производительность, вы можете принудительно перерисовать диаграмму после добавления некоторых значений, а не после каждого добавления. То есть:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TChartSeries* series1 = Chart1->Series[0];
series1->Clear();
int num = 0;
Memo1->Clear();
for(int i=0; i<5000; i++)
{
num = num++;
Memo1->Lines->Add(IntToStr(num));
series1->AddXY(i, num, "", clGreen);
if (i % 100 == 0) {
Chart1->Repaint();
}
}
}
Да, это старая ветка, но у меня есть предложение для всех, кто сталкивается с ней. Вы также можете перекрасить только серию, которая, возможно, потребует меньше накладных расходов, чем перекраска всего графика. Для этого используйте метод перекраски TChartSeries. Для данного примера вы бы поместили «series1-> Repaint ();» где-то внутри цикла я думаю.