TeeChart устраняет ошибку CalcClickedPart из-за CalcVisiblePoints: = false - PullRequest
0 голосов
/ 31 августа 2018

Delphi 10.1 Pro, VCL со встроенными элементами управления Teechart. У меня есть серия Line с большим количеством точек, намного больше, чем разрешение экрана. Я также использую Marks. Чтобы метки всегда были видны, для CalcVisiblePoints установлено значение false. Однако это вызывает некорректное поведение CalcClickedPart в событии Chart1MouseMove. Я добавил tLabel в верхнем левом углу, который показывает результат части CalcClickedPart. Курсор находится вне графика, отмечен вертикальной КРАСНОЙ стрелкой на следующем изображении: embedded image Часть: cpNone , как и ожидалось.

Проблема возникает после панорамирования / прокрутки графика (вправо в следующем примере). Курсор, как и прежде, находится справа от самого чата. На этот раз сообщаемая часть - cpSeriesPointer , что неверно. Легенда также выбрана, что также неверно. embedded image

Создание серии выглядит следующим образом:

procedure TForm2.FormCreate(Sender: TObject);
var i: Integer;
begin
  // Chart setting
  Chart1.View3D:=false;
  Chart1.Legend.Visible := true;
  Chart1.Legend.CheckBoxes := true;
  // Left Axis
  Chart1.Axes.Left.Automatic:= false;
  Chart1.Axes.Left.Minimum := 0;
  Chart1.Axes.Left.Maximum := 20;

  // Adding a Line Series
  with Chart1.AddSeries(TLineSeries) as TLineSeries do
    begin
      for i := 1 to 1000 do
        AddXY(i, 10);
      CalcVisiblePoints := false; // <- THE Problematic property
      Pen.Width:= 3;
    end;
end;

Событие Chart1MouseMove:

procedure TForm2.Chart1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
Var
  ClickedPart: tChartClickedPart;
  sCursorText: string;
begin
  sCursorText := '';

  Chart1.CalcClickedPart(Point(X, Y), ClickedPart); // Return information about the TeeChart component below the Mouse pointer at an X,Y location.
  Case ClickedPart.Part of
    cpNone          : sCursorText := 'cpNone';
    cpLegend        : sCursorText := 'cpLegend';
    cpAxis          : sCursorText := 'cpAxis';
    cpSeries        : sCursorText := 'cpSeries';
    cpTitle         : sCursorText := 'cpTitle';
    cpFoot          : sCursorText := 'cpFoot';
    cpChartRect     : sCursorText := 'cpChartRect';
    cpSeriesMarks   : sCursorText := 'cpSeriesMarks';
    cpSeriesPointer : sCursorText := 'cpSeriesPointer ';
    cpSubTitle      : sCursorText := 'cpSubTitle';
    cpSubFoot       : sCursorText := 'cpSubFoot';
    cpAxisTitle     : sCursorText := 'cpAxisTitle';
  end;

  Label1.Caption := sCursorText;
end;

Есть идеи, как обойтись?

Спасибо Reron

...