Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.066 c
6-1138739143
MuscleBeaveR
2006-01-31 23:25
2006.06.04
Броузер своими руками


1-1145892988
Meganop
2006-04-24 19:36
2006.06.04
Вызов chm файла из Delphi


2-1147690847
Quattro
2006-05-15 15:00
2006.06.04
GetCharWidth


5-1133311365
asdqwer
2005-11-30 03:42
2006.06.04
Динамическое присвоение метода компоненту в DLL


15-1147070109
Nic
2006-05-08 10:35
2006.06.04
Задача со строками





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский