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

Вниз

TChart не строит ординату больше 1817   Найти похожие ветки 

 
physic ©   (2005-02-20 14:37) [0]

вот простейший код, до ординаты 1817 все в порядке, а потом: Invalid Pointer Operation

procedure TForm1.Button1Click(Sender: TObject);
begin
chart1.Series[0].AddXY(1,1818);
end;


 
olookin ©   (2005-02-20 15:06) [1]

physic ©   (20.02.05 14:37)

Это известный баг TChart. Так как исходников нет, то выяснить причину нельзя.


 
physic ©   (2005-02-20 15:12) [2]

ох...ть!!!!!!! а что мне делать?!! неужели через канву?!!
а ты не мог бы поподробнее описать баг, может, я его обойду?


 
olookin ©   (2005-02-20 15:18) [3]

[2] physic ©   (20.02.05 15:12)

Спасает ситуацию следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
 Chart1.Series[0].AddXY(0,0);
 Chart1.Series[0].AddXY(10,10000);
 Chart1.Series[0].XValues.Delete(0);
end;


 
physic ©   (2005-02-20 15:38) [4]

Спасибо, только не мог бы ты описать идею этого метода, а то он не работает в моей программе. И где можно прочесть про остальные глюки (если они есть)?

procedure TMainForm.plot_btnClick(Sender: TObject);
var
 baseline: real;
 k: integer;
begin
 series_base.Clear;
 series_base.addxy(0,0);  
 for k:=spedt_From.Value to spedt_to.Value do
   begin
     baseline:=base(100000,0,100,k);
     series_base.addxy(k,baseline);
   end;
 series_base.XValues.Delete(0); //первая точка остается почему-то
end;


 
olookin ©   (2005-02-20 15:48) [5]

[4] physic ©   (20.02.05 15:38)

А k в каком диапазоне меняется?


 
physic ©   (2005-02-20 15:54) [6]

k меняется от 1 до 256 или 1000, по-разному
если попытаться удалить первую точку после цикла, то появляется непонятная точка (1,0) вместо (1,100000), а если сделать это до цикла, то все в порядке
спасибо огромное, я неделю искал ответ


 
physic ©   (2005-02-20 16:09) [7]

возникла еще одна проблемка: поскольку первая точка была (0,0), то чарт ее не забыл (хоть и удалил), и при построении графика всегда начинает ординату с нуля. но поскольку у меня эта базовая линия строится на фоне спектра, то получается идиотское масштабирование


 
olookin ©   (2005-02-20 16:33) [8]

[7] physic ©   (20.02.05 16:09)

Масштабируй сам:

procedure ChartMinMax(NChart: TChart);
var i,ra,la,ba: integer;
   maxr,minr,tmpr,minl,maxl,tmpl,minb,maxb,tmpb: double;
begin
 with NChart do begin la:=0; ra:=0; ba:=0;
 for i:=0 to SeriesCount-1 do
 if (Series[i].Active) and (Series[i].XValues.Count<>0) then begin
 if Series[i].VertAxis=aLeftAxis then begin tmpl:=Series[i].MinYValue;
 if la=0 then minl:=tmpl; if minl>tmpl then minl:=tmpl;
 tmpl:=Series[i].MaxYValue;
 if la=0 then maxl:=tmpl; if maxl<tmpl then maxl:=tmpl; Inc(la); end;
 if Series[i].VertAxis=aRightAxis then begin tmpr:=Series[i].MinYValue;
 if ra=0 then minr:=tmpr; if minr>tmpr then minr:=tmpr;
 tmpr:=Series[i].MaxYValue;
 if ra=0 then maxr:=tmpr; if maxr<tmpr then maxr:=tmpr; Inc(ra); end;
 if Series[i].HorizAxis=aBottomAxis then begin tmpb:=Series[i].MinXValue;
 if ba=0 then minb:=tmpb; if minb>tmpb then minb:=tmpb;
 tmpb:=Series[i].MaxXValue;
 if ba=0 then maxb:=tmpb; if maxb<tmpb then maxb:=tmpb; Inc(ba); end; end;

 if la<>0 then begin
 tmpl:=(maxl-minl)*0.1; if tmpl=0 then tmpl:=10;
 maxl:=maxl+tmpl; minl:=minl-tmpl;
 LeftAxis.SetMinMax(minl,maxl); end else LeftAxis.SetMinMax(0,0);
 if ra<>0 then begin
 tmpr:=(maxr-minr)*0.1; if tmpr=0 then tmpr:=10;
 maxr:=maxr+tmpr; minr:=minr-tmpr;
 RightAxis.SetMinMax(minr,maxr); end else RightAxis.SetMinMax(0,0);
{  tmpb:=(maxb-minb)*0.1; if tmpb=0 then tmpb:=10;
 maxb:=maxb+tmpb; minb:=minb-tmpb; BottomAxis.SetMinMax(minb,maxb);} end;
end;


 
physic ©   (2005-02-20 17:04) [9]

я попробовал другую идею: вместо (0,0) задать (0,х), где х - близкая к минимуму спектра величина. вроде работает. однако остается проблема с перерисовкой графика при загрузке нового спектра: не могу удалить базовую линию, возникает List Index Error.

procedure TMainForm.FileOpen(Sender: TObject);
begin
 if OpenDialog.Execute then
 begin
 file_name:=OpenDialog.FileName;
 spectrum.Free;    
//  series_base.Clear;  //очистка базовой линии

 spedt_From.Enabled:=True;
 spedt_to.Enabled:=True;

 spectrum:=tspectrum_.TSpectrum.Create;
 spectrum.read_head(file_name, spectrum);
 spectrum.read_int_table(file_name, spectrum);

//  series_base.Clear;  //очистка базовой линии
 spectrum.plot_gr(spectrum, series_graph, spectrum.ftable, spedt_From.Value, spedt_to.Value);
 end;
end;


 
olookin ©   (2005-02-20 17:07) [10]

[9] physic ©   (20.02.05 17:04)

Честно говоря, по коду ничего не ясно. Может series_base не создана?


 
physic ©   (2005-02-20 17:08) [11]

она создана на этапе разработки приложения :)


 
olookin ©   (2005-02-20 17:09) [12]

[9] physic ©   (20.02.05 17:04)

Насчет масштабирования. Забыл, что есть просто методы Axis.SetMinMax()


 
physic ©   (2005-02-20 17:29) [13]

Отлично! С остальным разберусь.


 
physic ©   (2005-02-20 17:39) [14]

А кто-нибудь знает о подобных багах, но не при передаче координат, а при очистке графика? Может, я и с ним столкнулся.



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

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

Наверх




Память: 0.5 MB
Время: 0.037 c
1-1108623343
Innuendo
2005-02-17 09:55
2005.03.06
MDIChild Form


1-1109071003
mmms
2005-02-22 14:16
2005.03.06
Ребят, подскажите, как можно "таскать" TGroupBox по форме


14-1108393395
}|{yk
2005-02-14 18:03
2005.03.06
Губернатор Харьковской области - программист!


14-1108449697
Чайнище
2005-02-15 09:41
2005.03.06
Алгоритм генератора?


10-1085559954
kost
2004-05-26 12:25
2005.03.06
Как создать простое приложение corba для работы с БД