我遇到了DevExpress VCL网格的问题,抛出了“RecordIndex超出范围”的错误,尽管在这种情况下没有直接调用网格的任何记录功能。
我正在做的很简单:一旦记录被更改(AfterScroll),就会调用一个方法。在这个方法中,我调用另一个方法,根据新记录中的字段分配数据源和数据名称。
代码很简单,就像这样:
procedure TValidatedOrders.UpdateDispenseNotes;
var Dataset : TDataSet;
GroupTypeFieldName : String;
DataSource : TDataSource;
DataFieldName : String;
GroupType : Integer;
procedure SetSpecsDataSource;
begin
DataSource := DMValidatedDispense.DSDispenseGroupSpecs;
DataFieldName := 'GLAZING_INSTRUCTIONS';
end;
procedure SetCLsDataSource;
begin
DataSource := DMValidatedDispense.DSDispenseGroupCLs;
DataFieldName := 'WEAR_INSTRUCTIONS';
end;
begin
// Step 1: Get the group type
If GetTopPage = cTopPageOrders Then
Dataset := DMValidatedDispense.CDSLabOrders
Else
Dataset := DMValidatedDispense.CDSLabDispenses;
GroupType := Dataset.FieldByName( 'GROUP_TYPE' ).AsInteger;
// Step 2: Assign the MemoDispenseNotes data binding appropriately
If GetTopPage = cTopPageOrders Then
Begin
case GroupType of
cOrderGroupSpecs, cOrderGroupFrame,
cOrderGroupLens, cOrderGroupGlazing: SetSpecsDataSource;
cOrderGroupCLs: SetCLsDataSource;
else SetSpecsDataSource;
end;
End
Else
Begin
case GroupType of
cDispenseGroupSpecs: SetSpecsDataSource;
cDispenseGroupCLs: SetCLsDataSource;
else SetSpecsDataSource;
end;
End;
MemoDispenseNotes.DataBinding.DataSource := DataSource;
MemoDispenseNotes.DataBinding.DataField := DataFieldName;
end;
调用上述方法的原始代码在这里报告的时间太长,无论如何它包含面板显示/隐藏,类型.FieldByName('GROUP_TYPE').AsInteger = SomeValue等等的检查:有没有定位,没有FindKey或类似的东西。
正如我所说,没有直接涉及的记录选择(虽然不确定DevExpress网格内部发生了什么......)但我不明白为什么会出现这样的错误。
任何人都对可能发生的事情有了明确的想法?
非常感谢!
答案 0 :(得分:0)
AFAICS此方法仅更改DataSource
组件的TcxDBMemo
。罪魁祸首必须在其他地方,很可能是一些event
。
作为调试它的第一步,我会尝试在代码开头和结尾的网格视图中使用BeginUpdate
和EndUpdate
。