Форум: "Начинающим";
Текущий архив: 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