vcl-404991-expresscharts-appearance-customization-vcl-chart-appearance-customization-events.md
In addition to general appearance settings and palettes, the Chart control has dedicated customization events that allow you to change the appearance of individual visual elements based on certain conditions or events in your application.
Chart appearance customization events occur every time the Chart control is about to determine how to draw the corresponding visual element. Any changes made in handlers of these events have higher priority than all other appearance customization options.
The OnGetSeriesPointDrawParameters event available at the diagram level allows you to change the appearance of individual series points.
The following code example demonstrates a diagram’s OnGetSeriesPointDrawParameters event handler that changes the appearance settings of all bars that display peak values in a Simple Bar series.
procedure TMyForm.cdBarGetSeriesPointDrawParameters(Sender: TdxChartCustomDiagram;
AArgs: TdxChartGetSeriesPointDrawParametersEventArgs);
var
ABarDrawParameters: TdxChartBarSeriesPointDrawParameters;
ASeries: TdxChartCustomSeries;
AIndex: Integer;
begin
if AArgs.SeriesPoint.Series.Caption = '2020' then
begin
if AArgs.DrawParameters.ClassType <> TdxChartBarSeriesPointDrawParameters then Exit;
ABarDrawParameters := AArgs.DrawParameters as TdxChartBarSeriesPointDrawParameters;
AIndex := AArgs.SeriesPoint.Index;
ASeries := AArgs.SeriesPoint.Series;
if ((AIndex = 0) and (ASeries.Points.Values[AIndex] > ASeries.Points.Values[AIndex + 1])) or
((AIndex > 0) and (AIndex < ASeries.Points.Count - 1) and
(ASeries.Points.Values[AIndex] > ASeries.Points.Values[AIndex + 1]) and
(ASeries.Points.Values[AIndex] > ASeries.Points.Values[AIndex - 1])) then
begin
ABarDrawParameters.Appearance.BeginUpdate;
ABarDrawParameters.Appearance.FillOptions.Color := TdxAlphaColors.OrangeRed;
ABarDrawParameters.Appearance.FillOptions.Mode := TdxFillOptionsMode.Hatch;
ABarDrawParameters.Appearance.FillOptions.HatchStyle := TdxFillOptionsHatchStyle.ForwardDiagonal;
ABarDrawParameters.Appearance.FillOptions.Color2 := TdxAlphaColors.Teal;
ABarDrawParameters.Appearance.StrokeOptions.Color := TdxAlphaColors.Red;
ABarDrawParameters.Appearance.StrokeOptions.Style := TdxStrokeStyle.Solid;
ABarDrawParameters.Appearance.EndUpdate;
end;
end;
end;
void __fastcall TMyForm::cdBarGetSeriesPointDrawParameters(TdxChartCustomDiagram *Sender
TdxChartGetSeriesPointDrawParametersEventArgs *AArgs)
{
TdxChartBarSeriesPointDrawParameters *ABarDrawParameters;
TdxChartCustomSeries *ASeries;
int AIndex;
// ...
if(AArgs->SeriesPoint->Series->Caption == "2020")
{
if(AArgs->DrawParameters->ClassType() != __classid(TdxChartBarSeriesPointDrawParameters)) { return; }
ABarDrawParameters = dynamic_cast<TdxChartBarSeriesPointDrawParameters*>(AArgs->DrawParameters);
AIndex = AArgs->SeriesPoint->Index;
ASeries = AArgs->SeriesPoint->Series;
if(((AIndex == 0) && (ASeries->Points->Values[AIndex] > ASeries->Points->Values[AIndex + 1])) ||
((AIndex > 0) && (AIndex < ASeries->Points->Count - 1) &&
(ASeries->Points->Values[AIndex] > ASeries->Points->Values[AIndex + 1]) &&
(ASeries->Points->Values[AIndex] > ASeries->Points->Values[AIndex - 1])))
{
ABarDrawParameters->MarkerAppearance->FillOptions->Color = TdxAlphaColors::Red;
ABarDrawParameters->Appearance->BeginUpdate();
ABarDrawParameters->Appearance->FillOptions->Color = TdxAlphaColors::OrangeRed;
ABarDrawParameters->Appearance->FillOptions->Color2 = TdxAlphaColors::Teal;
ABarDrawParameters->Appearance->FillOptions->Mode = TdxFillOptionsMode::Hatch;
ABarDrawParameters->Appearance->FillOptions->HatchStyle = TdxFillOptionsHatchStyle::ForwardDiagonal;
ABarDrawParameters->Appearance->StrokeOptions->Color = TdxAlphaColors::Red;
ABarDrawParameters->Appearance->StrokeOptions->Style = TdxStrokeStyle::Solid;
ABarDrawParameters->Appearance->EndUpdate();
}
}
}
Refer to the following topic descriptions for more code examples and detailed information on all available options:
TdxChartCustomDiagram.OnGetSeriesPointDrawParametersAllows you to customize the appearance of individual series points.TdxChartPalette.GetColorsForIndexReturns a stored or interpolated palette item for the target index.
OnGetValueLabelDrawParameters and OnGetTotalLabelDrawParameters[1] events available at the diagram level allow you to customize individual series labels.
The code example below displays different measurement units in value labels. If a series value exceeds one million, the corresponding value label displays the million digits followed by the M character. If a series value exceeds one thousand but is less than one million, the corresponding value label displays the thousands digits followed by the k character.
procedure TMyForm.cdAreaGetValueLabelDrawParameters(Sender: TdxChartCustomDiagram;
AArgs: TdxChartGetValueLabelDrawParametersEventArgs);
begin
if AArgs.SeriesPoint.Value >= 1000 * 1000 then // Millions
AArgs.Text := Format('%.1fM', [AArgs.SeriesPoint.Value / (1000 * 1000)])
else if AArgs.SeriesPoint.Value >= 1000 then // Thousands
AArgs.Text := Format('%.0fk', [AArgs.SeriesPoint.Value / 1000])
else
AArgs.Text := Format('%0f', [AArgs.SeriesPoint.Value]);
end;
void __fastcall TMyForm::cdAreaGetValueLabelDrawParameters(TdxChartCustomDiagram *Sender,
TdxChartGetValueLabelDrawParametersEventArgs *AArgs)
{
if(AArgs->SeriesPoint->Value >= 1000 * 1000) // Millions
AArgs->Text = Format("%.1fM", {AArgs->SeriesPoint->Value / (1000 * 1000)});
else if(AArgs->SeriesPoint->Value >= 1000) // Thousands
AArgs->Text = Format("%1.0fk", {AArgs->SeriesPoint->Value / 1000});
else
AArgs->Text = Format("%0f", {AArgs->SeriesPoint->Value});
}
Refer to OnGetValueLabelDrawParameters and OnGetTotalLabelDrawParameters event descriptions for detailed information on all parameters accessible in event handlers.
Footnotes
See Also