Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2012.05.20;
Скачать: [xml.tar.bz2];

Вниз

Выбор точек, веток и и х движение в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
2-1322308094
3asys
2011-11-26 15:48
2012.05.20
Передача видео и звука с помощью Indy


15-1320098450
Бездомный
2011-11-01 01:00
2012.05.20
Драйвер виртуальной звуковой карты


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


15-1326421412
Андрей_1
2012-01-13 06:23
2012.05.20
Delphi 6 и Windows 7


2-1326288747
JohnKorsh
2012-01-11 17:32
2012.05.20
Индикация версии программы.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский