1

I am using Delphi 11 VCL TChart to create a graph. The X value is not being considered for the Horizontal Axis. The bars are not at expected positions neither are the Labels. I have the entire code here. Output with Title. Output without title . TChart has been simply dropped on the Form1 without any adjustments done.

procedure TForm1.FormShow(Sender: TObject);
  procedure AddOneDay(nDay,nVal1,nVal2,nVal3:Integer;wTitle:String) ;
  var
    SuccessSeries: TBarSeries;
    AlertsSeries: TBarSeries;
    ErrorsSeries: TBarSeries;
  begin
    SuccessSeries:=TBarSeries.Create(FChart);
    AlertsSeries:=TBarSeries.Create(FChart);
    ErrorsSeries:=TBarSeries.Create(FChart);

    SuccessSeries.ParentChart:=FChart ;
    AlertsSeries.ParentChart:=FChart ;
    ErrorsSeries.ParentChart:=FChart ;

    SuccessSeries.BarStyle := bsRectGradient;
    AlertsSeries.BarStyle := bsRectGradient;
    ErrorsSeries.BarStyle := bsRectGradient;

    SuccessSeries.Marks.Visible := False;
    AlertsSeries.Marks.Visible := False;
    ErrorsSeries.Marks.Visible := False;

    if nDay<>1 then
    begin  // Need just one set of Legends
      SuccessSeries.Legend.Visible:=False;
      AlertsSeries.Legend.Visible:=False;
      ErrorsSeries.Legend.Visible:=False;
    end
    else
    begin
      SuccessSeries.Legend.Text:='Errors' ;
      AlertsSeries.Legend.Text:='Alerts' ;
      ErrorsSeries.Legend.Text:='Success' ;
    end;

    SuccessSeries.StackGroup:=nDay ;
    AlertsSeries.StackGroup:=nDay ;
    ErrorsSeries.StackGroup:=nDay ;

    SuccessSeries.Transparency:=30 ;
    AlertsSeries.Transparency:=30 ;
    ErrorsSeries.Transparency:=30 ;

//  SuccessSeries.AddXY((nDay-1)*10,nVal1,wTitle,$00615CFC);
//  AlertsSeries.AddXy((nDay-1)*10,nVal2,wTitle,$00ECC2AA);
//  ErrorsSeries.AddXy((nDay-1)*10,nVal3,wTitle,$0086F76F);

    SuccessSeries.AddXY((nDay-1)*10,nVal1,'',$00615CFC);
    AlertsSeries.AddXy((nDay-1)*10,nVal2,'',$00ECC2AA);
    ErrorsSeries.AddXy((nDay-1)*10,nVal3,'',$0086F76F);
  end;
begin
  FChart.SeriesList.Clear;
  with FChart.Title do
  begin
    Font.Size := 15 ;
    Font.Color := clBlack;
    Text.Text:='Performance Chart';
  end;

  AddOneDay(1,10,20,30,'Day-1');
  AddOneDay(2,10,20,30,'Day-2');
  AddOneDay(3,10,20,30,'Day-3');
  AddOneDay(4,10,20,30,'Day-4');
  AddOneDay(5,10,20,30,'Day-5');
  AddOneDay(6,10,20,30,'Day-6');
  AddOneDay(7,10,20,30,'Day-7');
end;

Tom Brunberg
  • 20,312
  • 8
  • 37
  • 54
Seekr
  • 13
  • 4
  • A quick look: Create three bar chart series total not three per day. Add data to each series after they are created with lines like `Chart1.Series[0].Add(30,'Day-6');`. – Brian Aug 25 '23 at 15:26

1 Answers1

3

Your code is overcomplex and is adding far too many series. Run the code below against an empty TChart dropped on a form. The X axis labels will be the text passed in by the .Add.

begin
    Chart1.AddSeries(TBarSeries.create(Chart1));        
    Chart1.AddSeries(TBarSeries.create(Chart1));

    Chart1.Series[0].Add(10,'Day-1');
    Chart1.Series[1].Add(20,'Day-1');
    Chart1.Series[0].Add(15,'Day-2');
    Chart1.Series[1].Add(25,'Day-2');
end;

Bar chart produced by code in answer.

A rewrite of your code to give desired result:

procedure TForm1.Button1Click(Sender: TObject);
  var
    SuccessSeries: TChartSeries;
    AlertsSeries: TChartSeries;
    ErrorsSeries: TChartSeries;

  procedure AddOneDay(nDay,nVal1,nVal2,nVal3:Integer;wTitle:String) ;
  begin
    SuccessSeries.Add(nVal1,wTitle,$00615CFC);
    AlertsSeries.Add(nVal2,wTitle,$00ECC2AA);
    ErrorsSeries.Add(nVal3,wTitle,$0086F76F);
  end;

begin
  with FChart.Title do
  begin
    Font.Size := 15 ;
    Font.Color := clBlack;
    Text.Text:='Performance Chart';
  end;
  SuccessSeries := FChart.AddSeries(TBarSeries.Create(FChart));
  AlertsSeries := FChart.AddSeries(TBarSeries.Create(FChart));
  ErrorsSeries := FChart.AddSeries(TBarSeries.Create(FChart));

  TBarSeries(SuccessSeries).BarStyle := bsRectGradient;
  TBarSeries(AlertsSeries).BarStyle := bsRectGradient;
  TBarSeries(ErrorsSeries).BarStyle := bsRectGradient;

  SuccessSeries.Legend.Text:='Errors' ;
  AlertsSeries.Legend.Text:='Alerts' ;
  ErrorsSeries.Legend.Text:='Success' ;

  SuccessSeries.Marks.Visible := False;
  AlertsSeries.Marks.Visible := False;
  ErrorsSeries.Marks.Visible := False;

  SuccessSeries.Transparency:=30 ;
  AlertsSeries.Transparency:=30 ;
  ErrorsSeries.Transparency:=30 ;

  AddOneDay(1,10,20,30,'Day-1');
  AddOneDay(2,10,20,30,'Day-2');
  AddOneDay(3,10,20,30,'Day-3');
  AddOneDay(4,10,20,30,'Day-4');
  AddOneDay(5,10,20,30,'Day-5');
  AddOneDay(6,10,20,30,'Day-6');
  AddOneDay(7,10,20,30,'Day-7');
end;
Brian
  • 6,717
  • 2
  • 23
  • 31