C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Компонент Chart, Проблемы при отображении графика
Roman
Отправлено: 06.11.2003, 14:05


Дежурный стрелочник

Группа: Участник
Сообщений: 78



sad.gif Здравствуйте, Господа!!!
Помогите кто может. Проблема возникает при отображении графика (серия Line компонента Chart  — временной график).

Поясняю: Работает программа, в БД заносится информация. При нажатии пользователем на кнопке (для отображения графика) фильтруется БД по определенному признаку (по выбранному объекту) и последовательно запись за записью выводится на график. После завершения просмотра всей базы в график продолжают добавлятся новые точки, данные которые заносятся в БД после ее просмотра.

Проблема вот в чем: при переключении с объекта на объект его данные отображаются с искажениями (иногда) и стабильности нет. Искажение может начаться в любом месте графика.
У меня сложилось мнение, что график отрисовывается -> ошибка -> оставшиеся точки пропускает -> добавляет точку которая заносится в БД после ее просмотра -> соединяет эти две точки ??????
"Боролся" всеми способами...

Вот код (немного сокращенный):

void __fastcall TFMaine::ComboBoxChange(TObject *Sender)
{
if (FMaine->TableFS->RecordCount != 0) {
FMaine->TableFS->Filtered = false;
FMaine->TableFS->Filter = "NStan='" + IntToStr(StrToInt(ComboBox->Text)) + "'";
FMaine->TableFS->Filtered = true;
if (FMaine->TableFS->RecordCount != 0) {
filt_gr = false;
FMaine->Series15->Active = false;
FMaine->Series15->Active = true;
FMaine->Series15->Clear();
Chart6->BottomAxis->Automatic = false;
Chart6->LeftAxis->Automatic = false;
Chart6->BottomAxis->Automatic = true;
Chart6->LeftAxis->Automatic = true;
FMaine->Series15->YValues->Order = loNone;
Application->ProcessMessages();
FMaine->TableFS->First();
do {
vrema = FMaine->TableFSDate->AsDateTime;
Series15->AddXY(vrema, FMaine->TableFSPAktiv->AsInteger, "", clRed);
Application->ProcessMessages();
FMaine->TableFS->Next();
}
while (!FMaine->TableFS->Eof);
FMaine->Chart6->Repaint();
}
}
filt_gr = true; //является глобальной переменной
}
//---------------------------------------------------------------------------

void __fastcall TFMaine::TableFSBeforePost(TDataSet *DataSet)
{
try {
if (filt_gr)
if (StrToInt(ComboBox->Text) == FMaine->TableFSNStan->AsInteger) {
Series15->AddXY(FMaine->TableFSDate->AsDateTime, FMaine->TableFSPAktiv->AsInteger, "", clRed);
Application->ProcessMessages();
}
} catch (...) {}
}
//---------------------------------------------------------------------------
xTrim
Отправлено: 07.11.2003, 09:04


Машинист паровоза

Группа: Участник
Сообщений: 208



Может так попробовать
CODE

void __fastcall TFMaine::ComboBoxChange(TObject *Sender)
{
[B] TableFS->BeforePost = NULL; [/B]
if (FMaine->TableFS->RecordCount != 0) {
FMaine->TableFS->Filtered = false;
...
}
[B] TableFS->BeforePost = TableFSBeforePost; [/B]
// убрать пока filt_gr = true; //является глобальной переменной
}


Отредактировано xTrim — 07/11/2003, 10:09
Георгий
Отправлено: 10.11.2003, 22:34


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



А почему бы не использовать DBChart и Series связанный с DataSet`ом?

Мне кажется, что у вас проблема с одновременным отображением таблицы через DBGrid`ы и самодельным выводом данных в TSeries — делов том, что при просмотре таблицы в DBGrid`е меняется указатель текущей записи, а вы им пользуетесь при выборе точек для вывода (FMaine->TableFS->Next()), что может привести к неожинанным перескокам по записам-точкам на графике
Roman
Отправлено: 11.11.2003, 16:16


Дежурный стрелочник

Группа: Участник
Сообщений: 78



Мне надо выводить график "реального времени" с обработанными параметрами, а не все точки подряд, т.е. если интервал времени между двумя точками более 30 сек. -> добавляем две дополнительные точки (рисуется отрезок от текущего значения до 0, 0 до прихода сигнала и с этого момента времени до текущего значения) — график с "разрывом" (код я просто немного сократил — выкинул условие).

Точки которые добавляются после "основной" прорисовки работают (отрисовываются) без искажений...

DBChart при добавлении новой точки в БД начинает "моргать" — все очищет и рисует заново.
DBGrid я нигде не использую, т.е. не просматриваю эту БД. Она только для графика.
sad.gif

Вернуться в Вопросы программирования в C++Builder