如何使用Teechart(Delphi)从数据源布置正确的x轴(底轴)标签

时间:2018-07-27 16:57:27

标签: delphi-xe2 teechart

我想寻求一些帮助,以在堆积的条形图的底部显示数据源的客户名。从我研究的所有示例看来,图表底部的轴标签是TeeChart看着数据源“自动”设置的。但是我似乎无法使其正常工作。下面是我要实现的目标的图片。

Picture of what I am trying to achieve

我有三个系列”,可用于构建堆积图。我提供了用于每个查询的每个数据源的图片。

Datasources for three series' queries

从我的研究看来,我也可以使用DBChart1GetAxisLabel()自定义设置标签。但是我正在努力了解如何确保正确的自定义标签名称与查询中的正确“客户端名称”相关联。

以下是我如何构建图表的代码示例:

    procedure TfrmSupplierAnalytics.btnOKClick(Sender: TObject);
    var
      S,NewTypeStr, test, clientSql : string;
      var seriasNormalOrders:TBarSeries;
      var seriasCreditNoteOrders:TBarSeries;
      var seriasPartialOrders:TBarSeries;
      N, i : integer;
    begin
       qCreditNoteOrders.Close;
       qNormalOrders.Close;
       qPartialOrders.Close;
       qGetClientIdFromName.Close;
       qClients.Close;

       DBChart1.CleanupInstance;
       DBChart1.ClearChart;

       try
          for N := 0 to clbClients.Items.Count-1 do
            if clbClients.State[N] = cbChecked then begin
              test :=  string(clbClients.Items[N]);
              NewTypeStr := NewTypeStr + '(E.clientid  = '+ 
    IntToStr(FindClientID(test)) + ')';
              clientSql := clientSql +  NewTypeStr;
              NewTypeStr := ' or ';
            end;
          except
             on E : Exception do
              ShowMessage(E.ClassName+' error raised, with message : 
    '+E.Message);
          end;

       OpenQueryCreditNoteOrders(clientSql);
       OpenQueryPartialOrders(clientSql);
       OpenQueryNormalOrders(clientSql);

       seriasNormalOrders :=TBarSeries.Create(self);
       DBChart1.AddSeries(seriasNormalOrders);

       seriasCreditNoteOrders :=TBarSeries.Create(self);
       DBChart1.AddSeries(seriasCreditNoteOrders);

       seriasPartialOrders :=TBarSeries.Create(self);
       DBChart1.AddSeries(seriasPartialOrders);

       seriasNormalOrders.MultiBar := mbStacked;
       seriasCreditNoteOrders.MultiBar := mbStacked;
       seriasPartialOrders.MultiBar := mbStacked;

       seriasNormalOrders.Marks.Visible := true;
       seriasNormalOrders.MarksLocation:= mlCenter;
       seriasNormalOrders.MarksOnBar := True;

       seriasNormalOrders.YValues.ValueSource := 'NormalOrders';
       seriasNormalOrders.DataSource := qNormalOrders;
       seriasNormalOrders.Title := 'Correct Orders';
       seriasNormalOrders.Marks.Visible := True;
       seriasNormalOrders.Marks.AutoPosition := true;

       seriasCreditNoteOrders.YValues.ValueSource := 'CreditNoteOrders';
       seriasCreditNoteOrders.DataSource := qCreditNoteOrders;
       seriasCreditNoteOrders.Title := 'Credit Note Orders';

       seriasPartialOrders.YValues.ValueSource := 'PartialOrders';
       seriasPartialOrders.DataSource := qPartialOrders;
       seriasPartialOrders.Title := 'Short Orders';

       seriasNormalOrders.CheckDataSource;
       seriasCreditNoteOrders.CheckDataSource;
       seriasPartialOrders.CheckDataSource;
     end;

因此,总而言之,我的代码中是否缺少一些设置,这些设置会在每个堆叠的条下面显示“ clientname”,还是我必须使用自定义标签? 如果必须使用自定义标签,我将对如何确保将数据源中的正确“客户端名称”替换为ValueIndex中正确的DBChart1GetAxisLabel上的一些指导?

谢谢。

1 个答案:

答案 0 :(得分:1)

我设法得到了答案。

您可以设置XLabelsSource以显示数据源中的文本,然后将Marks.Style系列设置为smsValue以强制其显示值而不是显示标签。即:

<pre>
procedure TForm1.FormCreate(Sender: TObject);
var ADOQuery1: TADOQuery;
i: Integer;
begin
ADOQuery1:=TADOQuery.Create(Self);
with ADOQuery1 do
begin
ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data 
Source=TeeChart Pro Database';
SQL.Add('SELECT SALARY, LASTNAME from Employee WHERE LASTNAME='#39'Smith'#39);
end;

for i:=0 to 1 do
with DBChart1.AddSeries(TBarSeries) as TBarSeries do
begin
XLabelsSource:='LASTNAME';
DataSource:=ADOQuery1;
MultiBar:=mbStacked;
YValues.ValueSource:='SALARY';

Marks.Style:=smsValue;
end;

ADOQuery1.Open;
end;
</pre>

我在项目中对其进行了测试,并且可以正常工作。