|
Вопрос # 4 934/ вопрос решён / |
|
Здравствуйте, эксперты!
Не могли бы вы подсказать как мне сделать правильно график используя TDBChart?
Выкладываю код - он для меня учебный. Далее я воткну его куда надо в своей программе.
Задача такая: из Excel таблицы ( В первом столбце - данные, во втором столбце - время) брать данные и выводить график.
На вертикальной оси масштаб автоматический, а на горизонтальной -ось времени с интервалом 30 минут. Каждые 30 секунд - график обновляется.
У меня не получается корректно обновлять график. И не могу добиться чтобы ось времени нормально отображалась.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, TeEngine, Series, TeeProcs, Chart, DBChart, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Timer1: TTimer;
- DBChart1: TDBChart;
- Series1: TFastLineSeries;
- Button1: TButton;
- Series2: TFastLineSeries;
- procedure Button1Click(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
-
-
- implementation
-
- {$R *.dfm}
-
- uses ComObj, ExcelXP;
- var ExcelApplication1: OleVariant;
- ExcelWorkBook1: OLEVariant;
- ExcelWorkSheet1: OLEVariant;
-
-
-
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
-
- ExcelApplication1.Quit;
- ExitProcess(0);
-
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- ExcelApplication1 := CreateOleObject('Excel.Application');
- ExcelApplication1.Visible := true;
-
-
- ExcelWorksheet1.Activate;
-
- for I := 1 to 24 do
- BEGIN
-
- END;
- Timer1.Enabled:=True;
- end;
-
-
- procedure TForm1.Timer1Timer(Sender: TObject);
- Var
- ValueSum:Integer;
- begin
- ValueSum:=0;
- Series1.AddXY(0,0,'',clBlue);
- for i:= 0 to 24 do
- begin
- Series1.AddXY(i,ValueSum,'',clBlue);
- ValueSum:=ValueSum+MasPlan[i+1];
- end;
-
-
- ValueSum:=0;
- Series2.AddXY(0,0,'',clRed);
- for i:= 0 to 24 do
- begin
- Series2.AddXY(i,ValueSum,'',clRed);
- ValueSum:=ValueSum+MasPlan[i+1]+Round(Random*10);
- end;
-
-
- end;
-
- end.
-
 |
Вопрос задал: vitalik32 (статус: Посетитель)
Вопрос отправлен: 19 января 2011, 15:18
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 15; последнее сообщение — 20 января 2011, 14:57; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 19 января 2011, 15:23 [#1]:
что имеется ввиду под "У меня не получается корректно обновлять график. И не могу добиться чтобы ось времени нормально отображалась."? выскакивает синий экран, делфи закрывается с треском?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
vitalik32 (статус: Посетитель), 19 января 2011, 15:31 [#2]:
Series2 при обновлении экрана не корректно выводит график. Получается дерганная кривая - а не плавная.
|
|
vitalik32 (статус: Посетитель), 19 января 2011, 15:32 [#3]:
А вот ось времени не могу тоже корректно отобразить. В прикрепленном файле лежит проект. Если его запустить - будет видно что происходит.
|
|
Вадим К (статус: Академик), 19 января 2011, 17:46 [#4]:
проект не запускается
а вот то, что оно ломаное - значит нужно сглаживать. Тут поможет интерполяция.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
vitalik32 (статус: Посетитель), 19 января 2011, 17:53 [#5]:
Зачем интерполяция? График в первый раз рисуется плавно, а при втором проходе соединения между точками скачут. могу выслать скриншот результата. Но это завтра. Побежал в садик за старшим....
Спасибо, что посмотрел мой проект....
|
|
vitalik32 (статус: Посетитель), 20 января 2011, 09:27 [#6]:
Скрины здесь невозможно выложить?
Проект в прикрепленке нужно разархивировать в D:\График\...
|
|
Вадим К (статус: Академик), 20 января 2011, 10:58 [#7]:
Я видел где проект.
скрины можно выложить на любой хостинг картинок и приложить сюда ссылки.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 20 января 2011, 11:51 [#9]:
странный график. Может исходные данные такие? хотя я смутно себе понимаю, как это получается.
А с датой - тут все просто. 0 - это просто 31декабря1899. поэтому на графике и отображается так. Так как дата указывается неправильно, то и отображается неверно. Если вместо i в строке
Series1.AddXY(i,ValueSum,'',clBlue); подставить что то вида
Series1.AddXY(i+X,ValueSum,'',clBlue);
где Х начальная дата, то все будет ок. дата задается в виде кол-ва дней от начала прошлого столетия.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
vitalik32 (статус: Посетитель), 20 января 2011, 11:59 [#10]:
Series1.AddXY(Now+i*OneMinute,ValueSum,'',clBlue);
так корректно или нет?
|
|
Вадим К (статус: Академик), 20 января 2011, 12:05 [#11]:
А это уже Вам виднее. я то не знаю, какой датой и какой минутой должна датироваться каждая запись.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
vitalik32 (статус: Посетитель), 20 января 2011, 12:21 [#12]:
3-х минутный интервал за сутки, и 30-ти минутный интервал тоже за сутки.
|
|
vitalik32 (статус: Посетитель), 20 января 2011, 12:21 [#13]:
За текущие сутки.
|
|
Вадим К (статус: Академик), 20 января 2011, 14:50 [#14]:
если 3минутный интервал, то там должно быть наверное Now()+i*3*OneMinute;
Но тут есть проблема. Now выдает текущее время. и за время работы цикла может поменяться. да и график будет смотреть в будущее. это нужно?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
vitalik32 (статус: Посетитель), 20 января 2011, 14:57 [#15]:
да. нужно. необходимо отслеживать изменения данных и вимдеть 2 графика - 1-плановое потребление в сутки ( часовые интервалы из таблицы), 2-й - фактическое - в 3-х минутном исполнении.
|
24 января 2011, 15:50: Статус вопроса изменён на решённый (изменил автор вопроса — vitalik32)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|