Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Снова График [D7, XP]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо