TChart:获取带有系列标题的标记样式及其值
TChart : Get mark style with series title together with its value
我有一个条形系列,我想在其中设置包含系列标题和条形实际值的标记样式。这是我的代码:
procedure TFRDept.PopulateDeptChart;
var
Loop ,YearIndex: integer;
DeptKey: String;
StartBar, TotalBar, EndBar : TBarSeries;
begin
for Loop := 0 to FDeptList.Count -1 do
begin
DeptKey := FDeptList.ValueFromIndex[Loop];
StartBar := GetInsertedBarSeries(DeptKey+'Start', 'Start', clGreen);
TotalBar := GetInsertedBarSeries(DeptKey+'Total', 'Total', clBlue);
EndBar := GetInsertedBarSeries(DeptKey+'End', 'End', clRed);
with Dataset do
begin
if Locate('o_deptaddressno',DeptKey,[]) then
begin
While (FieldByName('o_deptaddressno').AsString = DeptKey) and not eof do
begin
StartBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_totalstart').AsInteger,
FieldByName('o_year').AsString,
StartBar.Color);
{when adding series per year for each department - the bars are not one after the other}
//TotalBar := GetInsertedBarSeries(DeptKey+'Total'+FieldByName('o_year').AsString, siLang.GetTextOrDefault('IDS_TOTAL'), clBlue);
TotalBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_total').AsInteger,
FieldByName('o_year').AsString,
TotalBar.Color);
TotalBar.Title := FieldByName('o_total').AsString + ': '+ FDeptList.Names[Loop];
TotalBar.Marks.Style := smsSeriesTitle;
TotalBar.Marks.ArrowLength := 50;
TotalBar.Marks.Callout.ArrowHead := ahSolid;
EndBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_totalEnd').AsInteger,
FieldByName('o_year').AsString,
EndBar.Color);
Next;
end;
end;
end;
end;
SetSeriesLegendProperties;
end;
function TFRDept.GetInsertedBarSeries(aName, aTitle: String;
aColor: TColor): TBarSeries;
begin
Result := TBarSeries.Create(Self);
with Result do
begin
Name := 'Series' + aName;
Title := aTitle;
Color := aColor;
Marks.Style := smsValue;
end;
Chart1.AddSeries(Result);
end;
我的代码生成了以下条,但蓝色条的值未在标记中获得适当的值。
实际上,我的目标是在每个系列的条形图(红色、绿色和蓝色)上方显示相应的部门。我什至选择了另一种方法,尝试用 'symbols on draw' 修改图例,但事件没有触发。是否有可能在带有复选框的样式 lsSeriesGroups 的图例中显示符号?然后我还可以设置 Totalbar :
Marks.Symbol.Visible := True;
使用以下代码对我来说效果很好:
uses Series;
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i := 0 to 3 do
begin
Chart1.AddSeries(TBarSeries.Create(Self)).FillSampleValues();
Chart1[i].Marks.Style:=smsValue;
Chart1[i].Title:='Series'+IntToStr(i);
Chart1[i].OnGetMarkText := Series1GetMarkText;
end;
end;
procedure TForm1.Series1GetMarkText(Sender: TChartSeries;
ValueIndex: Integer; var MarkText: String);
begin
MarkText := MarkText + ' ' + Sender.Title;
end;
I even opted for an alternative way by trying to modify the legend
with 'symbols on draw' but the event didn't trigger.
是你暗杀的吗?例如:
Chart1.Legend.Symbol.OnDraw:=LegendDraw;
在 TeeChart 程序组的功能演示中 All Features\Welcome!\Miscellanoeus\Legend\Symbol OnDraw 中有一个完整的示例。
Is there a possibility to display the symbols in the legend of style
lsSeriesGroups with checkboxes? Then I could also set the Totalbar :
恐怕这不受支持。请随时在 Steema Software's bugzilla 添加您的功能请求。上面的代码片段为我生成了这张图表:
我有一个条形系列,我想在其中设置包含系列标题和条形实际值的标记样式。这是我的代码:
procedure TFRDept.PopulateDeptChart;
var
Loop ,YearIndex: integer;
DeptKey: String;
StartBar, TotalBar, EndBar : TBarSeries;
begin
for Loop := 0 to FDeptList.Count -1 do
begin
DeptKey := FDeptList.ValueFromIndex[Loop];
StartBar := GetInsertedBarSeries(DeptKey+'Start', 'Start', clGreen);
TotalBar := GetInsertedBarSeries(DeptKey+'Total', 'Total', clBlue);
EndBar := GetInsertedBarSeries(DeptKey+'End', 'End', clRed);
with Dataset do
begin
if Locate('o_deptaddressno',DeptKey,[]) then
begin
While (FieldByName('o_deptaddressno').AsString = DeptKey) and not eof do
begin
StartBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_totalstart').AsInteger,
FieldByName('o_year').AsString,
StartBar.Color);
{when adding series per year for each department - the bars are not one after the other}
//TotalBar := GetInsertedBarSeries(DeptKey+'Total'+FieldByName('o_year').AsString, siLang.GetTextOrDefault('IDS_TOTAL'), clBlue);
TotalBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_total').AsInteger,
FieldByName('o_year').AsString,
TotalBar.Color);
TotalBar.Title := FieldByName('o_total').AsString + ': '+ FDeptList.Names[Loop];
TotalBar.Marks.Style := smsSeriesTitle;
TotalBar.Marks.ArrowLength := 50;
TotalBar.Marks.Callout.ArrowHead := ahSolid;
EndBar.AddXY(FieldByName('o_year').AsInteger,
FieldByName('o_totalEnd').AsInteger,
FieldByName('o_year').AsString,
EndBar.Color);
Next;
end;
end;
end;
end;
SetSeriesLegendProperties;
end;
function TFRDept.GetInsertedBarSeries(aName, aTitle: String;
aColor: TColor): TBarSeries;
begin
Result := TBarSeries.Create(Self);
with Result do
begin
Name := 'Series' + aName;
Title := aTitle;
Color := aColor;
Marks.Style := smsValue;
end;
Chart1.AddSeries(Result);
end;
我的代码生成了以下条,但蓝色条的值未在标记中获得适当的值。
Marks.Symbol.Visible := True;
使用以下代码对我来说效果很好:
uses Series;
procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
for i := 0 to 3 do
begin
Chart1.AddSeries(TBarSeries.Create(Self)).FillSampleValues();
Chart1[i].Marks.Style:=smsValue;
Chart1[i].Title:='Series'+IntToStr(i);
Chart1[i].OnGetMarkText := Series1GetMarkText;
end;
end;
procedure TForm1.Series1GetMarkText(Sender: TChartSeries;
ValueIndex: Integer; var MarkText: String);
begin
MarkText := MarkText + ' ' + Sender.Title;
end;
I even opted for an alternative way by trying to modify the legend with 'symbols on draw' but the event didn't trigger.
是你暗杀的吗?例如:
Chart1.Legend.Symbol.OnDraw:=LegendDraw;
在 TeeChart 程序组的功能演示中 All Features\Welcome!\Miscellanoeus\Legend\Symbol OnDraw 中有一个完整的示例。
Is there a possibility to display the symbols in the legend of style lsSeriesGroups with checkboxes? Then I could also set the Totalbar :
恐怕这不受支持。请随时在 Steema Software's bugzilla 添加您的功能请求。上面的代码片段为我生成了这张图表: