![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TChart не строит ординату больше 1817 [D6]
physic © (2005-02-20 14:37:00)вот простейший код, до ординаты 1817 все в порядке, а потом: Invalid Pointer Operation
procedure TForm1.Button1Click(Sender: TObject);
begin
chart1.Series[0].AddXY(1,1818);
end;
physic (2005-02-20 17:39:00) [1]А кто-нибудь знает о подобных багах, но не при передаче координат, а при очистке графика? Может, я и с ним столкнулся.
physic (2005-02-20 17:29:00) [2]Отлично! С остальным разберусь.
olookin (2005-02-20 17:09:00) [3][9] physic © (20.02.05 17:04)
Насчет масштабирования. Забыл, что есть просто методы Axis.SetMinMax()
physic (2005-02-20 17:08:00) [4]она создана на этапе разработки приложения :)
olookin (2005-02-20 17:07:00) [5][9] physic © (20.02.05 17:04)
Честно говоря, по коду ничего не ясно. Может series_base не создана?
physic (2005-02-20 17:04:00) [6]я попробовал другую идею: вместо (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 16:33:00) [7][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 16:09:00) [8]возникла еще одна проблемка: поскольку первая точка была (0,0), то чарт ее не забыл (хоть и удалил), и при построении графика всегда начинает ординату с нуля. но поскольку у меня эта базовая линия строится на фоне спектра, то получается идиотское масштабирование
physic (2005-02-20 15:54:00) [9]k меняется от 1 до 256 или 1000, по-разному
если попытаться удалить первую точку после цикла, то появляется непонятная точка (1,0) вместо (1,100000), а если сделать это до цикла, то все в порядке
спасибо огромное, я неделю искал ответ
olookin (2005-02-20 15:48:00) [10][4] physic © (20.02.05 15:38)
А k в каком диапазоне меняется?
physic (2005-02-20 15:38:00) [11]Спасибо, только не мог бы ты описать идею этого метода, а то он не работает в моей программе. И где можно прочесть про остальные глюки (если они есть)?
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:18:00) [12][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:12:00) [13]ох...ть!!!!!!! а что мне делать?!! неужели через канву?!!
а ты не мог бы поподробнее описать баг, может, я его обойду?
olookin (2005-02-20 15:06:00) [14]physic © (20.02.05 14:37)
Это известный баг TChart. Так как исходников нет, то выяснить причину нельзя.