【发布时间】:2014-10-23 03:04:53
【问题描述】:
我有在运行时为数字列创建摘要页脚的代码,但我无法显示组摘要结果。我查看了 How to create group summaries at runtime 和 How to set group summary values 和 How can create summary footer on runtime? 但我遇到了运行时错误:
带有消息“记录索引超出范围”的 EcxInvalidDataControllerOperation
当网格渲染时。
此代码接受任何 TcxGridDBTableView,因此很容易放入现有的 Delphi 表单中。
procedure SummaryGroup(ASummary: TcxDataSummary; AColumn: TcxGridDBColumn;
AKind: TcxSummaryKind; AFormat: string);
var
sumGroup: TcxDataSummaryGroup;
link: TcxGridTableSummaryGroupItemLink; //TcxDataSummaryGroupItemLink;
item: TcxGridDBTableSummaryItem;
begin
AColumn.Summary.FooterKind := AKind;
AColumn.Summary.FooterFormat := AFormat;
sumGroup := ASummary.SummaryGroups.Add;
link := sumGroup.Links.Add as TcxGridTableSummaryGroupItemLink;
link.Column := AColumn;
item := sumGroup.SummaryItems.Add as TcxGridDBTableSummaryItem;
item.Column := AColumn;
item.Kind := AKind;
item.Position := spGroup;
item.Format := AColumn.Summary.FooterFormat;
end;
procedure AutoAwesum(AView: TcxGridDBTableView);
var
summary: TcxDataSummary;
summing: Boolean;
i: Integer;
dc: TcxGridDBDataController;
col: TcxGridDBColumn;
begin
dc := AView.DataController;
summing := False;
summary := dc.Summary;
summary.BeginUpdate;
try
summary.SummaryGroups.Clear;
dc.BeginFullUpdate;
try
dc.GridView.ClearItems;
dc.CreateAllItems;
for i := 1 to AView.ColumnCount - 1 do
begin
col := AView.Columns[i];
case col.DataBinding.Field.DataType of
ftSmallint, ftInteger, ftWord, ftLargeint, ftAutoInc,
ftLongWord, ftShortint:
begin
summing := true;
SummaryGroup(summary, col, skSum, '#');
end;
ftFloat, ftBCD, ftFMTBcd, ftExtended, ftSingle:
begin
summing := true;
SummaryGroup(summary, col, skSum, '#.##');
end;
ftCurrency:
begin
summing := true;
SummaryGroup(summary, col, skSum, '$#.##');
end;
end;
end;
dc.DataModeController.GridMode := not summing;
AView.OptionsView.Footer := summing;
AView.OptionsView.GroupFooterMultiSummaries := summing;
AView.OptionsView.GroupFooters := gfVisibleWhenExpanded;
finally
dc.EndFullUpdate;
end;
finally
summary.EndUpdate;
end;
end;
我错过了什么?谢谢。
【问题讨论】:
-
哪一行产生了异常?
-
我的代码中没有发生这种情况。它在 cxGrid 运行时中,在 TcxCustomDataController.CheckRecordRange 上。
-
然后查看堆栈跟踪,找出在您的代码中触发异常的位置。如果异常确实无法追溯到您自己的代码,那么您需要向供应商提交错误报告。
-
感谢您的回复,肯。正如我在最初的问题中所说,在渲染网格时会发生错误。这是在我的代码在网格上设置属性之后(没有错误)。我希望通过提供适用于任何 TcxGrid 的完整通用代码,我可以获得关于可能缺少网格的哪些属性的特定指针,而不是关于如何在 Delphi 中调试问题的一般建议。
-
嗯。好的,但这似乎又是应该在供应商论坛上提出的问题(这不是 Developers Express 组件吗?)而不是在这里。如果没有使用该组件的代码,很难调试第三方供应商的组件,除非您非常熟悉该组件的内部工作原理。您能否提供一个在运行时设置产生错误的属性的 MVCE?或者包含来自 DFM 的文本,该文本将属性设置为您拥有的属性?