我遇到了 DevExpress VCL 网格的问题,抛出“RecordIndex out of range”错误,尽管在那种情况下没有直接调用网格的任何记录函数。
我正在做的事情相当简单:一旦更改记录(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 网格内部发生了什么......)而且我不明白为什么我会收到这样的错误。
有人对可能发生的事情有一个绝妙的主意吗?
非常感谢!