我遇到了DevExpress VCL網格問題,拋出了「RecordIndex超出範圍」錯誤,儘管沒有直接調用該場景中網格的任何記錄函數。RecordIndex超出範圍 - DevExpress
我在做的事情很簡單:一旦記錄被改變(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網格內,但...我不明白爲什麼我會得到這樣的錯誤。
有人對可能發生的事情有了一個絕妙的想法嗎?
非常感謝!
AFAICS此方法僅更改'TcxDBMemo'組件的'DataSource'。罪魁禍首必須在別處,最有可能是一些「事件」。作爲調試它的第一步,我會嘗試在代碼的開頭和結尾處的網格的'view'上使用'BeginUpdate'和'EndUpdate'。 –
@GuillemVicens你是對的。 您可以將上述評論作爲答案發布,以便我可以確認該解決方案嗎? 謝謝。 –
當然,只是做到了。很高興我能幫上忙。 :-) –