TeeChart CalcClickedPart Ошибка после Marks.Item [nPoint] .Visible: = false - PullRequest
0 голосов
/ 23 сентября 2018

Delphi 10.1 Pro, VCL со встроенными элементами управления Teechart.CalcClickedPart показывает cpSeriesMarks после того, как метки были скрыты в том месте, где они были показаны ранее.

Возможно, я не удаляю метки правильно, только скрываю их, или в CalcClickedPart есть ошибка.Пожалуйста, совет.

Я добавил tLabel в верхнем левом углу, который показывает результат части CalcClickedPart.Также имеется кнопка для переключения видимости меток.

Создание серии и меток:

procedure TForm2.FormCreate(Sender: TObject);
var i: Integer;
begin
  Chart1.View3D:=false;
  with Chart1.AddSeries(TLineSeries) as TLineSeries do
    begin
      for i := 0 to 9 do
        begin
          AddXY(i, 10);
          Marks.Item[i].Visible := false; // Hide all Marks
        end;

      Marks.Show; // A global Marks enabled.
      Marks.Item[5].Visible := true;
    end;
end;

Тест CalcClickedPart:

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;

Переключение видимости меток:

procedure TForm2.btnMarksToggleClick(Sender: TObject);
begin
  with (Chart1[0] as tLineSeries).Marks.Item[5] do
    Visible := not Visible;
end;

Отметки видны.Правильный cpSeriesMarks (курсор в красной стрелке):

Нажмите кнопку, чтобы скрыть метки.Получите следующее неправильно CalcClickedPart. Метки НЕ видны.Неправильный cpSeriesMarks (курсор в красной стрелке):

Есть ли у вас какие-либо идеи для обхода?

ps Ранее я обнаружил ошибку с CalcClickedPart, когда CalcVisiblePoints: = false.Это еще одна проблема, совсем не связанная с CalcVisiblePoints.

Спасибо, Рерон

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Мне удалось воспроизвести проблему здесь, поэтому я добавил ее в общедоступный трекер ( # 2092 ).

Обратите внимание, что проблема в функции TSeriesMarks.Clicked.
Я уже исправил это для следующих версий.

В качестве обходного пути вы можете установить Positions.Item[5]:=nil:

procedure TForm2.btnMarksToggleClick(Sender: TObject);
const aMarksIndex = 5;
begin
  with (Chart1[0] as tLineSeries).Marks do
  begin
    with Item[aMarksIndex] do
      Visible := not Visible;

    if not Item[aMarksIndex].Visible then
       Positions.Items[aMarksIndex]:=nil;
  end;
end;
0 голосов
/ 23 сентября 2018

Без исходного кода мы можем только сделать выводы из поведения и справочной документации.Я обнаружил следующее:

  1. В документации говорится, что вызов метода Hide эквивалентен установке для свойства Visible значения False.

  2. .

    Установка Visible := False (или вызов Hide) для TMarksItem, по-видимому, имеет другой результат, чем установка Visible := False (или вызов Hide) для TMarksSeries.

Когда вы прячете один маркер Marks.Item[5].Visible := not Marks.Item[5].Visible, вы говорите TChart не рисовать этот конкретный маркер.Объект коллекции TMarksSeries все еще виден.

Если вы, с другой стороны, задали Marks.Visible := not Marks.Visible, вы скрываете всю коллекцию.

Поскольку мы не знаем внутреннюю логику CalcClickedPart() мы можем только догадываться, что это может быть что-то вроде следующего псевдокода при поиске маркеров:

if Collection visible then
  for each marker in collection
    if coords = xx then
      ClickedPart := cpSeriesMarks

IOW вопрос в том, должен ли быть тест также для видимости маркера.Является ли отсутствующий тест ошибкой, это другой вопрос.

Во всяком случае, в настоящее время кажется невозможным скрыть отдельные маркеры от CalcClickedPart(), только скрытие всей коллекции маркеров скрывает маркеры.

...