![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Снова График [D7, XP]
13 © (2006-05-17 17:54:00)Я уже задавал вопрос по построению графика в этом форуме так вот продолжение. Дело в том что мне нужно построить график по 32000 точек как сделать так чтобы по истечении какого то времени скажем 1сек график сдвигался. Скажем сначала показывал с первой точки до 100 потом с 100 до 200 и т.д. Подскажите может сталкивался кто
Kolan (2006-05-19 15:34:00) [1]EvS © (18.05.06 17:24) [24]
Да прогладел.
Повставлял же везеде:
Писал опять же прям сдесь...
13 (18.05.06 16:34) [23]
Писал же везде отладь, отладь....
EvS (2006-05-18 17:24:00) [2]Наши предложения не копировать вслепую код, который тебе дают, а попытаться в нем разобраться.
В данном конретном случае необходимо, чтобы при каждой итерации индекс элемента массива увеличивался на единицу.
Т.е. после FArr[K].Y := Y; вставить K:=K+1;
А оптимизация этой процедуры пусть будет тебе домашним заданием.
Кстати в procedure TForm1.ShowArr(LeftAge, RightAge: Integer;
Arr: TDoublePointArray); тоже не все правильно.
13 (2006-05-18 16:34:00) [3]
> EvS © (18.05.06 16:29) [22]
Ваше предложения??????????
EvS (2006-05-18 16:29:00) [4]>13 (18.05.06 16:11) [16]
Никаго графика строится не будет.
Т.к. в procedure TForm1.Button1Click(Sender: TObject) переменная К всегда равна 0, то все данные пишутся в один и тот же первый элемент массива FArr
13 (2006-05-18 16:22:00) [5]Вообщем в одном файле точки по оси x 32000, в другом файле 32000 точек по y.
Надо построить весь график целиком. Раз так не получится, то надо вывести его по таймеру частями "как бы эффект движения". Проблема блин
Kolan (2006-05-18 16:17:00) [6]Почему не получается построить весь графиксразу в моем случае по 32000 точкам. Ограничения какие то есть или как?
и из поста 1
Скажем сначала показывал с первой точки до 100 потом с 100 до 200
Ты что вообще хочешь?
13 (2006-05-18 16:17:00) [7]
> а кнопку 1(график загрузится) а затем на кнопку 3 тогда
> он нарисуется.
Должет то должен.да вот не рисуется.
Kolan (2006-05-18 16:15:00) [8]Ну это ты так сделал на двух кнопках. По твоей логике нужно вначале нажать на кнопку 1(график загрузится) а затем на кнопку 3 тогда он нарисуется.
13 (2006-05-18 16:14:00) [9]Почему не получается построить весь график сразу в моем случае по 32000 точкам. Ограничения какие то есть или как?
13 (2006-05-18 16:11:00) [10]По идее вот так надо
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
Чертовщина какая то
Kolan (2006-05-18 15:52:00) [11]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 15:42:00) [12]После добавления проверки
> 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:03:00) [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);
то возможно ты не так или не туда чарт положил.
Так как ты описал проблемму трудно понять в чем дело.
НО самое главное ОТЛАДЬ.
MetalFan (2006-05-18 14:58:00) [14]ну вот сам и разбирайся со своими иксами и игреками!
а тут не телепаты собрались!
укажи ГДЕи КАКОЕвозникает исключение... если хочешь, чтобы тебе помогли
13 (2006-05-18 14:15:00) [15]Приводу полный код приложения
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.
Kolan (2006-05-18 11:31:00) [16]а поподробней
Как думаешь что будет если массив от 0 до 100, а ты будешь рисовать от 100 до 200? Правильно AV...
Ругается вот на это
Series1.AddXY(Arr[I].X, Arr[I].Y);
Не должно. Что значит ругается?
13 (2006-05-18 10:44:00) [17]
> проверяешь диапазон?!
а поподробней
MetalFan (2006-05-18 10:29:00) [18]
> {Диапазон не забудь проверить.}
проверяешь диапазон?!
balepa (2006-05-18 10:05:00) [19]
> > Project xxxx raised exception class yyyyywith message
> ' zzzzzz'.
> >
> >
> > Process stopped. Use Step or Run to continue.
Очень содержательно.
13 (2006-05-18 09:53:00) [20]Ругается вот на это
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.