Как я могу обновить данные в диаграмме во время выполнения (в C ++ Builder)?

Я использую 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);

}
}

0

Решение

Вы должны принудительно перерисовывать диаграмму, когда захотите:

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();
}
}
}
3

Другие решения

Да, это старая ветка, но у меня есть предложение для всех, кто сталкивается с ней. Вы также можете перекрасить только серию, которая, возможно, потребует меньше накладных расходов, чем перекраска всего графика. Для этого используйте метод перекраски TChartSeries. Для данного примера вы бы поместили «series1-> Repaint ();» где-то внутри цикла я думаю.

2

По вопросам рекламы [email protected]