Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Снова График   Найти похожие ветки 

 
13   (2006-05-17 17:54) [0]

Я уже задавал вопрос по построению графика в этом форуме так вот продолжение. Дело в том что мне нужно построить график по 32000 точек как сделать так чтобы по истечении какого то времени скажем 1сек график сдвигался. Скажем сначала показывал с первой точки до 100 потом с 100 до 200 и т.д. Подскажите может сталкивался кто


 
Ega23 ©   (2006-05-17 17:59) [1]

Минимум-максимум на оси менять по таймеру?


 
EvS ©   (2006-05-17 18:00) [2]

Один из способов постраничный вывод.
Установи свойство MaxPointsPerPage:= кол-во точек на страницу.
Затем листай страницы (Page,NumPages,PreviousPage, NextPage)


 
Kolan ©   (2006-05-17 18:07) [3]

Ну е еще можно массивчик с графиком хранить в памяти, а раз в секунду выводить тот кусок, который нужен. Получится эффект движения. Моргать не будет проверял...


 
13   (2006-05-17 18:36) [4]


> Kolan ©   (17.05.06 18:07) [3]

А можно пример. Очень нужно


 
Kolan ©   (2006-05-17 19:32) [5]

Пример такой(я так и делаю в подобных ситуациях. Удобство в том, что способ отображения отделен от данных):

Пользую такую структуру для точки:
TDoublePoint = record
 X: Double;
 Y: Double;
end;


А график это:
TDoublePointArray = array of TDoublePoint;

Получив откудото данные в твоем случае, я думаю, это файл я сохраняю их в массив TDoublePointArray.

Вот пример для соседней ветки:
{Где-то заводим переменную для графика}
FArr: TDoublePointArray;

var
I, K: Integer;
Strings1, Strings2: TStringList;
X, Y: Double;
begin
Strings1 := TStringList.Create;
Strings2 := TStringList.Create;
try
  Strings1.LoadFromFile("File1Name");
  Strings2.LoadFromFile("File2Name");
  SetLength(FArr, Strings1.Count);
  K := 0;
  for I := 0 to Strings1.Count - 1 do
  begin
    X := StrToFloat(Strings1[I]);
    Y := StrToFloat(Strings2[I]);
    FArr[K].X := X;
    FArr[K].Y := Y;
  end;
finally
  Strings1.Free;
  Strings2.Free;
end;
end;


А теперь если надо отобразить часть можно сделать так:
{...}
procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray)
var
 I: Integer;
begin
 {Диапазон не забудь проверить.}
 for I := LeftAge to RightAge do
   Series1.AddXY(Arr[I].X, Arr[I].Y);
end;


Пользуем так:
ShowArr(100, 200, FArr);

Писал опять же прям сдесь...


 
13   (2006-05-18 09:53) [6]

Ругается вот на это
Series1.AddXY(Arr[I].X, Arr[I].Y);
Пришлось сделать Form1.Series1.AddXY(Arr[I].X, Arr[I].Y);
Теперь ошибка такого вида

> Project xxxx raised exception class yyyyy with message "zzzzzz".
>
>
> Process stopped.  Use Step or Run to continue.


 
balepa ©   (2006-05-18 10:05) [7]


> > Project xxxx raised exception class yyyyy with message
> "zzzzzz".
> >
> >
> > Process stopped.  Use Step or Run to continue.

Очень содержательно.


 
MetalFan ©   (2006-05-18 10:29) [8]


>  {Диапазон не забудь проверить.}

проверяешь диапазон?!


 
13   (2006-05-18 10:44) [9]


> проверяешь диапазон?!

а поподробней


 
Kolan ©   (2006-05-18 11:31) [10]

а поподробней
Как думаешь что будет если массив от 0 до 100, а ты будешь рисовать от 100 до 200? Правильно AV...

Ругается вот на это
Series1.AddXY(Arr[I].X, Arr[I].Y);
Не должно. Что значит ругается?


 
13   (2006-05-18 14:15) [11]

Приводу полный код приложения

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
 TDoublePoint = record
X: Double;
Y: Double;
end;

TDoublePointArray = array of TDoublePoint;
 TForm1 = class(TForm)
   Chart1: TChart;
   Series1: TLineSeries;
   BitBtn1: TBitBtn;
   Button1: TButton;
   Button2: TButton;
   OpenDialog1: TOpenDialog;
   Button3: TButton;
   Timer1: TTimer;
   procedure BitBtn1Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 FArr: TDoublePointArray;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I,k: Integer;
Strings1, Strings2: TStringList;
X, Y: Double;

begin
Series1.Clear;
Strings1 := TStringList.Create;
Strings2 := TStringList.Create;
try
  Strings1.LoadFromFile("c:\33.txt");
  Strings2.LoadFromFile("c:\22.txt");
  SetLength(FArr, Strings1.Count);
   K := 0;
  for I := 0 to Strings1.Count - 1 do

  begin
    X := StrToFloat(Strings1[I]);
    Y := StrToFloat(Strings2[i]);
    FArr[K].X := X;
   FArr[K].Y := Y;
 //  Series1.AddXY(X,Y);

  end;
finally
  Strings1.Free;
  Strings2.Free;
end;

end;

procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);
var
I: Integer;
begin

for i:=LeftAge to RightAge do

  Form1.Series1.AddXY(Arr[I].X,Arr[I].Y);

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ShowArr(1, 100, FArr);

end;

end.

в файлах 33 и 22.txt по 500 точек

> Что значит ругается?

 Ошибка вот такого вида:

> Project xxxx raised exception class yyyyy with message "zzzzzz".
>  Process stopped.  Use Step or Run to continue.


 
MetalFan ©   (2006-05-18 14:58) [12]

ну вот сам и разбирайся со своими иксами и игреками!
а тут не телепаты собрались!
укажи ГДЕ и КАКОЕ возникает исключение... если хочешь, чтобы тебе помогли


 
Kolan ©   (2006-05-18 15:03) [13]

Ты знаешь про кнопки F7 И F8?

Отладь это раз.
И еще моет ты патаешься рисовать Button3Click
до того как загрузил массив.

И используй проверку

procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);
var
I: Integer;
begin
 if (LeftAge > Low(Arr)) and (RightAge < High(Arr)) then
   for i:=LeftAge to RightAge do
     Series1.AddXY(Arr[I].X,Arr[I].Y);
end;


Если так получается:
  Form1.Series1.AddXY(Arr[I].X,Arr[I].Y);,
а так нет
  Series1.AddXY(Arr[I].X,Arr[I].Y);
то возможно ты не так или не туда чарт положил.

Так как ты описал проблемму трудно понять в чем дело.

НО самое главное ОТЛАДЬ.


 
13   (2006-05-18 15:42) [14]

После добавления проверки
> Kolan ©   (18.05.06 15:03) [13]

Ошибки у же не возникает. Но график не строится.
Чарт положил на форму и в нем дабавил series1.
если делаю так

Series1.AddXY(Arr[I].X,Arr[I].Y);

Пишет что
Undeclared identifier: series1
Поидее надо Form1.Series1 потому что процедура объявлена как:

procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);

а не так

procedure TForm1.ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);


 
Kolan ©   (2006-05-18 15:52) [15]

Undeclared identifier: series1

Значит его нет(идентификатора).
В пиведенном коде он есть.

TForm1 = class(TForm)
  Chart1: TChart;
  Series1: TLineSeries;


Может ты из другого модуля обращаешься?

...
Ааа
Ну конечно надо ShowArr сделать методом формы:
TForm1 = class(TForm)
  Chart1: TChart;
  Series1: TLineSeries;
  BitBtn1: TBitBtn;
  Button1: TButton;
  Button2: TButton;
  OpenDialog1: TOpenDialog;
  Button3: TButton;
  Timer1: TTimer;
  procedure BitBtn1Click(Sender: TObject);
  procedure Button1Click(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
  procedure Button3Click(Sender: TObject);
 

private
  { Private declarations }
public
  { Public declarations }
procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);
end;


Жмешь Ctrl+Shift+C. В сгенерированный код втавь рисование...


 
13   (2006-05-18 16:11) [16]

По идее вот так надо

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs, Chart;

type
TDoublePoint = record
  X: Double;
  Y: Double;
end;

TDoublePointArray = array of TDoublePoint;

 TForm1 = class(TForm)
   Button1: TButton;
   OpenDialog1: TOpenDialog;
   Button3: TButton;
   Chart1: TChart;
   Series1: TLineSeries;
  procedure Button1Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
    procedure ShowArr(LeftAge, RightAge: Integer; Arr: TDoublePointArray);
 end;

var
 Form1: TForm1;
 FArr: TDoublePointArray;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I,k: Integer;
Strings1, Strings2: TStringList;
X, Y: Double;
begin
Series1.Clear;
Strings1 := TStringList.Create;
Strings2 := TStringList.Create;
try
  Strings1.LoadFromFile("c:\3.txt");
  Strings2.LoadFromFile("c:\2.txt");
  SetLength(FArr, Strings1.Count);
   K := 0;
  for I := 0 to Strings1.Count - 1 do
   begin
    X := StrToFloat(Strings1[I]);
    Y := StrToFloat(Strings2[i]);
    FArr[K].X := X;
    FArr[K].Y := Y;
   end;
finally
  Strings1.Free;
  Strings2.Free;
end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ShowArr(0, 100, FArr);
end;

procedure TForm1.ShowArr(LeftAge, RightAge: Integer;
 Arr: TDoublePointArray);
var
I: Integer;
begin
if (LeftAge > Low(Arr)) and (RightAge < High(Arr)) then
  for i:=LeftAge to RightAge do
   Series1.AddXY(Arr[I].X,Arr[I].Y);
end;

end.

Однако график не отображается.Ошибок никаких нет.
Вот вопрос такой. По нажатию на Button3 мы график рисуем
Однако

X := StrToFloat(Strings1[I]);
    Y := StrToFloat(Strings2[i]);
    FArr[K].X := X;
    FArr[K].Y := Y;

у нас по нажатию на Button1
Чертовщина какая то


 
13   (2006-05-18 16:14) [17]

Почему не получается построить весь график сразу в моем случае по 32000 точкам. Ограничения какие то есть или как?


 
Kolan ©   (2006-05-18 16:15) [18]

Ну это ты так сделал на двух кнопках. По твоей логике нужно вначале нажать на кнопку 1(график загрузится) а затем на кнопку 3 тогда он нарисуется.


 
13   (2006-05-18 16:17) [19]


> а кнопку 1(график загрузится) а затем на кнопку 3 тогда
> он нарисуется.

Должет то должен.да вот не рисуется.


 
Kolan ©   (2006-05-18 16:17) [20]

Почему не получается построить весь график сразу в моем случае по 32000 точкам. Ограничения какие то есть или как?

и из поста 1

Скажем сначала показывал с первой точки до 100 потом с 100 до 200

Ты что вообще хочешь?


 
13   (2006-05-18 16:22) [21]

Вообщем в одном файле точки по оси x 32000, в другом файле 32000 точек по y.
Надо построить весь график целиком. Раз так не получится, то надо вывести его по таймеру частями "как бы эффект движения". Проблема блин


 
EvS ©   (2006-05-18 16:29) [22]

>13   (18.05.06 16:11) [16]

Никаго графика строится не будет.
Т.к. в procedure TForm1.Button1Click(Sender: TObject)  переменная К всегда равна 0, то все данные пишутся в один и тот же первый элемент массива FArr


 
13   (2006-05-18 16:34) [23]


> EvS ©   (18.05.06 16:29) [22]

Ваше предложения??????????


 
EvS ©   (2006-05-18 17:24) [24]

Наши предложения не копировать вслепую код, который тебе дают, а попытаться в нем разобраться.
В данном конретном случае необходимо, чтобы при каждой итерации индекс элемента массива увеличивался на единицу.
Т.е. после FArr[K].Y := Y; вставить K:=K+1;
А оптимизация этой процедуры пусть будет тебе домашним заданием.
Кстати в procedure TForm1.ShowArr(LeftAge, RightAge: Integer;
Arr: TDoublePointArray); тоже не все правильно.


 
Kolan ©   (2006-05-19 15:34) [25]

EvS ©   (18.05.06 17:24) [24]
Да прогладел.
Повставлял же везеде:
Писал опять же прям сдесь...

13   (18.05.06 16:34) [23]
Писал же везде отладь, отладь....



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.049 c
15-1147078723
QuickFinder
2006-05-08 12:58
2006.06.04
Cpp 2 Pas


2-1148131179
Viconia
2006-05-20 17:19
2006.06.04
Строку в цену


2-1147752004
rubey
2006-05-16 08:00
2006.06.04
Ввод через DBGRID


15-1146887365
Думкин
2006-05-06 07:49
2006.06.04
Суббота


2-1147936674
Zidane5
2006-05-18 11:17
2006.06.04
Internal error: SY576