Delphi 11 VCL TChart横轴未使用X参数问题求助
Delphi 11 VCL TChart 横轴X参数未生效、条形位置异常的解决方法
核心问题分析
- 每次调用
AddOneDay都新建3个TBarSeries,7天共生成21个系列,图表横轴会自动按系列索引生成,完全忽略你设置的X参数。 StackGroup逻辑错误:你希望同天的三个条形堆叠,但当前将每个系列的StackGroup设为nDay,导致同天的三个系列各自独立(每个系列仅一个数据点,无实际堆叠效果),同时多系列的存在彻底打乱了横轴的X轴配置。
修复步骤
- 固定系列,避免重复创建:提前创建3个对应Success、Alerts、Errors的
TBarSeries,而非每次循环都新建。 - 统一StackGroup实现堆叠:将三个系列的
StackGroup设为同一个值(比如0),实现同X值下的条形堆叠。 - 定向添加数据:在
AddOneDay中直接给已有的三个系列添加数据点。 - 自定义横轴标签:手动配置横轴标签为"Day-1"等文本,确保显示符合预期。
修复后的完整代码
procedure TForm1.FormShow(Sender: TObject); var SuccessSeries: TBarSeries; AlertsSeries: TBarSeries; ErrorsSeries: TBarSeries; procedure AddOneDay(nDay,nVal1,nVal2,nVal3:Integer;wTitle:String) ; begin // 给对应系列添加指定X值的数据点 SuccessSeries.AddXY((nDay-1)*10, nVal1, wTitle, $00615CFC); AlertsSeries.AddXY((nDay-1)*10, nVal2, wTitle, $00ECC2AA); ErrorsSeries.AddXY((nDay-1)*10, nVal3, wTitle, $0086F76F); end; begin FChart.SeriesList.Clear; // 初始化三个固定系列 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; // 设置图例文本 SuccessSeries.Legend.Text := 'Success'; AlertsSeries.Legend.Text := 'Alerts'; ErrorsSeries.Legend.Text := 'Errors'; // 统一StackGroup值,实现同X点的条形堆叠 SuccessSeries.StackGroup := 0; AlertsSeries.StackGroup := 0; ErrorsSeries.StackGroup := 0; SuccessSeries.Transparency := 30; AlertsSeries.Transparency := 30; ErrorsSeries.Transparency := 30; // 配置图表标题 with FChart.Title do begin Font.Size := 15; Font.Color := clBlack; Text.Text := 'Performance Chart'; end; // 配置横轴显示自定义标签 with FChart.Axes.Bottom do begin // 手动添加横轴标签,确保显示Day-1到Day-7 Labels.Clear; Labels.Add('Day-1'); Labels.Add('Day-2'); Labels.Add('Day-3'); Labels.Add('Day-4'); Labels.Add('Day-5'); Labels.Add('Day-6'); Labels.Add('Day-7'); Title.Text := 'Days'; // 若需匹配X值范围,可手动设置轴范围 // Minimum := 0; // Maximum := 60; end; // 添加7天数据 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;
额外说明
- 手动添加横轴标签可以完全控制显示文本,不受X值数值影响;若希望标签与X值自动关联,可将
LabelsStyle设为lsLabel,利用数据点的Label属性。 - 复用系列不仅解决了横轴异常问题,还能减少内存开销,提升图表渲染效率。
内容的提问来源于stack exchange,提问作者Seekr
相关产品推荐
相关产品推荐

