Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > стандартный TChart свои метки на сериях


Автор: PupaJr 27.5.2013, 17:37
Добрый день.
Рисую несколько серий на стандартном чарте. Надо на них измерить затухающие колебания синусоиды по осям - нарисовать что-то типо размерных линий как на чертежах нажатием на самой канве - тык 1 точка, тык 2 точка и появилвсь линия между точками.
При этом при масштабировании надо чтобы линия и точки масштабировались следом, также перемещались...
Понятно надо - onmousemove, onclick, calcY... 
Код

procedure TForm4.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 chart1.SetFocus;
 xx:= timetostr(Chart1.Series[1].xScreenToValue(x));
 yy:= floattostrf(Chart1.Series[1].YScreenToValue(y),ffFixed,6,2);
 Edit3.Text:=datetostr(Chart1.Series[1].xScreenToValue(x));       //   Выводим данные под мышой
 Edit4.Text:=xx;       //
 Edit5.Text:=yy;       //
end;


 А обратно из данных  новую точку на канве нет..
Код

procedure TForm4.Chart1DblClick(Sender: TObject);
var x0,y0,x1,y1:integer;
begin
chart1.Canvas.Pen.Color:=clblue;
chart1.Canvas.Brush.Color:=clblue;
x0:=chart1.Series[1].CalcXPos(strtotime(xx)); //получаю из глобальных 
//эта функция даёт 0 или вообще бред.. но никак не время по оси Х
y0:=chart1.LeftAxis.CalcYPosValue(strtofloat(yy));      // значения под мышью
x1:=x0+2;
y1:=x0+2;  //размеры точки
x0:=x0-2;
y0:=y0-2;

пытаюсь нарисовать иничего не выходит.


M
Poseidon
При размещении кода пользуйтесь кнопкой "Код"


Автор: Beltar 27.5.2013, 20:49
А включить разметочные линии в отдельные серии?
Рисовать по канвасу графика занятие попахивающее мазохизмом, т. к. надо все изменения мониторить.

Автор: PupaJr 28.5.2013, 06:49
Спасибо, но это не информативно, нужно так как на приложенном рисунке, и при масштабировании всё двигалось вместе с графиком - тоесть надо сначала поймать данные по клику - это легго получается из координат мыши получаем данные в сериях, а потом при изменении масштаба или перемещении графика уже из запомненных данных получать новую точку на канве для новой прорисовки стрелок в процедуре "автердрав". Другого пути пока не вижу...

П.С. уведомление на почту не пришло - что есть ответ... (user posted image

Автор: Beltar 28.5.2013, 19:02
Я себе делал свой велосипед в виде многосерийного графика с автомасштабированием по выделенным зонам мышкой у которого для каждой серии могли добавляться еще прямоугольники. В принципе ничего там сложного нет, могу выложить, а там можно и переделать, это может быть проще, чем воевать с чЯйным-чартом. Помимо прочего он оптимизирован на сверхбольшие серии данных. Уровень совместимости по языку D2005 и выше, а если удалить объявления инлайнов, то пойдет и на D7. Особенность - обязательная сортировка точек по X перед отрисовкой, но она элементарно отключается.

Автор: PupaJr 29.5.2013, 07:14
Спасибо, я на D6 сижу пока... как гарантия того что проект будет работать и на стрых ОС без всяких там обновлений.
Спасибо за помощь, но проект уже весь сделан со стандартным TChart... и он легко у меня печатается... а вот для "наглядности" хотел бы сделать эти "стрелки"..
Странно вот одно, почему не работает    

Series1.CalcXPosValue(strtotime(xx))- со шкалой времени... или я не правильно пользуюсь нахождением точки на канве из точки по оси (времени).. даёт почемуто отрицательное число...

Автор: PupaJr 4.6.2013, 16:27
Вот сделал сам user posted image
нахожу точку и рисую, а в afterdraw просто повторяю проделаную здесь процедуру
Код
 xi:=0;
 yi:=0;
 j:=-1+strtoint(form1.Edit18.Text);       // берём индекс КТК
 zn:=0;
 tmpx:=strtotime(xx);    //получили значение с экрана под мышью
 tmpy:=strtofloat(yy);    //получили значение с экрана под мышью
 for i:=0 to chart1.Series[j].XValues.Count-1 do                  //перебераю точки в КТК
   begin
     aaa:=chart1.Series[j].XValue[i];                // где ближайшая первая есть по значению
     strtt:=timetostr(aaa);
     aaa:=strtotime(strtt);
     if (tmpX<=aaa)and(zn=2) then
       begin
        xi:=i-1;
        zn:=3
       end;
     if (tmpX>=aaa)and (zn=0) then zn:=2;
   end;
 tx0:=Chart1.BottomAxis.CalcXPosValue(chart1.Series[j].XValue[xi]);
 zn:=0;
 for i:=0 to chart1.Series[j].YValues.Count-1 do
   begin
     aaa:=chart1.Series[j].YValue[i];
     if (tmpY>=aaa) then zn:=2;
     if (tmpY<=aaa)and(zn=2) then
       begin
        yi:=i;
        zn:=3
       end;
   end;
 ty0:=Chart1.leftAxis.CalcYPosValue(chart1.Series[j].YValue[yi]);
 tx1:=tx0+2;
 ty1:=ty0+2;
 tx0:=tx0-2;
 ty0:=ty0-2;
 point.Left:=tx0;
 point.Top:=ty0;
 point.Right:=tx1;
 point.Bottom:=ty1;
 chart1.Canvas.Brush. Color:=clblue;
 chart1.Canvas.Pen.Color:=clblue;

вопрос решён )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)