Q&A

  • 차트(그래프)를 옆으로 밀려가면서 실시간 기록하고 싶습니다.


procedure TfrmMain.TmrMonitorTimer(Sender: TObject);
var t:Longint;
    tmpX:Double;
begin
 label1.caption:=intTostr(T2);
  Randomize;              // 데모용
   With Chart1 do
      begin
       for t:=0 to SeriesCount-1 do
        With Series[t] do begin
             AddXY(T2,Random(100),'',clTeeColor);
        end;
   end;
   if T2>2147483647 then
      T2:=0
   else if T2=7 then chart1.Nextpage;

   inc(T2);


티차트를 사용하고 있는데요 x축이 예를 들어 7초로 정해 놨을 때 7초가 지나면

다음 페이지(?)로 넘어가 8 9 10~~ 이렇게 그림과 같이 나타내고 싶습니다...

또 14초가 지났을 땐 15 16 17~~ 이렇게 하고 싶습니다..

물론 값은 그 시간에 맞게 값이 나와야겠죠...

위와 같이 했는데.. Timer를 이용해서 했는데 좀 이상합니다.. 맞지 않는 듯...   Nextpage가 맞는 코든가요?

그냥 그대로의 티차트를 사용하면 값이 쌓입니다.. 점점 합쳐지는 거죠...

그러면 안되거든요... 초보 좀 도와주세요..ㅠ 부탁드리겠습니다
2  COMMENTS
  • Profile
    이중철 2006.01.17 02:42
    여러가지 방법이 있겠죠
    제가 고전적으로 쓰고 있는것은
    BottomAxis의 Min Max를 바꾸는 것인데요 이 방법도 나쁘지는 않아요
    var
      nowtime : TDateTime;
    begin
      nowtime := now;
      Chart1.AddXY(nowtime , Random(100), '', dTeeColor);
      With Chart1.BottomAxis do
      begin
        if Minimum > Maximum  then
           Minimum := Maximum - 200/(60*60*60);
        Maximum := nowtime  + 1/(60*60*60);
        Minimum :=  nowtime  - 200/(60*60*60);
      end;
      
      While Chart1.Series[0].Xvalues[0] < nowtime  - 1000/(60*60*60) do
        Chart1.Series[0].Delete(0);  
    end;
        
       대충 감 잡겠지만 기준시간에서 200초를 보여주고
       기준시간 1000초 전것은 삭제합니다.
       실시간 모니터링은 데이터를 계속 보관하면 Overflow납니다.

       그리고 원래 실시간 쪽은 타이머와 입력루틴은 별개로 있는거에요 즉, 다음과 같죠

    // Timer
    var
      nowtime : TDateTime;
    begin
      nowtime := now;
      With Chart1.BottomAxis do
      begin
        if Minimum > Maximum  then
           Minimum := Maximum - 200/(60*60*60);
        Maximum := nowtime  + 1/(60*60*60);
        Minimum :=  nowtime  - 200/(60*60*60);
      end;
      
    end;

    // 입력 (TCP 또는 기타 입력장치에서 들어온 값)
    var
      nowtime : TDateTime;
    begin
      Chart1.AddXY(nowtime , Random(100), '', dTeeColor);
      While Chart1.Series[0].Xvalues[0] < nowtime  - 1000/(60*60*60) do
        Chart1.Series[0].Delete(0);  
    end;




  • Profile
    윤경미 2006.01.17 23:16
    감사합니다!!!

    어려워 보이지만 한번 해볼게요^^