Форум: "Основная";
Текущий архив: 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