Teechart VCL - как изменить цвет границы меток и длину метки во время выполнения? - PullRequest
0 голосов
/ 30 мая 2020

Я использую Delphi 10.3-upd 1 с компонентом Teechart.

Во время выполнения мне нужно поставить отметки для c точек и настроить его текст, цвета и размеры. Мне удалось изменить текст с помощью следующих команд:

Chart1.[idxserie].Marks.Item[idxelement].Visible  := True;
Chart1.[idxserie].Marks.Iidxelement]].Font.Color  := clRed;
Chart1.[idxserie].Marks.item[idxelement].Text.Add('My text is here');

теперь мне нужно изменить цвет линии, которая связывает текст с точкой на кривой графика. Во время разработки это свойство находится по адресу:

Окно редактирования диаграммы:

      Series -- myserie1 -
                tab : Marks 
                           -- tab Arrows
                                         -- tab Border 
                                                     tab  -- Format     
                                                                 Button : Color 

Как мне получить доступ и изменить значение этого свойства во время выполнения?

Я уже пробовал:

Chart1.[idxserie].Marks.Arrow.Color  := clRed  // ==> nothing changed ! 

Здесь я меняю свойство во время разработки:

enter image description here

На картинке ниже пунктирная красная линия для некоторых точек, я хочу, чтобы она была другого цвета. Когда я использую Chart1. [Idxserie] .Marks.Arrow.Color: = clRed, он меняет цвет всех точек.

enter image description here

Я ценю вашу поддержку.

Спасибо.

1 Ответ

0 голосов
/ 01 июня 2020

Стрелка глобальная. Вы можете перезаписать его самостоятельно, используя одно из событий AfterDraw серии или диаграммы.

Пример: Создание:

procedure TForm1.FormCreate(Sender: TObject);
begin
  series1.FillSampleValues(5);
  series1.Marks.Visible := true; // A global flag. if false, no Mark will be visible

  series1.Marks[0].Visible := false;
  series1.Marks[1].Visible := true;
  series1.Marks[2].Visible := false;
  series1.Marks[3].Visible := true;
  series1.Marks[4].Visible := false;

  series1.Marks[3].Font.Color := clRed;
  series1.Marks[3].Font.Style := [fsBold];
  series1.Marks[3].Transparent:= true;

  series1.Marks.Arrow.Color    := clGreen;
  series1.Marks.ArrowLength    := 24;
  series1.Marks.Arrow.EndStyle := esFlat;
  series1.Marks.Arrow.Visible  := true;
end;

Теперь нарисуйте линию на холсте диаграммы:

procedure TForm1.Series1AfterDrawValues(Sender: TObject);
var
  nInx, nX, nY: integer;
begin
  for nInx := 0 to Series1.Count-1 do
    if Series1.Marks[nInx].Font.Color = clRed then
      begin
        nX := Series1.CalcXPos(nInx);
        nY := Series1.CalcYPos(nInx);
        Chart1.Canvas.Pen.Color := clRed;
        Chart1.Canvas.MoveTo(nX, nY);
        Chart1.Canvas.LineTo(nX, nY - series1.Marks.ArrowLength);
      end;
end;

Вы получите: enter image description here

...