TeeChart CalcClickedPart在Marks.Item [nPoint] .Visible之后出现的错误:= false

时间:2018-09-22 21:57:04

标签: delphi vcl teechart

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;

Marks is visible. A correct cpSeriesMarks (cursor in Red arrow):

按下按钮隐藏标记。将得到以下错误的CalcClickedPart。 Marks is NOT visible. An incorrect cpSeriesMarks (cursor in Red arrow):

您有解决的想法吗?

p.s以前,我在CalcVisiblePoints:= false时发现了CalcClickedPart的错误。 这是另一个问题,根本与CalcVisiblePoints无关。

谢谢 Reron

2 个答案:

答案 0 :(得分:2)

我已经能够在此处重现该问题,因此已将其添加到公共跟踪器(#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;

答案 1 :(得分:0)

没有源代码,我们只能从行为和帮助文档中得出结论。我发现了以下内容:

  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()隐藏单个标记,只有隐藏整个标记集合才能隐藏标记。