2013-11-28 2 views
0

해당 시나리오에서 그리드의 레코드 기능을 직접 호출하지는 않았지만 "RecordIndex out of range"오류가 발생하여 DevExpress VCL 그리드에 문제가 있습니다.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 그리드 내부에서 무슨 일이 일어나는지는 확실하지 않습니다 ...) 나는 왜 그런 오류가 발생하는지 보지 못합니다.

아무도 무슨 일이 벌어 질 수 있는지에 대한 훌륭한 생각이 있습니까?

대단히 감사합니다!

+1

AFAICS이 방법은'TcxDBMemo' 구성 요소의'DataSource' 만 변경합니다. 범인은 다른 곳에 있어야하며 아마도 가장 중요한 사건 일 것이다. 그것을 디버깅하는 첫 번째 단계로서 나는 코드 시작과 끝에서 그리드의'view'에'BeginUpdate'와'EndUpdate'를 사용하려고합니다. –

+0

@GuillemVicens 당신은 절대적으로 옳았습니다. 위의 의견을 답으로 게시하여 솔루션으로 확인할 수 있습니까? 감사합니다. –

+0

확실합니다. 다행히 도울 수있어. :-) –

답변

0

AFAICS이 방법은 TcxDBMemo 구성 요소의 DataSource 만 변경합니다. 범인은 어딘가에 있어야하며 대체로 event 일 것입니다.

디버깅을위한 첫 단계로 코드의 시작과 끝에서 그리드보기에 BeginUpdateEndUpdate을 사용하려고합니다.

+0

이것이 나에게 트릭을 만들어 냈다. –