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

Вниз

Выбор точек, веток и и х движение в TChart   Найти похожие ветки 

 
mnj   (2010-12-10 11:43) [0]

Доброго времени суток всем.
Подскажите пожалуйста: можно ли в стандартном TChart выбирать и двигать точки графика по отдельности или группой, а также его ветки? Если одну точку определить можно по OnClickSeries, то OnMouseMove или OnMouseDown, OnMouseUp дают только пикселы канвы.


 
12 ©   (2010-12-13 09:14) [1]


> выбирать и двигать точки графика по отдельности


> одну точку определить можно по OnClickSeries


> или группой

соседние точки в серии +-1 имеют индекс

> а также его ветки

видимо, вся серия?


> двигать точки графика

а если в

> OnMouseMove

ловить не XY смещения по канве, а дельту смещения считать и на график ее?


 
mnj   (2010-12-14 15:44) [2]

Все это хорошо, но ведь точку на графике нужно получить во время OnMouseDown, а OnClickSeries дает ее уже после отпускания клавиши. А при  нажатой клавише?


 
12 ©   (2010-12-15 12:06) [3]

procedure TForm1.cht1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
  CS: TChartSeries;
begin
  CS := cht1.GetASeries;
  ShowMessage( "cht1MouseDown " + CS.Name);
end;


 
12 ©   (2010-12-15 12:40) [4]

не, ерунда..
вот так

procedure TForm1.cht1ClickSeries(Sender: TCustomChart;
 Series: TChartSeries; ValueIndex: Integer; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 Series.Tag := 1;
end;

procedure TForm1.cht1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
  P:TPoint;
  i:Integer;
  CS: TChartSeries;
begin
  P := cht1.GetCursorPos;

  for i:= 0 to cht1.SeriesCount -1 do
    cht1.Series[i].Clicked(P.X, P.Y);

  CS := nil;
  for i:= 0 to cht1.SeriesCount -1 do
   if cht1.Series[i].Tag = 1 then CS := cht1.Series[i];

  for i:= 0 to cht1.SeriesCount -1 do
    cht1.Series[i].Tag := 0;

  if CS <> nil then
    ShowMessage(CS.Name);
end;


 
Бурундук   (2010-12-15 19:17) [5]

 TForm1 = class(TForm)
 // ...
 private
   FActiveSeries: TChartSeries;
   FActiveIndex: Integer;
 end;

procedure TForm1.Chart1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var idx: Integer;
   part: TChartClickedPart;

   // not in line between points
   function IsExactlyInPoint: Boolean;
   var xxi, yyi: Double;
       Xi, Yi: Integer;
       Sensitivity: Integer;
   begin
     xxi := part.ASeries.XValue[part.PointIndex];
     yyi := part.ASeries.YValue[part.PointIndex];

     Xi := Chart1.BottomAxis.CalcPosValue(xxi);
     Yi := Chart1.LeftAxis.CalcPosValue(yyi);

     //Sensitivity := TLineSeries(part.ASeries).Pointer.HorizSize
     Sensitivity := 5;
     Result := (Abs(X - Xi) < Sensitivity)and(Abs(Y - Yi) < Sensitivity);
   end;

begin
 Chart1.CalcClickedPart(Point(X, Y), part);

 if (part.Part = cpSeries)and IsExactlyInPoint then
 begin
   FActiveSeries := part.ASeries;
   FActiveIndex := part.PointIndex;
   Chart1.AllowZoom := False;
 end
 else
 begin
   FActiveSeries := nil;
   Chart1.AllowZoom := True;
 end;
end;

procedure TForm1.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var xx, yy: Double;
begin
 if not (ssLeft in Shift) then Exit;
 if not Assigned(FActiveSeries) then Exit;

 xx := Chart1.BottomAxis.CalcPosPoint(X);
 yy := Chart1.LeftAxis.CalcPosPoint(Y);

 FActiveSeries.XValue[FActiveIndex] := xx;
 FActiveSeries.YValue[FActiveIndex] := yy;
end;

procedure TForm1.Chart1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 FActiveSeries := nil;
 Chart1.AllowZoom := True;
end;


 
mnj   (2010-12-20 16:35) [6]

Спасибо всем, хорошо получается. Мой вариант с одной точкой тоже рабочий, хотя и кривее намного. Но с движением серии все едино пока не выходит. Нужно двигать всю серию синхронно, а ведь рассчитать новый Y можно только для одной точки (смещение только по вертикали).


 
mnj   (2010-12-24 12:16) [7]

Всем спасибо. Сделал.



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
15-1326421412
Андрей_1
2012-01-13 06:23
2012.05.20
Delphi 6 и Windows 7


4-1256831521
reactor
2009-10-29 18:52
2012.05.20
Как считать информацию из Combobox-а


2-1326739475
Anthony
2012-01-16 22:44
2012.05.20
Коррекция ширины колонки в TStringGrid - не работает...


15-1326278247
>|<
2012-01-11 14:37
2012.05.20
Печать наклейки на USB-принтере


2-1326879377
Wadim
2012-01-18 13:36
2012.05.20
Подскажите насчет потоков Thread