График реального времени

Сергей Козинцев
Дата: 03.05.2011 16:58:54
как построить график реального времени?Допустим есть какая-то переменная которая изменяет свое значение через какое-то время(по таймеру) ,и график который отображает некоторое количество точек(допустим 10).как это осуществить?можно ли стандартными методами и компонентами или прийдеться рисовать на канве?
Boxxy
Дата: 03.05.2011 17:08:24
TChart тебе в помощь
Сергей Козинцев
Дата: 03.05.2011 17:28:34
да,но у меня же не известно сколько будет работать таймер и сколько будет точек...
Гаджимурадов Рустам
Дата: 03.05.2011 17:29:54
Таймер будет бесконечный. С каждым "тиком" будешь добавлять точки. Если вдруг
встанет проблема нехватки памяти - будешь удалять точки или целиком линию.
Мимопроходящий
Дата: 03.05.2011 17:31:12

Hello, Сергей!
You wrote on Tue, 03 May 11 14:28:34 GMT:

Сергей
СК> да,но у меня же не известно сколько будет работать таймер и сколько будет точек...
не имеет значения

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4

defecator
Дата: 03.05.2011 17:31:24
Сергей Козинцев
как построить график реального времени?Допустим есть какая-то переменная которая изменяет свое значение через какое-то время(по таймеру) ,и график который отображает некоторое количество точек(допустим 10).как это осуществить?можно ли стандартными методами и компонентами или прийдеться рисовать на канве?


Нет ничего проще.
Вот мой код, который я использовал когда-то давным-давно (году так в 2000-ом).
Код хоть и древний, но рабочий. Перепишешь, как надо тебе )))
Дарю )))))))

+
unit SO_PerfChart;

{ компонент отображения ползучего графика, как в диспетчере задач }

interface

uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, IT_VCLBase ;

type
    TSOPerfChart = class(TImage)
    private
      XCount     : Integer;
      FPlotColor : TColor;
      FOldPos    : Integer;
      FFirstValue: Boolean ;

      procedure SetBounds(Aleft, ATop, AWidth, AHeight : Integer); override;
    public
      constructor Create(aOwner: TComponent); override;
      destructor Destroy; override;
    published
      property PlotColor : TColor read FPlotColor write FPlotColor default clLime ;
      procedure Plot(Value : Integer);

      property Align ;

      procedure ReCalc ;
    end;

procedure Register ;

implementation

procedure Register ;
begin
     RegisterComponents(IT_VCL_Page_Visual, [TSOPerfChart]);
end ;

constructor TSOPerfChart.Create(aOwner: TComponent);
begin
     Inherited Create(aOwner) ;
     Width := 100 ;
     Height := 40 ;
     FPlotColor := clLime ;
     ReCalc ;
end ;

destructor TSOPerfChart.Destroy;
begin
     Inherited Destroy ;
end ;

procedure TSOPerfChart.SetBounds(Aleft, ATop, AWidth, AHeight: Integer);
begin
     inherited;
     //ReCalc ;
end;

procedure TSOPerfChart.ReCalc ;
var
   FillR : TRect;
   I : Integer;
begin
     FOldPos := Height ;
     // Залить фон
     FillR := Rect(0, 0, Width, Height) ;
     Canvas.Brush.Color := clBlack ;
     Canvas.FillRect(FillR) ;
     // нарисовать линии
     Canvas.Pen.Color := clGreen ;
     Canvas.Pen.Width := 1 ;
     Canvas.Pen.Style := psSolid ;
     // нарисовать линии - горизонтальные 
     I := 0 ;
     while I < Height do
      begin       
           Canvas.MoveTo(0,I);
           Canvas.LineTo(Width,Canvas.PenPos.Y);
           I := I + 15 ;
      end;
     // нарисовать линии - вертикальные
     I := 0 ;
     while I < Width do
      begin
           Canvas.MoveTo(I,0) ;
           Canvas.LineTo(I,Height) ;
           I := I + 15 ;
      end;
     Canvas.MoveTo(Width-1,0);
     Canvas.LineTo(Width-1,Height);
     Canvas.MoveTo(0,Height-1);
     XCount := 0 ;
end;

procedure TSOPerfChart.Plot(Value : Integer) ;
var
   I : Integer;
   FillR : TRect;
begin
     if Value < 0 then Value := 0 ;
     if Value > 100 then Value := 100 ;
     // сместить экран влево
     BitBlt(Canvas.Handle,-5,0,Width,Height,Canvas.Handle,0,0,SRCCOPY);
     // залить рабочую область
     FillR := Rect(Width-5, 0, Width, Height) ;
     Canvas.Brush.Color := clBlack ;
     Canvas.FillRect(FillR);
     // рисовать горизонтальные линии
     Canvas.Pen.Color := clGreen ;
     I := 0 ;
     while I < Height Do
      begin
           Canvas.MoveTo(0,I);
           Canvas.LineTo(Width,Canvas.PenPos.Y);
           I := I + 15 ;
      end;
     // рисовать вертикальные линии
     XCount := XCount + 5 ;
     if XCount = 15 then
      begin
          XCount := 0 ;
          Canvas.MoveTo(Width-1,0);
          Canvas.LineTo(Width-1,Height);
      end;
     // рисуем новое значение 
     Canvas.Pen.Color := FPlotColor ;
     Canvas.MoveTo(Width-6,FOldPos);
     Canvas.Pen.Style := psSolid ;                                  
     Canvas.LineTo(Width-1,(Round(Height - (Value / 100)*Height))+2 ) ;
     FOldPos := Canvas.PenPos.Y ;
end;

end.  
Сергей Козинцев
Дата: 03.05.2011 17:44:05
спасибо,будем разбираться и пробывать
defecator
Дата: 03.05.2011 17:47:29
Сергей Козинцев
спасибо,будем разбираться и пробывать


Мой код рисует точно такой же график, как диспетчер задач в Windows.

Создаешь экземпляр класса на форме, например.
А потом вызываешь метод Plot со значением - и вуаля.
Ничего при перерисовке не дергается и не мигает.
В общем...сам посмотришь.
Сергей Козинцев
Дата: 03.05.2011 17:58:03
впринципе работает и просто так вот
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  w:=Random(1000);
  i:=i+1;
  Label2.Caption:=IntToStr(w);
  Series1.AddXY(i,w,'',clred);
end;
но тут нужно тогда следить за количеством точек и удалять первые как достигнет нужного предела
defecator
Дата: 03.05.2011 17:59:03
Предвидя вопросы, сделал тестовый проект - отображает график Random(100) раз в секунду.
Компилится на Delphi 7 без установки каких-либо компонентов.