Как отобразить правильную метку оси X (нижняя ось) из источника данных с помощью Teechart (Delphi)
Я хотел бы попросить некоторую помощь по отображению имени клиента моего источника данных в нижней части моей гистограммы с накоплением. Из всех примеров, которые я исследовал, видно, что метка оси нижнего графика "TeeChart" устанавливает "автоматически", просматривая источник данных. Однако я не могу заставить его работать. Ниже картина того, чего я пытаюсь достичь.
Картина того, чего я пытаюсь достичь
У меня есть три серии, которые я использую для построения диаграммы с накоплением. Я включил изображение каждого источника данных, который я использую для каждого запроса.
Источники данных для запросов трех серий
Из моего исследования кажется, что я также могу использовать DBChart1GetAxisLabel()
чтобы настроить ярлыки. Но я изо всех сил пытаюсь понять, как гарантировать, что правильное имя пользовательской метки связано с правильным "именем клиента" из моих запросов.
Вот пример кода того, как я строю диаграммы:
процедура TfrmSupplierAnalytics.btnOKClick(Отправитель: TObject); var S,NewTypeStr, test, clientSql: строка; var seriasNormalOrders:TBarSeries; var seriasCreditNoteOrders:TBarSeries; var seriasPartialOrders:TBarSeries; N, i: целое число; begin qCreditNoteOrders.Close; qNormalOrders.Close; qPartialOrders.Close; qGetClientIdFromName.Close; qClients.Close; DBChart1.CleanupInstance; DBChart1.ClearChart; попробуйте N:= 0 для clbClients.Items.Count-1, если clbClients.State[N] = cbChecked, затем начните тест:= string(clbClients.Items[N]); NewTypeStr:= NewTypeStr + '(E.clientid = '+ IntToStr(FindClientID(test)) + ')'; clientSql:= clientSql + NewTypeStr; NewTypeStr:= ' or '; конец; кроме E: Exception do ShowMessage(ошибка E.ClassName+'с сообщением: '+E.Message); конец; 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:= 'Правильные заказы'; seriasNormalOrders.Marks.Visible:= True; seriasNormalOrders.Marks.AutoPosition:= true; seriasCreditNoteOrders.YValues.ValueSource:= 'CreditNoteOrders'; seriasCreditNoteOrders.DataSource:= qCreditNoteOrders; seriasCreditNoteOrders.Title:= 'Заказы по кредитным нотам'; seriasPartialOrders.YValues.ValueSource:= 'PartialOrders'; seriasPartialOrders.DataSource:= qPartialOrders; seriasPartialOrders.Title:= 'Короткие заказы'; seriasNormalOrders.CheckDataSource; seriasCreditNoteOrders.CheckDataSource; seriasPartialOrders.CheckDataSource; конец;
Итак, просто для подведения итогов, есть ли в моем коде какие-то настройки, которые мне не хватает, которые будут показывать "имя клиента" под каждым столбцом с накоплением, или я должен использовать пользовательские метки? Если мне нужно использовать пользовательские метки, я был бы признателен за некоторые указания о том, как обеспечить замену правильного "имени клиента" из источника данных на правильное ValueIndex
в DBChart1GetAxisLabel
?
Заранее спасибо.
1 ответ
Мне удалось получить ответ.
Вы можете настроить XLabelsSource для отображения текста из DataSource, а затем установить для ряда 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>
Я проверил это в моем проекте, и он работает.