Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c